为什么std::set没有提供try_emplace成员函数?

问题描述 投票:0回答:1

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

c++ dictionary set unordered-set emplace
1个回答
0
投票
std::set::emplace

std::unordered_set::emplace 已经相当于 std::set::insert:


如果容器中没有带有该键的元素,则将新元素插入到使用给定参数就地构造的容器中。

但是,请注意:

即使容器中已经存在带有该键的元素,也可能会构造该元素,在这种情况下,新构造的元素将立即被销毁。

© www.soinside.com 2019 - 2024. All rights reserved.