Как я могу пройти через std::map
C ++? Моя карта определяется как:
std::map< std::string, std::map<std::string, std::string> >
Например, вышеприведенный контейнер содержит данные, подобные этим:
m["name1"]["value1"] = "data1";
m["name1"]["value2"] = "data2";
m["name2"]["value1"] = "data1";
m["name2"]["value2"] = "data2";
m["name3"]["value1"] = "data1";
m["name3"]["value2"] = "data2";
Как я могу пройти по этой карте и получить доступ к различным значениям?
Ответы:
Старый вопрос, но остальные ответы устарели на C ++ 11 - вы можете использовать ранжированный цикл for и просто сделать:
это должно быть намного чище, чем в более ранних версиях, и избегать ненужных копий.
Некоторые предпочитают заменять комментарии явными определениями ссылочных переменных (которые оптимизируются, если не используются):
источник
const
послеauto
? Это чисто эстетично?int const *x
иint *const x
вы можете написать это,int const *const x
что гораздо яснее, чем IMOconst int *const x
. Но он просто анализируется слева направо, поэтому эффект тот же. См. Ответы на этот вопрос: stackoverflow.com/questions/5503352/const-before-or-const-afterВы можете использовать итератор.
источник
for(auto iterator = m.begin(); iterator != m.end(); iterator++)
или лучше в C ++ 0x:
источник
В C ++ 17 (или более поздней версии) вы можете использовать функцию «структурированных привязок», которая позволяет вам определять несколько переменных с разными именами, используя один кортеж / пару. Пример:
Первоначальное предложение (светилами Бьярне Страуструп, Herb Sutter и Gabriel Dos Reis) интересно читать (и предлагаемый синтаксис более интуитивным ИМХО); Есть также предложенная формулировка для стандарта, который скучно читать, но ближе к тому, что будет на самом деле.
источник
Сделайте что-то вроде этого:
источник
C ++ 11:
вывод:
источник
использовать,
std::map< std::string, std::map<std::string, std::string> >::const_iterator
когда карта постояннаисточник
auto
братан, или тот, кто использует Vim, пойдет нокаутом.Как einpoklum упомянул в своем ответе , начиная с C ++ 17, вы также можете использовать объявления структурированных привязок . Я хочу расширить это, предоставляя полное решение для итерации по карте карт удобным способом:
Примечание 1: для заполнения карты я использовал список инициализатора (который является функцией C ++ 11 ). Иногда это может быть удобно для компактности фиксированных инициализаций.
Примечание 2: если вы хотите изменить карту
m
внутри циклов, вы должны удалитьconst
ключевые слова.Код на Колиру
источник
Первое решение - использовать range_based for loop, например:
Примечание: Когда
range_expression
«S типаstd::map
затемrange_declaration
» типа s этоstd::pair
.Код 1:
Второе решение:
Код 2
источник