gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:28:03 31 4
gpt4 key购买 nike

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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com