emplace_back()是c++11的新特性。和push_back()的区别在于push_back()方法要调用构造函数和复制构造函数,这也就代表着要先构造一个临时对象,然后把临时的copy构造函数拷贝或者移动到容器最后面。
而emplace_back()在实现时,则是直接在容器的尾部创建这个元素,省去了拷贝或移动元素的过程。
vector<pair<int, int>> ret; ret.push_back(1,1)//会报错,因为没有构造一个临时对象 ret.push_back(pair(1,1))//不会报错,因为构成了一个pair对象 ret.emplace_back(1,1)//不会报错,因为直接在容器的尾部创建对象
class A { public: A(int i){ str = to_string(i); cout << "构造函数" <<++i<< endl; } ~A(){} A(const A& a): str(a.str){ cout << "拷贝构造" <<++j<< endl; } public: string str; }; int main(){ vector<A> vec; vec.reserve(10);//开辟capacity for(int i=0;i<10;i++){ vec.push_back(i); //调用了10次构造函数和10次拷贝构造函数, // vec.emplace_back(i); //调用了10次构造函数,一次拷贝构造函数都没有调用过 } }
C++11 新特性—EMPLACE操作
新标准引入了:
- emplace_front : 在容器的头部创建元素,返回void;对应push_front。
- emplace:在迭代器指向的元素之前创建一个元素,并返回新添加元素的迭代器;对应insert 。
- emplace_back : 在容器的尾部创建元素,返回void;对应push_back。
这些操作构造而不是拷贝元素到容器中,即直接调用构造函数,不会调用拷贝构造函数,省去了拷贝所需的时间和资源,更加高效。
emplace操作与push、insert的区别:
emplace成员函数利用传入的参数在容器管理的内存中直接构造元素;push与insert成员函数则是将传入的元素类型对象拷贝到容器中,或创建一个局部临时对象,并将其压入容器中。
注意:emplace函数的参数根据元素类型而变化,参数必须与元素类型的构造函数相匹配。
此外,可以利用emplace函数将char型字符转换成string类型字符串压入容器中:
vector<string>v; char ch = 'a'; v.emplace_back(1, ch);//利用string(int n,char c)构造n个c的字符串