遍历无序映射 C++

Posted

技术标签:

【中文标题】遍历无序映射 C++【英文标题】:Iterate through unordered map C++ 【发布时间】:2014-04-05 11:42:58 【问题描述】:

我已经编写了一个程序,它会读取输入,直到你点击“,”——输入处的昏迷。然后它会计算你输入的字母数量,

我想遍历这张地图,但它说 it 不能在没有类型的情况下定义:

#include <iostream>
#include <conio.h>
#include <ctype.h>

#include <iostream>
#include <string>
#include <tr1/unordered_map>
using namespace std;

int main()
    cout<<"Type '.' when finished typing keys: "<<endl;
    char ch;
    int n = 128;
    std::tr1::unordered_map <char, int> map;


    do
      ch = _getch();
    cout<<ch;
      if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
            map[ch] = map[ch] + 1;
      
     while( ch != '.' );

    cout<<endl;

    for ( auto it = map.begin(); it != map.end(); ++it ) //ERROR HERE
        std::cout << " " << it->first << ":" << it->second;


    return 0;

【问题讨论】:

你是用-std=c++11编译的吗? auto 是 C++11 特性。 另外,请避免混淆,不要将您的对象命名为 STL 类型,例如将map 重命名为aMap 【参考方案1】:

使用 C++17,您可以使用更短、更智能的版本,如下面的代码所示:

unordered_map<string, string> map;
map["hello"] = "world";
map["black"] = "mesa";
map["umbrella"] = "corporation";
for (const auto & [ key, value ] : map) 
    cout << key << ": " << value << endl;

【讨论】:

为什么没有统一的初始化和推导:coliru.stacked-crooked.com/a/876ab2ba7e8473b1【参考方案2】:

您正在使用auto,因此您拥有C++11 代码。您需要符合 C++11 的编译器(例如 GCC 4.8.2 或更高版本)。 正如Peter G. 评论的那样,不要将变量命名为map(即std::map),而是例如mymap 所以请

#include <unordered_map>

(不需要tr1!)

然后使用g++ -std=c++11 -Wall -g yoursource.cc -o yourprog 编译并编码range based for loop

for (auto it : mymap) 
    std::cout << " " << it.first << ":" << it.second << std::endl;

【讨论】:

最后一个语句应该是 it.first 而不是 it->first。 它是 it.firstit.second,因为迭代器会自动为您取消引用 如果您不想复制值,请使用auto&amp; it【参考方案3】:

如果您想使用 auto(和其他 C++11 功能),请将 -std=c++11 添加到您的编译器标志(使用 gcc/icc/clang)。顺便说一句,unordered_map 在 C++11 中的 std 中...还有std::isalpha ...

【讨论】:

【参考方案4】:

根据 Dorin Lazăr 的回答,另一种可能的解决方案是:

unordered_map<string, string> my_map;
my_map["asd"] = "123";
my_map["asdasd"] = "123123";
my_map["aaa"] = "bbb";
for (const auto &element : my_map) 
    cout << element.first << ": " << element.second << endl;

【讨论】:

您需要将更多的map 名称更改为my_map 抱歉,现在修复它。

以上是关于遍历无序映射 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用具有无序映射的模板类型

为啥在将唯一指针插入无序映射时 C++ 会给我一个错误?

c ++为几个无序映射运行循环

我们如何在 C++ 中的无序映射中分配变量并更新它们?

如何将字符串添加到 C++ 中无序映射中的字符串向量

如何迭代无序映射特定键值?