Печать значения карты с двумя строками в качестве ключа и вектора в качестве значения

У меня есть карта, которая имеет две строки в качестве ключа и один вектор в качестве значения, как я могу напечатать значение карты.

Ниже мой подход, который является плохим Может ли кто-нибудь помочь мне заранее спасибо

ПРИМЕЧАНИЕ: я хочу печатать по ключу, не повторяя по вектору

int main()
{
        vector<string>value;
        std::map<std::pair<string,string> ,vector<string>> myMap;
        string input1,input2,MyvectorValue;
        for(int i=0;i<5;++i)
        {
                cin>>input1;
                cin>>input2;
                cin>>MyvectorValue;
                myMap[std::make_pair(input1,input2)].push_back(MyvectorValue);
        }
        int j=0;
        for( auto it = myMap.begin(); it != myMap.end(); ++it )
        {
                std::vector<std::string>& value = it->second.at(j++);
               cout<<value  // This is bad

           //how can i print all map value ??
        }
}

3 ответа

Решение

Значением карты является вектор, при условии, что вы можете использовать C++11, следующий код будет делать то, что вам нужно.

#include <string>
#include <iostream>
#include <map>
#include <utility>
#include <vector>

int main()
{
    std::vector< std::string >value;
    std::map< std::pair<std::string , std::string> ,    std::vector<std::string> > myMap;
    std::string input1,input2,MyvectorValue;
    for(int i=0;i<5;++i)
    {

        std::cin>>input1;
        std::cin>>input2;
        std::cin>>MyvectorValue;
        myMap[std::make_pair(input1,input2)].push_back(MyvectorValue);
    }

    //If you have a particular key (string1, string2), and want to print the values for that specific key...
    auto particularKey = std::make_pair("stringA", "stringB");
    for(auto val : myMap[particularKey])
        std::cout << val << " ";
    std::cout << std::endl;

    // If you want to iterate through all keys of your map
    for(auto &elem : myMap)
    {
        std::cout << "for the pair with key (" << elem.first.first << "," << elem.first.second << "), the value is the following vector" << std::endl;
        for(auto s : elem.second)
        {
            std::cout << s << " ";
        }
        std::cout << std::endl << std::endl;
    }
    return 0;
}

Если вы хотите печатать по ключу без итерации по вектору, вы можете объявить карту как "std:: map, string> myMap". Затем вы можете внести следующие изменения в ваш код, как указано ниже.

int main() {
vector<string>value;
std::map<std::pair<string,string>,string> myMap;
string input1,input2,MyvectorValue;
for(int i=0; i<5; ++i) {

    cin>>input1;
    cin>>input2;
    cin>>MyvectorValue;
    myMap[std::make_pair(input1,input2)]+=MyvectorValue;
    myMap[std::make_pair(input1,input2)]+= " ";
}
for( auto it = myMap.begin(); it != myMap.end(); ++it ) {
    std::string& value = it->second;
    cout<<value<<endl;
  }
}

Вы можете распечатать ключи, открыв пару, а затем используя first а также second чтобы получить первый и второй член пары соответственно.

Вы также можете распечатать значения, обращаясь к векторам и перебирая их, печатая каждую строку отдельно.

for(auto& element : myMap)
{
    std::cout << "Key: {" << element.first.first << ", " << element.first.second << "}\n";
    std::cout << "Value is a vector with the following strings: \n";
    for(auto& str: element.second)
        std::cout << str << std::endl;
}
Другие вопросы по тегам