c++ - 为什么 std::multimap 没有实现 try_emplace?

标签 c++ c++17

C++17 引入了 try_emplace std::map 的方法,所以现在我可以编写如下代码:

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仍然需要。

这有技术原因吗?

最佳答案

is there a technical reason for this?

是的。 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

关于c++ - 为什么 std::multimap 没有实现 try_emplace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53772218/

相关文章:

c++ - 返回本地对象的元组

c++ - Qmake给我错误

c++ - 调用转换函数后是否调用了移动构造函数?

c++ - if constexpr 的假分支未在模板化 lambda 中丢弃

c++ - 从另一个可变参数模板制作可变参数模板

c++ - 为什么在我的单例类中未定义对互斥锁的引用

c++ - 如何编写将自身作为回调传递的匿名函数/lambda?

c++ - 如何在 Windows XP 上正确安装 ffmpeg?

c++ - std::vector 无异常:警告 C4530:使用了 C++ 异常处理程序,但未启用展开语义。指定/EHsc

c++ - QObject* 列表的内存管理导致 QML 中出现 "Cannot read property X of null"错误