44

到目前为止,我一直使用迭代器来遍历 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”的确切含义。

4

6 回答 6

49

此代码使用 C++11 标准中的两个新功能auto 关键字、for type inferencerange based for loop

仅使用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';
}  

这两个版本的任务与您的两个版本完全相同。

于 2013-01-28T05:07:40.537 回答
26

除了前面的答案,C++17 还添加了另一种使用结构化绑定的方法:

for (auto& [key, value]: mymap) {
        std::cout << key << " => " << value << '\n';
} 
于 2017-07-23T18:34:35.077 回答
16

以下对我有用:

for (auto x: mymap) {
  cout << x.first << endl;
}
于 2013-12-31T16:28:27.847 回答
4

我很想知道在这里使用关键字“auto”的确切含义。

它能够:

  • 减少典型迭代代码的输入
  • 由于编译器推断出迭代器的确切类型,因此手动错误的可能性较小。
于 2013-01-28T05:10:23.697 回答
3

它是 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
于 2013-01-28T05:09:06.263 回答
0
for (auto& x: mymap) {
        std::cout << x.first << " => " << x.second << '\n';
}  

在这段代码中,基本上使用了两件事 -

首先 - auto 关键字:

auto 关键字指定正在声明的变量的类型将自动从其初始化程序中扣除。

当我们不确定要处理的变量的类型时,我们可以使用 auto 关键字,并且可以用于迭代地图、使用自动变量或迭代器的列表,其中我们不知道其中存在的元素类型内部地图,列表等

第二 - 基于范围的循环 - 这种形式的 for 循环称为“基于范围的 for”,将遍历代码中给出的映射中的每个元素。

所以在我们的代码中 - 我们正在迭代我们的地图,其元素值类型我们不知道使用 auto 在这里我们不需要知道提供给我们的地图的大小,因为我们使用了基于范围的循环,我们将借助它遍历地图中存在的每个元素。

于 2021-09-06T08:38:21.650 回答