C++11 新特性 emplace操作 使用心得
C++11 新引入了emplace()/empalce_front()/empalce_back()三个操作,对应了insert()/push_front()/push_back()操作。
不同之处是:
- insert是进行拷贝操作,而emplace是直接在容器的内存空间中进行构造一个对象。
这可以提高代码的运行效率, 避免不必要的copy操作。
下面看代码:
#include <iostream>
#include <list>
using namespace std;
class TyData {
public:
TyData(int a, int b) {
x = a;
y = b;
cout << "这是构造函数\n";
}
TyData(const TyData &d) {
cout << "这是复制构造函数\n";
x = d.x;
y = d.y;
}
void showTydata() { cout << "x:" << x << " y:" << y << endl; }
private:
int x;
int y;
};
void main() {
cout << "use emplace :(parameter)\n";
std::list< TyData > m_emplace_list;
m_emplace_list.emplace_back(1, 2);
m_emplace_list.emplace_back(3, 4);
m_emplace_list.emplace_back(5, 6);
m_emplace_list.emplace_back(7, 8);
m_emplace_list.emplace_back(9, 10);
cout << "not use emplace but objec:" << endl;
TyData d1(11, 12);
TyData d2(13, 14);
TyData d3(15, 16);
TyData d4(17, 18);
TyData d5(19, 20);
std::list< TyData > m_stlist;
m_stlist.push_back(d1);
m_stlist.push_back(d2);
m_stlist.push_back(d3);
m_stlist.push_back(d4);
m_stlist.push_back(d5);
cout << "use emplace :(objec)" << endl;
m_emplace_list.emplace_back(d1);
m_emplace_list.emplace_back(d2);
m_emplace_list.emplace_back(d3);
m_emplace_list.emplace_back(d4);
m_emplace_list.emplace_back(d5);
system("pause");
return 0;
}
运行结果:
可以看出,
- 使用emplace_back()直接赋值是直接在容器的内存空间中进行构造一个对象。而push_back()需要调用复制构造函数。
- 当emplace_back()和push_back()追加已经构造好的对象时,两者没有区别,都会调用拷贝构造。
所以只有当使用参数,也就是说将emplace当做一个构造函数的时候才能体现出它的优势。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探