сортировка в std :: map, где ключ является std :: string - PullRequest
16 голосов
/ 13 декабря 2011

У меня есть std :: map mymap

Теперь, если я вставлю значения в карту, например:

std::map <string, string> mymap;
mymap["first"] = "hi";
mymap["third"] = "how r you";
mymap["second"] = "hello";

Теперь я хочу перебрать карту и напечатать значение вsorted (keys) способом:

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 ]

26 голосов
/ 13 декабря 2011

Элементы в 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
5 голосов
/ 13 декабря 2011

map на самом деле является деревом и сортируется по KEY-порядку.Вы печатаете itr->second, что является ЗНАЧЕНИЕМ, а не КЛЮЧОМ.Если вы хотите, чтобы ваши пары ключ / значение были отсортированы по VALUE, вместо этого используйте VALUE в качестве ключа или сохраните все в другом контейнере (скажем, в массиве), а затем отсортируйте их.

3 голосов
/ 13 декабря 2011

std :: map уже упорядочен.Если бы вы использовали unordered_map, теперь у вас возникла бы проблема!

Записи в std :: map упорядочены по ключу или itr-> first.itr-> second, если он у вас есть, относится к значению, связанному с ключом.

Более того, вы не перебираете карту, вы перебираете file_line (я не знаю, что этоесть, но я собираюсь предположить, что это отличается от mymap. Это то, что вы должны повторять).

1 голос
/ 13 декабря 2011

Стандарт определяет:

Фундаментальное свойство итераторов ассоциативных контейнеров заключается в том, что они выполняют итерацию по контейнерам. в нисходящем порядке ключей, где нисходящий определяется сравнением, которое использовалось для построить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...