使用c++三四年了,说实话emplace,今天才是第一次接触,有一种想见恨晚的感觉。先看看代码,看看结果,你就知道它的妙处!
#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);
system("pause");
}
运行结果:
从运行结果可以看出:
使用emplace比常规的push_back少调用了一次复制构造函数。
接下来试一试使用emplace直接插入对象的情况:
部分代码:
cout << "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.emplace_back(d1);
m_stlist.emplace_back(d2);
m_stlist.emplace_back(d3);
m_stlist.emplace_back(d4);
m_stlist.emplace_back(d5);
cout << "use push_back:\n";
std::list<TyData> m_stlist_ex;
TyData d11(11, 12);
TyData d21(13, 14);
TyData d31(15, 16);
TyData d41(17, 18);
TyData d51(19, 20);
m_stlist_ex.push_back(d11);
m_stlist_ex.push_back(d21);
m_stlist_ex.push_back(d31);
m_stlist_ex.push_back(d41);
m_stlist_ex.push_back(d51);
运行结果:
从结果来看,将构造好的对接使用emplace的结果和push_back的效果一样;push,只能让其构造函数构造好了对象之后,再使用复制构造函数插入集合;而emplace直接把原料拿进家里,自己造了一个。所以只有当使用参数,也就是说将emplace当做一个构造函数的时候才能体现出它的优势。
下面给出emplace的对应关系,方便大家理解。
函数 | 对应 |
---|---|
emplace_front | push_front |
emplace | insert |
emplace_back | push_back |
注意:emplace函数的参数根据元素的类型而变化,参数必须与元素类型的构造函数相匹配。