Сортировка в std:: map, где ключ - std::string

У меня есть 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 

Я думал, что по умолчанию карты хранятся в сортированных ключах, но я получаю одинаковый порядок вывода, поскольку я даю входные данные. Нужно ли мне предоставлять свою функцию сортировки для этого или нужно сделать что-то дополнительное перед повторением на карте?

Ответ 1

Элементы в 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

Ответ 2

map на самом деле tree и сортируется по порядку KEY. Вы печатаете itr->second, который является VALUE, а не KEY. Если вы хотите, чтобы ваши пары ключ/значение сортировались по VALUE, вместо этого используйте VALUE как ключ или сохраните все в другом контейнере (скажем, массив), а затем отсортируйте их.

Ответ 3

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

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

Кроме того, вы не выполняете итерацию по карте, вы выполняете итерацию по файловой строке (я не знаю, что это такое, но я собираюсь считать ее отличной от mymap. Это то, что вы должны повторять более).

Ответ 4

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

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

Ответ 5

Порядок записей в map, определенных в стандарте (я думаю), поэтому, если вы хотите, чтобы он отсортировался, вы должны сделать это сами. Например, с помощью функции sort. Однако я не уверен, что он будет работать с map. Если вы хотите быть уверенным, что это отсортировано, я предлагаю вам скопировать его в vector или list и отсортировать и вывести его.