如何将插入插入<string,vector <pair :: =“”<string,=“”string =“”>&gt;的映射中&GT;在C ++中?</string,>

时间:2014-04-07 00:43:14

标签: c++11 vector map std-pair

我正在尝试创建一个符号表,其中映射的键是一个标识符,它返回的向量包含分别代表类型和范围的字符串对。我能够获得一个带有字符串键的映射返回单个字符串的向量,但是当我尝试对时,我得到一个错误。

#include <iostream>
#include <utility>
#include <vector>
#include <map>
#include <string>
using namespace std; //using std namespace for readibility for this question

int main() {
    string key = "myKey";
    string string1 = "string1";
    string string2 = "string2";
    pair <string, string> stringPair = make_pair (string1, string2);

    map<string, vector<std::pair <string, string>>> myMap;
    myMap.insert( make_pair (key,  make_pair (string1, string2) )); //insert key into map, create empty vector
                                    //this is where I get th error

    myMap[key].push_back(std::make_pair (string1, string2) ); //use key, push strings into vector<string, string>

    return 0;
}

error C2664: 'std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::insert(std::pair<const _Kty,_Ty> &&)' : cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'std::pair<_Ty1,_Ty2> &&'

我可以获得单个字符串的向量,但这似乎更像是一个解决方法,而不是为每个标识符实例配置真正的对。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:4)

问题在于您尝试将一对插入到地图中,而不是成对的矢量。如果你想让向量开始为空,最简单的方法是让它使用默认的构造函数(对于向量,创建一个空向量),而不是显式地插入到地图中:

map<string, vector<std::pair <string, string>>> myMap;
myMap[key].push_back(std::make_pair (string1, string2) ); //use key, push strings into vector<string, string>

答案 1 :(得分:3)

这是一个非常简单的C ++ 11版本,可以使用,但以后可能很难阅读,取决于人员:

#include <iostream>
#include <utility>
#include <vector>
#include <map>
#include <string>
using namespace std; //using std namespace for readibility for this question

int main() {
    string key = "myKey";
    string string1 = "string1";
    string string2 = "string2";
    map<string, vector<std::pair <string, string>>> myMap;

    myMap.insert( { key, {{ string1, string2 }} } ); 

    return 0;
}

在那里测试:http://coliru.stacked-crooked.com/(GCC4.8)

当然,如果要添加到包含字符串的向量,则需要首先检查向量是否已存在。在这里,我没有检查矢量是否已经存在,所以如果它存在,则不存在任何阻塞。