资讯动态

C++中emplace函数的不适场景总结(二)

发布时间:2026/9/10 2:54:54 来源:尧图企业网站定制
容器的拒绝添加我们上面一致在分析 vector。而有些容器是会拒绝元素的添加比如set, map, unordered_set, unordered_map。这类容器都保证了内部元素的唯一性因此每个元素顶多被插入一次。后续的操作都是无用功。如下面的代码所示只有在循环的第一次会插入成功而后续都是失败的。#include iostream #include string #include unordered_set int main() { std::unordered_setstd::string ust; std::string str(Hello World); for (int i 0; i 5; i 1) { auto [it, flag] ust.emplace(str); std::cout i emplace(str) flag \n; } } /* 输出结果 0 emplace(str) 1 1 emplace(str) 0 2 emplace(str) 0 3 emplace(str) 0 4 emplace(str) 0 */原因是在 set, map 这类容器中没有现成的空间让我们去构造。一般来说这里的 emplace() 分为三步先通过 emplace 的参数构造出一个对象 object在将构造出的对象来计算哈希值或者比较基于哈希值来判断是否能插入和插入的位置。3.1. 如果能插入则将元素插入数据结构中3.2. 如果不能则析构掉该对象。因此当出现 3.2. 情况的时候就会在整体中出现一次构造 一次析构的无用功。而普通的 insert() 函数只有在确定能够插入时才去构造对象。不会出现多余的构造和析构。因此在 set, map 这类容器还是推荐使用 insert() 函数而非 emplace() 函数。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价