迭代C++ STL地图数据结构:新技术?(迭代范围和'auto'关键字)

KT1*_*100 28 c++ stl map c++11

到目前为止,我总是使用迭代器遍历STL映射中的所有键,如下所示:

    for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it){
            std::cout << it->first << "  => " << it->second << '\n';
    }
Run Code Online (Sandbox Code Playgroud)

最近虽然我遇到了一些使用不同样式来迭代键的代码,如下所示.此功能是否仅在最近修订后的标准中添加?与许多其他语言已经提供的一样,这似乎是一种使用较少代码完成更多工作的相当有趣的方式.

    for (auto& x: mymap) {
            std::cout << x.first << " => " << x.second << '\n';
    }  
Run Code Online (Sandbox Code Playgroud)

此外,我很想知道在这里使用关键字"auto"的确切含义.

Kar*_*k T 34

此代码使用最新C++标准(C++ 11)中的2个新功能auto关键字,用于类型推断,以及基于for循环范围.

使用auto这个就可以写成(感谢Ben)

for (auto it=mymap.begin(); it!=mymap.end(); ++it)
Run Code Online (Sandbox Code Playgroud)

只使用范围可以写成

for (std::pair<const char,int>& x: mymap) {
        std::cout << x.first << " => " << x.second << '\n';
}  
Run Code Online (Sandbox Code Playgroud)

这两个版本都完成了与两个版本完全相同的任务.

  • 你不需要输入那么多.使用较少的样板,代码应该更易读. (3认同)

mcs*_*vio 13

以下对我有用:

for (auto x: mymap) {
  cout << x.first << endl;
}
Run Code Online (Sandbox Code Playgroud)

  • 这样就可以复制所有元素,但实际上并没有回答海报提出的问题. (7认同)

Bos*_*ash 13

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

for (auto& [key, value]: mymap) {
        std::cout << key << " => " << value << '\n';
} 
Run Code Online (Sandbox Code Playgroud)


Alo*_*ave 5

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

它可以:

  • 减少典型迭代代码的输入量
  • 手动错误的可能性较小,因为编译器会推断出迭代器的确切类型。