遍历无序映射 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.first
和 it.second
,因为迭代器会自动为您取消引用
如果您不想复制值,请使用auto& 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++的主要内容,如果未能解决你的问题,请参考以下文章