添加到具有可变值的地图
Adding to a map with mutable values
假设我有一个名为 my_map
的map<string, vector<int>>
,我想将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);
}
令我惊讶的是,我发现我可以做
my_map["foo"].push_back(42);
这是如何工作的?如果映射值的类型没有没有参数的构造函数,my_map["foo"]
该怎么办?假设您想以不使用空构造函数的方式初始化所有值?在Java中,我可以做到
map.computeIfAbsent("foo", **some supplier of Vectors**).add(42);
C++有等价物吗?
my_map["foo"]
默认构造一个新值(如果它尚不存在)。因此,如果值类型不是默认可构造的(即没有没有参数的构造函数),则会导致编译错误。然后,您必须执行以下操作:
my_map.emplace("foo", param).first->second.push_back(42);
如果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);
你可以在这里阅读operator[]
:
如果 k 与容器中任何元素的键不匹配,则该函数将插入具有该键的新元素,并返回对其映射值的引用。请注意,这始终将容器大小增加 1,即使没有为元素分配映射值(元素是使用其默认构造函数构造的)。
如果mapped_type
没有默认构造函数,则会收到编译错误。
相关文章:
- 如何使用 emplace 添加到C++中的地图
- 如何将模板函数指针作为值参数添加到地图中
- 在C++中向地图添加对对象的引用
- 是 std::make_pair 在将对象添加到地图时创建副本
- C 将类成员功能添加到地图中
- 以键作为结构的地图添加
- 了解如何使用SFML函数将数据添加到地图中
- 查找地图C 没有在地图中找到已经添加的密钥
- 使用单词键将多个行号的向量添加到我的地图中
- 如何在地图中添加值,并将向量作为值类型
- 在迭代地图时向/从地图添加/删除元素是否安全
- 添加到具有可变值的地图
- 为什么我不能<Derived>在此代码中添加shared_ptr到地图<key_type,shared_ptr<Base>>?
- 添加第三级地图
- 将新条目添加到地图列表中
- 如何将地图作为参数传递并在此方法中添加
- 如何添加到地图 <int、列表<int>>
- 无法将值添加到嵌套在地图内的向量中
- 如何找到一个特定的关键和添加值使用矢量或地图
- C++ 如何将对象添加到地图并返回对地图中新创建的对象的引用