Сортировка в 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
и отсортировать и вывести его.