当前位置: 首页 > news >正文

C++ emplace_back 与 push_back 详解

一、核心区别

对比项push_backemplace_back
参数接受一个已存在的对象接受构造函数的参数
过程先构造对象,再拷贝到容器直接在容器中构造对象
效率可能产生临时对象和拷贝零拷贝,最高效

一句话总结push_back是“插入对象”,emplace_back是“就地构造”。


二、代码示例对比

2.1 基础演示
cpp #include <iostream> #include <vector> #include <string> using namespace std; class Student { public: string name; int age; Student(string n, int a) : name(n), age(a) { cout << "构造: " << name << endl; } Student(const Student& other) : name(other.name), age(other.age) { cout << "拷贝构造: " << name << endl; } }; int main() { vector<Student> students; // push_back:先构造临时对象,再拷贝到容器 cout << "=== push_back ===" << endl; students.push_back(Student("Alice", 20)); // 输出:构造: Alice // 输出:拷贝构造: Alice // emplace_back:直接在容器中构造,无拷贝 cout << "\n=== emplace_back ===" << endl; students.emplace_back("Bob", 22); // 输出:构造: Bob return 0; }
2.2 实际应用场景
cpp #include <vector> #include <string> #include <map> using namespace std; int main() { // 场景1:添加简单类型 vector<int> nums; nums.push_back(10); // OK nums.emplace_back(20); // 也可以 // 场景2:构造pair(推荐emplace_back) vector<pair<string, int>> pairs; pairs.emplace_back("key", 42); // 直接传参,高效 pairs.push_back({"key", 42}); // 需要花括号构造临时对象 // 场景3:复杂对象(emplace_back优势明显) vector<map<string, vector<int>>> complexVec; complexVec.emplace_back(); // 构造空map // complexVec.push_back({}); // 也行,但会多一次拷贝 // 场景4:不可拷贝类型(只能用emplace_back) vector<unique_ptr<int>> ptrs; ptrs.emplace_back(new int(42)); // OK // ptrs.push_back(new int(42)); // 错误!unique_ptr不可拷贝 return 0; }

三、使用建议

3.1 优先使用 emplace_back 的场景
cpp // 1. 需要临时构造对象(最常见) vector<string> strs; strs.emplace_back("hello"); // 推荐 strs.push_back("hello"); // 会产生临时对象 // 2. 多参数构造 struct Point { int x, y; }; vector<Point> points; points.emplace_back(3, 4); // 直接传两个参数 points.push_back({3, 4}); // 需要花括号 // 3. 复杂类型构造 vector<vector<int>> matrix; matrix.emplace_back(5, 10); // 构造包含10个5的vector matrix.push_back({5, 10}); // 构造包含5和10的vector(含义不同!)
3.2 使用 push_back 的场景
cpp // 1. 添加已存在的对象(语义更清晰) string existing = "world"; vec.push_back(existing); // 明确是拷贝 vec.emplace_back(existing); // 也能工作,但push_back更直观 // 2. 使用移动语义时 vec.push_back(std::move(existing)); // 明确表示移动 vec.emplace_back(std::move(existing)); // 也可以

四、总结

使用场景推荐方法原因
临时构造新对象emplace_back避免临时对象,效率更高
添加已存在的对象push_back语义清晰,代码可读性好
多参数构造emplace_back代码更简洁
不可拷贝类型emplace_back必须使用

最佳实践:在大多数情况下,优先使用emplace_back,它更通用且高效。只有在明确需要表达“插入一个已存在的对象”时,才使用push_back

http://www.jsqmd.com/news/1373197/

相关文章:

  • MUSTTRUE磁吸悬浮键盘:系统化解决iPad移动办公输入痛点
  • 终极SoundCloud音乐下载器完整指南:轻松收藏你的最爱音乐
  • workBuddy调研
  • Python匿名函数lambda实战教程:从入门到精通
  • Linux开发工具全攻略:从Vim到GDB的必备技能
  • VSCode Java开发环境搭建:从JDK配置到插件调试全指南
  • 终极Windows批量卸载神器:Bulk Crap Uninstaller完全指南
  • 深入解析推理引擎Context元数据:设计原理与核心作用
  • Wand-Enhancer实战指南:深度解锁WeMod进阶功能与远程控制
  • 信号链FAE笔试复盘:ADC、SPI与传感器调理电路实战解析
  • 云原生与分布式架构实战:2026工程师核心能力解析
  • 2026年荃净环保和科立恩除醛效果哪家好 多维度对比一看便知 - 亚东说
  • 25 - 羟基维生素 D3 (HVD3):评估维生素 D 储备核心标志物,云克隆 ELISA 助力科研精准检测
  • 单图生成3D场景:AI驱动的计算机视觉新突破
  • 5分钟终极指南:用QRemeshify让Blender三角网格秒变完美四边形
  • GPU内存检测:如何用Vulkan工具快速发现显卡硬件问题?
  • Windows安装Cygwin全攻略:打造Linux式开发环境与高效命令行工具集
  • 网盘下载太慢?9大平台直链解析工具助你告别限速烦恼
  • 专业照明选型指南:拆解GX23接口LED筒灯的设计逻辑与工程价值
  • 8个终极免费Illustrator脚本:设计师效率提升300%的完整指南
  • 7-Zip-zstd压缩工具终极指南:6大现代算法集成与性能调优
  • Navicat密码解密终极指南:3分钟找回遗忘的数据库密码
  • 科研论文写作效率提升:10大核心技能与工程化工作流实践
  • LangGraph流式输出实战:从原理到生产环境部署
  • Ryujinx:终极跨平台Switch模拟器完全指南
  • 深入解析C++模板高阶特性:非类型参数、特化与分离编译
  • FastMCP生产部署实战:从本地调试到HTTP API、鉴权与异步任务
  • PHP+Vue篮球馆智慧管理系统开发实战
  • 如何快速获取2000+明日方舟高清游戏素材:终极完整指南
  • AI选题Skill升级:从数据抓取到趋势预测的技术内容创作助手