try_emplace
(和std::map
)的成员函数的一个优点是,如果键已存在于映射中,它不会分配新节点。我想知道为什么这个成员函数没有添加到 std::unordered_map
(和 std::set
)接口中,同样的优点也可能适用。此现场演示显示 std::unordered_set
每次都会分配:
https://godbolt.org/z/MjMjPcc89(使用 libstdc++)。 这个基准测试表明,当存在重复键时,
std::set::emplace
+
find
可能比单独使用 emplace
更快:https://quick-bench.com/q/2IWzv_SJFJpklGjwIKk6wgKsuz0。 但是,
emplace
+
find
需要双重查找,以防容器中不存在密钥。这是 emplace
的基准,其中 std::map
是最快的选项:https://quick-bench.com/q/ymn1qaxAtrf6FTzHC98e_wkHVZ4。 编辑
使用
try_emplace
时似乎不会出现分配问题。可惜我之前没试过。
现场演示:https://godbolt.org/z/EjWjfjnsc 和 std::unordered_set::emplace 已经相当于 std::set::insert
:
但是,请注意:
即使容器中已经存在带有该键的元素,也可能会构造该元素,在这种情况下,新构造的元素将立即被销毁。