向量作为映射值,插入新键并立即推回c++

Zac*_*ner 4 c++ dictionary

这有效吗?

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

或者我必须这样做吗?

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);
}
...
Run Code Online (Sandbox Code Playgroud)

基本上问题是 mymap["bob"] 是否创建向量作为其映射值,或者我是否必须自己创建一个向量并将其添加到新键的映射中。

Tob*_*ght 5

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

std::map::运算符[]

mapped_type& operator[] (const key_type& k);
Run Code Online (Sandbox Code Playgroud)

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

如果k与容器中任何元素的键不匹配,该函数将插入具有该键的新元素并返回对其映射值的引用。请注意,即使没有为元素分配映射值(该元素是使用其默认构造函数构造的),这始终会将容器大小增加一。

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

来源:C++ 参考

考虑你的第二行,例如:

mymap["bob"].push_back(1);
Run Code Online (Sandbox Code Playgroud)

mymap没有 key ,因此它创建一个 key 并返回对与该键关联的默认构造(即空)"bob"的引用。vector<int>

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