假设我有一个名为map<string, vector<int>>
的{{1}},我想将my_map
与密钥42
关联起来。来自Java我希望必须做这样的事情
"foo"
令我惊讶的是,我发现我可以做到
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);
}
这是如何工作的?如果地图的值类型没有没有参数的构造函数,my_map["foo"].push_back(42);
会怎么做?假设您想以除使用空构造函数之外的方式初始化所有值?在Java中,我可以做到
my_map["foo"]
C ++中是否有等价物?
答案 0 :(得分:6)
my_map["foo"]
default-构造一个新值(如果它尚不存在)。因此,如果值类型不是默认可构造的(即没有没有参数的构造函数),它将导致编译错误。然后,您必须执行以下操作:
my_map.emplace("foo", param).first->second.push_back(42);
如果param
{{}}}尚未存在,emplace
将构建您的值。
可以使用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);
答案 1 :(得分:2)
您可以阅读operator[]
的{{3}}:
如果k与容器中任何元素的键不匹配,则该函数会使用该键插入一个新元素,并返回对其映射值的引用。请注意,即使没有为元素指定映射值(使用其默认构造函数构造元素),这也总是会将容器大小增加1。
如果mapped_type
没有默认构造函数,则会出现编译错误。