сопоставить автоматически основанный на петле доступ к одному элементу C ++ - PullRequest
5 голосов
/ 17 июня 2019

Я пытаюсь понять "теорию", кроме цикла auto над

станд :: карта

элементов в C ++. У меня есть std::map с std::string как КЛЮЧ и vector<std:string> как ЗНАЧЕНИЕ. Я могу получить доступ к его элементам с помощью:

for ( auto &element : myMap ) {
    std::cout << element.first << ": " << '\t';
    for ( std::string subElement : element.second ) std::cout << subElement << ", ";
  }
}

Что касается цикла над элементами vector<string>, я знаю, что мог бы поставить "auto" вместо "std :: string". Но что будет эквивалентом для карты в таком случае? Я изучал и искал вокруг, и обнаружил в этой записи , что каждый элемент карты доступен как

карта :: value_type

но как бы я это записал? Я попробовал:

for ( std::map<std::string, vector<std::string>> &pz : myMap ) {
    // print ...
}

и аналогичные, но они просто не работают.

Ответы [ 2 ]

8 голосов
/ 17 июня 2019

std::map::value_type определяется как тип элемента std::map, который равен std::pair<const Key, T> (т. Е. std::pair<const std::string, vector<std::string>> здесь).Вы должны использовать его как

for ( std::map<std::string, vector<std::string>>::value_type &pz : myMap ) {
    //                                          ^^^^^^^^^^^^
    // print ...
}
0 голосов
/ 17 июня 2019

songyuanyao ответил на ваш вопрос. Здесь необходимо уточнить, что std::map определяется как

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >
> class map;

Имя класса должно быть std::map<key type, value type>.

...