到目前为止,我一直使用迭代器来遍历 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 个新功能:auto 关键字,用于类型推断,以及基于范围的 for 循环。
仅使用
auto
这可以写成(谢谢 Ben)
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
}
Auto:使用 auto
自动类型推导使用 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 关键字,并且可以使用 auto 变量或迭代器来迭代映射、列表,其中我们不知道元素类型存在于地图、列表等中
第二个 - 基于范围的循环 - 这种形式的 for 循环称为“基于范围的 for”,将迭代代码中给出的映射中的每个元素。
所以在我们的代码中 - 我们正在迭代我们的映射,其元素值类型我们通过使用 auto 不知道,在这里我们不需要知道提供给我们的映射的大小,因为我们使用了基于范围的循环,借助它我们将迭代存在的每个元素在地图上。