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当做一个构造函数的时候才能体现出它的优势。

浙公网安备 33010602011771号