矢量作为地图值,插入新密钥并立即推回c ++

时间:2015-07-01 16:20:35

标签: c++ dictionary

这有用吗?

map<string, vector<int>> mymap;
mymap["bob"].push_back(1);
mymap["joe"].push_back(3);
mymap["joe"].push_back(12);

或者我必须这样做吗?

map<string, vector<int>> mymap;
if (mymap.find("bob") == mymap.end()) {
    vector<int> vec;
    mymap["bob"] = vec;
    mymap["bob"].push_back(1);
}
else {
    mymap["bob"].push_back(1);
}
...

基本上问题是mymap [“bob”]是否将矢量创建为其映射值,或者我是否必须自己创建矢量并将其添加到地图中以获取新键。

2 个答案:

答案 0 :(得分:3)

map<string, vector<int>> mymap;
mymap["bob"].push_back(1);

应该有效。 map::operator[]会为给定密钥插入一个项目(如果尚未存在)。

来自http://en.cppreference.com/w/cpp/container/map/operator_at

  

返回对映射到等效于key的键的值的引用,如果此类键尚不存在则执行插入。

答案 1 :(得分:1)

简短的回答:你的代码很好。

  

的std ::地图::操作符[]

mapped_type& operator[] (const key_type& k);
     

如果k匹配容器中元素的键,则为函数   返回对其映射值的引用。

     

如果k与容器中任何元素的键不匹配,则该函数会使用该键插入一个新元素并返回一个引用   到它的映射值。请注意,这总是会增加容器   即使没有为元素分配映射值,也将大小加1   element是使用其默认构造函数构造的。

     

类似的成员函数map::at具有相同的行为   具有键的元素存在,但是当它不存在时抛出异常。

来源:C++ Reference

考虑你的第二行,例如:

mymap["bob"].push_back(1);

mymap没有密钥"bob",因此它会创建一个并返回对默认构造的(即空)vector<int>关联的引用用那把钥匙。

然后push_back(1)到该向量。您可以再次访问mymap["bob"],然后您将获得对该向量的引用,其中包含单个元素1