我有一个std :: map mymap
现在,如果我在地图中插入值,如:
std::map <string, string> mymap;
mymap["first"] = "hi";
mymap["third"] = "how r you";
mymap["second"] = "hello";
现在我想迭代地图并以排序(键)方式打印值:
map<string, string>::iterator itr;
for(itr = mymap.begin(); itr != mymap.end(); itr++)
{
string newline = itr->second;
cout << newline << endl;
}
输出应为:
hi
hello
how r you
我认为默认情况下映射存储按排序键方式存储,但我输出的输出顺序与输入相同。我需要为此提供我的排序功能,还是需要在迭代地图之前做一些额外的事情?
答案 0 :(得分:24)
std::map
中的元素按照operator<
的顺序排列(默认情况下)。
您发布的代码经过了少量修改后,按照您的预期为我工作:
std::map <string, string> mymap;
mymap["first"]="hi";
mymap["third"]="how r you";
mymap["second"]="hello";
for (std::map<string, string>::iterator i = mymap.begin(); i != mymap.end(); i++)
{
cout << i->second << "\n";
}
打印:
hi
hello
how r you
答案 1 :(得分:4)
map
实际上是tree,按KEY顺序排序。您正在打印itr->second
,这是VALUE而不是KEY。如果您希望键值/值对按VALUE排序,请使用VALUE作为键,或将所有内容存储在另一个容器(例如数组)中,然后对它们进行排序。
答案 2 :(得分:3)
std :: map已订购。如果您使用的是unordered_map,那么现在您遇到了问题!
std :: map中的条目按键排序,或者首先是itr-&gt;。 itr-&gt;第二个,就像你拥有它一样,指的是与密钥相关的值。
此外,你没有迭代地图,你正在迭代file_line(我不知道那是什么,但我会假设它与mymap不同。那就是你应该迭代的结束)。
答案 3 :(得分:1)
标准定义:
关联容器的迭代器的基本属性是它们遍历容器 按键的非降序顺序,其中非降序由用于的比较定义 构建它们。