添加具有可变值的地图

时间:2016-04-26 15:11:56

标签: c++ dictionary

假设我有一个名为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 ++中是否有等价物?

2 个答案:

答案 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没有默认构造函数,则会出现编译错误。