【问题标题】:printing a value of map which has two string as key and vector as value打印具有两个字符串作为键和向量作为值的映射值
【发布时间】:2017-06-18 20:34:56
【问题描述】:

我有一张地图,它有两个字符串作为键,一个向量作为值 如何打印地图的值。

以下是我的方法不好,有人可以帮助我提前谢谢

注意:我想按键打印而不是在向量上迭代

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 ??
        }
}

【问题讨论】:

  • 为什么不迭代向量并打印每个值?
  • 您一直说您不想迭代向量,但如果您不这样做,您希望如何获得这些值?您需要更具体地了解您的(也许是不可能的)用例。

标签: c++ loops dictionary vector io


【解决方案1】:

map的值是一个向量,假设你可以使用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;
}

【讨论】:

  • 请问我如何使用键打印而不是在向量上迭代,因为我确实有一些用例。
  • 你的地图的值是一个字符串向量,你必须遍历字符串向量,逐个打印字符串。
  • 看来 op 想在特定键上打印。
【解决方案2】:

您可以通过访问该对打印密钥,然后使用firstsecond 分别获取该对的第一个和第二个成员。

您还可以打印值,方法是访问向量并对其进行迭代,分别打印每个字符串。

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;
}

【讨论】:

  • 我想按键打印而不是在向量上迭代我已经更新了我的问题
  • @user7953556 我更新了我的答案,这是你想要的吗?
【解决方案3】:

如果您想要按键打印而不是在向量上迭代,那么您可以将 map 声明为“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;
  }
}

【讨论】:

  • 您使用了一个字符串,但我的问题是 vector 作为值
  • 很抱歉,如果你想打印矢量,我认为除了迭代它可能别无他法。
  • 您可以查看上面的接受值供您参考
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2015-03-22
  • 2012-08-27
  • 2019-05-10
  • 2021-10-13
  • 2015-09-21
相关资源
最近更新 更多