添加具有可变值的地图

cpp*_*ner 1 c++ dictionary

假设我有一个map<string, vector<int>>被叫my_map,我想要42关键"foo".来自Java我希望不得不做这样的事情

if (my_map.find("foo") != my_map.end()) {
    my_map["foo"].push_back(42);
} else {
    vector<int> my_vector;
    my_map["foo"] = my_vector;
    my_vector.push_back(42);
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,我发现我可以做到

my_map["foo"].push_back(42);
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?my_map["foo"]如果地图的值类型没有没有参数的构造函数,会怎么做?假设您想以除使用空构造函数之外的方式初始化所有值?在Java中,我能做到

map.computeIfAbsent("foo", **some supplier of Vectors**).add(42);
Run Code Online (Sandbox Code Playgroud)

C++中有等价的吗?

Que*_*tin 6

my_map["foo"]default-构造一个新值(如果它尚不存在).因此,如果值类型不是默认可构造的(即没有没有参数的构造函数),则会导致编译错误.然后,您必须执行以下操作:

my_map.emplace("foo", param).first->second.push_back(42);
Run Code Online (Sandbox Code Playgroud)

哪里emplace会从构建你的价值param,如果它不存在.

可以使用分段构造函数提供更多参数std::pair:

my_map.emplace(
    std::piecewise_construct,
    std::forward_as_tuple("foo"),
    std::forward_as_tuple(param1, param2, param3)
).first->second.push_back(42);
Run Code Online (Sandbox Code Playgroud)