emplace_back()是c++11引入的一个新特性,它是用来向STL容器中丢入元素到容器尾部的,那么它对比push_back()有哪些优化呢?
写一个demo如下:
为了防止vector扩容带来的影响,所以直接先reserve出10个位置
#include<bits/stdc++.h>
#include<time.h>
using namespace std;
class A{
public:
A(int b):a(b){
cout<<"构造\n";
}
A(const A& B){
a=B.a;
cout<<"拷贝\n";
}
private:
int a;
};
int main(){
vector<A> test;
test.reserve(20);
cout<<"push_back():\n";
for(int i=0;i<10;i++){
cout<<i<<":\n";
test.push_back(i);
}
cout<<"\n\nemplace_back():\n";
for(int i=0;i<10;i++){
cout<<i<<":\n";
test.emplace_back(i);
}
return 0;
}
以下是输出结果:
push_back():
0:
构造
拷贝
1:
构造
拷贝
2:
构造
拷贝
3:
构造
拷贝
4:
构造
拷贝
emplace_back():
0:
构造
1:
构造
2:
构造
3:
构造
4:
构造
容易发现,push_back每次会调用一次构造函数和拷贝构造,而emplace_back每次只会调用一次构造函数
原因是,emplace_back是原地构造的,即直接在容器尾部进行构造,而push_back则是在容器外先创建一个对象,然后调用拷贝构造放到容器尾部