在std :: map中排序,其中key是std :: string

时间:2011-12-13 13:54:39

标签: c++ stl

我有一个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 

我认为默认情况下映射存储按排序键方式存储,但我输出的输出顺序与输入相同。我需要为此提供我的排序功能,还是需要在迭代地图之前做一些额外的事情?

4 个答案:

答案 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)

标准定义:

  

关联容器的迭代器的基本属性是它们遍历容器   按键的非降序顺序,其中非降序由用于的比较定义   构建它们。