Как мне перебрать вектор карт - PullRequest
1 голос
/ 17 октября 2019

я код для удовольствия. Я создал вектор карт, чтобы посмотреть, что я могу сделать с контейнерами. Когда я перебираю вектор, появляются только Альфред и Анжела . Как отобразить все имена? Это вообще возможно? Вот что у меня есть:

#include <map>
#include <iostream>
#include <conio.h>
#include <vector>
#include <string>

int main()
{
    //create a map
    std::map<std::string, unsigned int> mySuperCoolMap;
    mySuperCoolMap["Edward"] = 39;
    mySuperCoolMap["Daniel"] = 35;
    mySuperCoolMap["Carlos"] = 67;
    mySuperCoolMap["Bobby"]  =  8;
    mySuperCoolMap["Alfred"] = 23;

    std::cout << "\n\n";

    //Ranged based for loop to display the names and age
    for (auto itr : mySuperCoolMap)
    {
        std::cout << itr.first << " is: " << itr.second << " years old.\n";
    }

    //create another map
    std::map<std::string, unsigned int> myOtherSuperCoolMap;
    myOtherSuperCoolMap["Espana"]  =  395;
    myOtherSuperCoolMap["Dominic"] = 1000;
    myOtherSuperCoolMap["Chalas"]  =  167;
    myOtherSuperCoolMap["Brian"]   =  238;
    myOtherSuperCoolMap["Angela"]  = 2300;

    //Display the names and age
    for (auto itr : myOtherSuperCoolMap)
    {
        std::cout << itr.first << " is: " << itr.second << " years old.\n";
    }

    //create a vector of maps
    std::vector<std::map<std::string, unsigned int>> myVectorOfMaps;

    myVectorOfMaps.push_back(mySuperCoolMap);
    myVectorOfMaps.push_back(myOtherSuperCoolMap);

    std::cout << "\n\n";

    //Display the values in the vector
    for (auto itr : myVectorOfMaps)
    {
        std::cout << itr.begin()->first << " is: " << itr.begin()->second << " years old.\n";
    }

    _getch();
    return 0;
}

Ответы [ 2 ]

5 голосов
/ 17 октября 2019

Вам нужно использовать вложенные циклы. Использование отладчика и печать itr могут дать вам эту интуицию, если вы изучаете новые концепции.

//Display the values in the vector
for (const auto &vec : myVectorOfMaps)
{
    for (const auto &p : vec)
    {
        std::cout << p.first << " is: " << p.second << " years old.\n";
    }
}

Демо

Вы просите напечатать только первый элемент, поэтому вы получаете только первый элемент. Обратите внимание, что это ошибка, потому что вы обращаетесь к первому элементу карты, не гарантируя, является ли карта непустой или нет.


Обратите внимание, что <conio.h> не является стандартным заголовком и может небыть доступным для стандартных платформ

3 голосов
/ 17 октября 2019

Объект, который вы получаете в цикле for, является std::map. Поэтому вам нужно использовать другой цикл for, чтобы просмотреть все записи на каждой карте.

...