保研机试算法训练个人记录笔记(三)

本文详细解释了C++中基于范围的for循环如何遍历unordered_map,重点讲解了push_back在vector中的应用以及迭代器it->second的含义。同时,讨论了如何通过计算索引来获取数组的中间值,如x=q[l+r>>1]在分治算法中的作用。
摘要由CSDN通过智能技术生成

目录

基于范围的for循环 

push_back

return {it->second, i}

x = q[l + r >> 1]


基于范围的for循环 

for (const string& ageValue : age["Peter"])

 是C++中的一种范围基于的for循环(也称为基于范围的for循环),它用于遍历容器中的元素。在这个特定的例子中,它遍历的是与键 "Peter" 相关联的 unordered_map 中的 vector<string>。具体来说:

  1. age["Peter"] 访问 unordered_map 名为 age 的元素,键为 "Peter"。这个元素是一个 vector<string>

  2. for (const string& ageValue : age["Peter"]) { 循环迭代 age["Peter"] 中的每个 string 元素。

    • const string& ageValue 声明了一个对容器中元素的引用,这意味着在循环过程中不会创建这些字符串的副本,这样可以提高效率。同时,const 表明这些字符串在循环过程中是不可修改的,保护了数据不被更改。
    • : 后面的 age["Peter"] 指定了要遍历的范围。
  3. 循环体(在 {} 之间)对 age["Peter"] 中的每个 string 元素执行一次,每个元素都可以通过 ageValue 来访问。

总结来说,这段代码用于遍历与键 "Peter" 关联的 vector<string> 中的每个字符串,每个字符串在循环体内通过 ageValue 引用访问。由于使用了 const 和引用,这个过程是高效且安全的。

push_back

在C++中,push_backvector 容器的一个成员函数,用于在向量的末尾添加一个新元素。当你使用 push_back 时,向量的大小会自动增加一个单位,新元素会添加到向量的现有元素之后。

以下是 push_back 方法的基本用法:

std::vector<int> vec; // 声明一个int类型的向量vec
vec.push_back(10); // 在vec的末尾添加元素10
vec.push_back(20); // 在vec的末尾再添加元素20

在这个例子中,vec 最初是空的。调用 vec.push_back(10); 后,vec 包含一个元素 [10]。调用 vec.push_back(20); 后,vec 包含两个元素 [10, 20]

push_back 是一种常用的操作,特别是当你需要动态地构建一个列表时,它非常有用。例如,在处理输入数据或构建结果列表时,你可能会不知道需要多少元素,push_back 允许你根据需要添加元素。

需要注意的是,虽然 push_back 通常效率较高,但如果频繁调用且向量经常需要扩容,可能会引发额外的内存分配和元素复制。为了优化性能,如果你提前知道大致的元素数量,可以使用 vectorreserve 方法预先分配足够的空间。

return {it->second, i}

在C++的unordered_map数据结构中,每个元素都是一个键值对,通常表示为pair<const Key, T>,其中Key是键的类型,T是值的类型。在您的代码中,unordered_map<int, int>定义了一个哈希表,其键和值都是整数类型。

当您访问哈希表中的元素时,每个元素都是一个pair,其中包含两个部分:

  • first:这是键的部分,在您的代码中,它是nums数组中的数字。
  • second:这是值的部分,在您的代码中,它是与键(数组中的某个数字)相对应的索引。

因此,在表达式 it->second 中:

  • it 是指向哈希表中某个元素的迭代器。
  • -> 是C++中用于通过指针访问结构体或联合体成员的操作符。
  • second 访问的是迭代器指向的键值对中的“值”部分,在您的代码中,这个值是数组中具有特定数字的元素的索引。

所以,在 return {it->second, i}; 这行代码中,it->second 表示的是在哈希表中找到的与 target - nums[i] 相对应的数字的索引,而 i 表示的是当前数字的索引。这两个索引一起被返回,代表数组中这两个数字的位置,它们的和等于目标值 target

x = q[l + r >> 1]

x = q[l + r >> 1];//取中间值;>> 1相当于除以2
  • q 是一个数组或列表,用于存储元素。
  • lr 通常代表索引,分别表示数组或列表的左端点和右端点。在计算机科学中,这种表示方法常用于分而治之的算法,比如快速排序或二分查找中。
  • l + r 是将左端点索引 l 和右端点索引 r 相加。
  • >> 1 是位运算中的右移操作,相当于除以2的操作,用于计算 l + r 的中点。这是因为在二进制中右移一位等同于整数除以2。
  • q[l + r >> 1] 表示访问数组或列表 q 中索引为 (l + r) >> 1 的元素,并将其值赋给变量 x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值