在 C++17 中, std::map
和 std::unordered_map
得到了一个新的成员函数模板: try_emplace()
。这个在 n4279 中提出的新增功能与 emplace()
类似,但具有以下优点:
try_emplace()
如果插入没有发生,则不会从右值参数移动。这在操作其值为仅移动类型的地图时很有用,例如std::unique_ptr
。try_emplace()
处理 --- 的键和参数,这使得它比用value_type
表示的通用mapped_type
体更直观(即std::pair
)。
鉴于上述优势,在编写仅 C++1z 的代码时,您会使用 C++11 中的 try_emplace()
emplace()
不是 C++1z 中的 — 吗?
原文由 s3rvac 发布,翻译遵循 CC BY-SA 4.0 许可协议
try_emplace
确实可以替换大多数用途emplace
,但是如果您有一个map
的不寻常用例,具有不可复制和不可移动的密钥类型,try_emplace
不起作用,因为它复制或移动密钥。在这种情况下,您必须使用emplace
和std::pair
的 分段构造构造函数 以避免复制和移动。即使您的密钥类型是可复制和/或可移动的,分段构造也是避免复制或移动构造密钥的唯一方法,因此在某些情况下,您可能更喜欢
try_emplace
。