我正在尝试创建一个符号表,其中映射的键是一个标识符,它返回的向量包含分别代表类型和范围的字符串对。我能够获得一个带有字符串键的映射返回单个字符串的向量,但是当我尝试对时,我得到一个错误。
#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> &&'
我可以获得单个字符串的向量,但这似乎更像是一个解决方法,而不是为每个标识符实例配置真正的对。任何帮助表示赞赏!
答案 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)
当然,如果要添加到包含字符串的向量,则需要首先检查向量是否已存在。在这里,我没有检查矢量是否已经存在,所以如果它存在,则不存在任何阻塞。