假设我有一个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++中有等价的吗?
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)