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

目录

基于范围的for循环 

push_back

return {it->second, i}


基于范围的for循环 

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

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

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

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

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

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

push_back

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

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

std::vector 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,其中Key是键的类型,T是值的类型。在您的代码中,unordered_map定义了一个哈希表,其键和值都是整数类型。

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

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

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

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

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

你可能感兴趣的:(C++,保研机试,算法,笔记)