保研机试算法训练个人记录笔记(三)
目录
基于范围的for循环
push_back
return {it->second, i}
基于范围的for循环
for (const string& ageValue : age["Peter"])
是C++中的一种范围基于的for循环(也称为基于范围的for循环),它用于遍历容器中的元素。在这个特定的例子中,它遍历的是与键 "Peter"
相关联的 unordered_map
中的 vector<string>
。具体来说:
-
age["Peter"]
访问unordered_map
名为age
的元素,键为"Peter"
。这个元素是一个vector<string>
。 -
for (const string& ageValue : age["Peter"]) {
循环迭代age["Peter"]
中的每个string
元素。const string& ageValue
声明了一个对容器中元素的引用,这意味着在循环过程中不会创建这些字符串的副本,这样可以提高效率。同时,const
表明这些字符串在循环过程中是不可修改的,保护了数据不被更改。:
后面的age["Peter"]
指定了要遍历的范围。
-
循环体(在
{
和}
之间)对age["Peter"]
中的每个string
元素执行一次,每个元素都可以通过ageValue
来访问。
总结来说,这段代码用于遍历与键 "Peter"
关联的 vector<string>
中的每个字符串,每个字符串在循环体内通过 ageValue
引用访问。由于使用了 const
和引用,这个过程是高效且安全的。
push_back
在C++中,push_back
是 vector
容器的一个成员函数,用于在向量的末尾添加一个新元素。当你使用 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
通常效率较高,但如果频繁调用且向量经常需要扩容,可能会引发额外的内存分配和元素复制。为了优化性能,如果你提前知道大致的元素数量,可以使用 vector
的 reserve
方法预先分配足够的空间。
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
。