emplace_back/emplace等能通过参数直接在容器中构造对象,相比push_back/insert能更好避免内存的拷贝与移动。
emplace_back的函数原型为
template <class... Args>
void emplace_back (Args&&... args);
- 所有的标准库容器都增加了类似的方法emplace、emplace_hint、emplace_front、emplace_after和emplace_back。
- emplace能通过构造函数的参数就直接构造对象,如果没有相应的构造函数则会报错
可以通过下面的例子来看其基本的使用和特性
#include<iostream>
#include<map>
#include<vector>
using namespace std;
struct Test {
int a;
string b;
Test(int _a, string _b):a(_a), b(_b){
cout << "construct" << endl;
}
Test(const Test&& test):a(test.a), b(move(test.b)) {
cout << "move" << endl;
}
};
int main() {
map<int, Test> m;
int a = 0;
string b = "test";
cout << "--insert--" << endl;
m.insert(make_pair(4, Test(a, b)));
cout << "--emplace--" << endl;
m.emplace(4, Test(a, b)); //通过构造函数参数直接构造对象
vector<Test> v;
cout << "--push_back--" << endl;
v.push_back(Test(a,b));
cout << "--emplace_back--" << endl;
v.emplace_back(a, b);
}
其输出为
上面例子是在TDM-GCC 4.8中的运行结果。emplace比insert少用一次移动拷贝构造函数、push_back和emplace_back的运行情况相同。可以看出,emplace*的性能与STL的具体实现和编译器都有关系。不过一般情况下emplace(或emplace_back等)的性能要好于insert(或push_back等)的性能。关于emplace实现可能存在的问题可参考https://stackoverflow.com/questions/4303513/push-back-vs-emplace-back