【问题标题】:How to iterate over a C++ STL map data structure using the 'auto' keyword?如何使用“auto”关键字迭代 C++ STL 映射数据结构?
【发布时间】:2013-01-11 10:05:38
【问题描述】:

到目前为止,我一直使用迭代器来遍历 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++ dictionary c++11 stl auto


    【解决方案1】:

    此代码使用来自 C++11 标准的 2 个新功能 auto keyword, 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';
    }  
    

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

    【讨论】:

    • 中间版本是for (auto it=mymap.begin(); it!=mymap.end(); ++it)
    • 在这里使用'auto'有什么好处?
    • 您不需要输入那么多。使用更少的样板,代码应该变得更具可读性。
    • @KT100 基本上在语句auto it=mymap.begin() 处,编译器会自动推断itmymap 的迭代器类型并设置适当的类型,而无需您弄清楚并输入它.
    • @KT100 这是auto 优势的一个很好的例子:P 我不会搞砸的。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      以下内容对我有用:

      for (auto x: mymap) {
        cout << x.first << endl;
      }
      

      【讨论】:

      • 这会复制所有元素,实际上并没有回答发布者提出的问题。
      【解决方案4】:

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

      它启用:

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

      【讨论】:

      【解决方案5】:

      这是 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
      

      【讨论】:

      【解决方案6】:
      for (auto& x: mymap) {
              std::cout << x.first << " => " << x.second << '\n';
      }  
      

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

      第一个 - 自动关键字:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-09-27
        • 2011-05-29
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 2016-08-06
        • 2011-05-11
        • 1970-01-01
        相关资源
        最近更新 更多