如何使用 'auto' 关键字遍历 C++ STL 映射数据结构?
How to iterate over a C++ STL map data structure using the 'auto' keyword?
到目前为止,我一直使用迭代器遍历STL映射中的所有键,如下所示:
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it){
std::cout << it->first << " => " << it->second << 'n';
}
最近,尽管我遇到了一些使用不同样式来迭代键的代码,如下所示。此功能是否最近才在修订版标准中添加?这似乎是一种相当有趣的方法,可以用更少的代码完成更多工作,因为许多其他语言已经提供了。
for (auto& x: mymap) {
std::cout << x.first << " => " << x.second << 'n';
}
另外,我很想知道在这里使用关键字"auto"的确切含义。
此代码使用 C++11 标准中的 2 个新功能,自动关键字,用于类型推断,以及基于范围 for 循环。
仅使用auto
就可以将其写成(谢谢本)
for (auto it=mymap.begin(); it!=mymap.end(); ++it)
仅使用范围可以写为
for (std::pair<const char,int>& x: mymap) {
std::cout << x.first << " => " << x.second << 'n';
}
这两个版本执行的任务与两个版本完全相同。
除了前面的答案之外,C++17 还添加了另一种使用结构化绑定的方法:
for (auto& [key, value]: mymap) {
std::cout << key << " => " << value << 'n';
}
以下内容对我有用:
for (auto x: mymap) {
cout << x.first << endl;
}
我很想知道在这里使用关键字"auto"的确切含义。
它支持:
- 减少典型迭代代码的键入
- 减少手动错误的可能性,因为编译器会推断出迭代器的确切类型。
C++11 的新功能,它被称为 Range-Based for Loops
,它迭代给定范围、数组或集合的所有元素。这就是在其他编程语言中称为foreach循环的一般语法如下:
for ( decl : coll ) {
statement
}
自动:自动类型推断与自动
使用 C++11,您可以声明变量或对象,而无需指定其特定类型,例如:
auto i = 42; // i has type int
double f();
auto d = f(); // d has type double
for (auto& x: mymap) {
std::cout << x.first << " => " << x.second << 'n';
}
在这段代码中,基本上使用了两件事——
第一个 - 自动关键字:
auto 关键字指定要声明的变量的类型将自动从其初始值设定项中扣除。
当我们不确定要处理的变量类型时,我们可以使用 auto 关键字,并可用于迭代地图、使用 auto 变量或迭代器列出,其中我们不知道 map、list 等中存在的元素类型。
第二个 - 基于范围的循环-这种形式的 for 循环称为"基于范围的 for",将迭代代码中给出的映射中的每个元素。
所以在我们的代码中 -我们正在迭代我们的地图,通过使用 auto 我们不知道其元素值类型,在这里我们不需要知道提供给我们的地图的大小,因为我们使用了基于范围的循环,借助它我们将迭代映射中存在的每个元素。
- STL映射比较器能否以某种方式获取指向映射本身的指针?
- 在 c++ stl 映射中,删除具有重复值的条目
- C++ STL 映射同时更新所有值
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- 无法将元素添加到 STL 映射
- 为什么不能在STL映射中插入值
- 在 stl 映射和列表 (c++) 上进行迭代的泛型循环
- 未签名的char数组到stl ::映射或其他容器中的键
- 整数和元组的静态 STL 映射返回 0
- 指向类的指针的 STL 映射的 SWIG 类型图
- 将 STL 映射存储到 Boost ConstBufferSequence 中
- 如何在下一次函数调用中使用 STL 映射擦除从最后一个位置
- 如何使用密钥 2 更新 STL 映射键 1 并将值复制到键 2 中
- 为什么当代码尝试在 STL 映射中查找键时出现分段错误
- 快速插入STL映射
- C STL映射中的SegFault由于过程退出期间的静态可变清理而找到
- 如何将 STL 映射保存到文件C++
- C++STL映射键和值工作不正常
- STL 映射自定义比较器
- 带有内存比较的 STL 映射.如何在运行时设置比较块大小