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/