C++17介绍了用于std::map的try_emplace方法,因此现在我可以编写如下代码:
struct Test
{
Test(int i, int j){}
};
std::map<int, Test> tmap;
tmap.try_emplace(10, 10, 10);但是,没有用于try_emplace的std::multimap<int, Test>,因此仍然需要piecewise_construct。
这有技术上的原因吗?
发布于 2018-12-14 01:33:23
这有技术上的原因吗?
是。如果映射中已经存在密钥,则try_emplace()的目的是不执行任何操作。但是对于std::{unordered_,}multi{map,set},每个键可以有多个值。也就是说,实际上,这些容器的要点是:对给定的键有多个值。
因此,对于这些容器,try_emplace()不会失败--因此提供这样一个函数将是混乱和毫无意义的。
根据这些评论,动机似乎只是try_emplace()的一部分,它使得放置一个值变得更容易。您可以为此编写一个助手函数:
template <typename Map, typename Key, typename... Args>
auto emplace_value(Map& map, Key&& key, Args&&... args) {
return map.emplace(std::piecewise_construct,
std::forward_as_tuple(std::forward<Key>(key)),
std::forward_as_tuple(std::forward<Args>(args)...));
}这将允许您编写emplace_value(tmap, 10, 10, 10),甚至是{unordered_,}multimap。
发布于 2018-12-14 01:32:44
这是不必要的,因为对于multimap的情况,因为没有唯一的密钥,try_emplace永远不会失败。将try_emplace添加到映射中的rational是处理键已经存在的情况所需的所有容易出错的代码,请参阅提案n4279 (强调n4279):
唯一键控映射容器(std:: map,std::unordered_map)的现有接口略有欠指定,这使得某些容器的突变比必要的更复杂,更容易出错。本文描述了新的成员函数模板来填补这一空白。 在N3873中给出了新接口的理由和原理。Issaquah中对N3873的最初反应是,现有的映射接口应该是固定的,而不是添加新的接口。我们在Rapperswil中的N4006中探讨了这个想法,并认为最初的建议更好(有一些名称更改)。本文只对所提出的扩展进行了总结,没有重复原来的讨论。我们只在这里为动机重述激励代码片段: std::map m;m"foo“= nullptr;nullptr= std::make_unique_ptr;auto res = m.emplace("foo",std::std::unique_ptr>);assert;//?(可能或不可能着火)
https://stackoverflow.com/questions/53772218
复制相似问题