首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么没有为std::multimap实现try_emplace?

为什么没有为std::multimap实现try_emplace?
EN

Stack Overflow用户
提问于 2018-12-14 01:05:58
回答 2查看 1.1K关注 0票数 10

C++17介绍了用于std::maptry_emplace方法,因此现在我可以编写如下代码:

代码语言:javascript
复制
struct Test
{
    Test(int i, int j){}
};
std::map<int, Test> tmap;
tmap.try_emplace(10, 10, 10);

但是,没有用于try_emplacestd::multimap<int, Test>,因此仍然需要piecewise_construct

这有技术上的原因吗?

EN

回答 2

Stack Overflow用户

发布于 2018-12-14 01:33:23

这有技术上的原因吗?

是。如果映射中已经存在密钥,则try_emplace()的目的是不执行任何操作。但是对于std::{unordered_,}multi{map,set},每个键可以有多个值。也就是说,实际上,这些容器的要点是:对给定的键有多个值。

因此,对于这些容器,try_emplace()不会失败--因此提供这样一个函数将是混乱和毫无意义的。

根据这些评论,动机似乎只是try_emplace()的一部分,它使得放置一个值变得更容易。您可以为此编写一个助手函数:

代码语言:javascript
复制
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

票数 14
EN

Stack Overflow用户

发布于 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;//?(可能或不可能着火)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53772218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档