vector::push_back()的输入参数是对象本身;
vector::emplace_back()的输入参数是构造函数的参数args,它可以根据这些参数构造一个对象。
emplace_back()有个好处,它是调用带有args的allocator_traits :: construct来“就地(in-place)构造”,防止了“先调用constructor构造对象,然后调用copy-constructor再构造一次”的性能损失。
#include <iostream>
#include <vector>
using namespace std;
class A{
public:
explicit A(int x):x_(x){
cout << "A(int)" << endl;
}
A(const A&){
cout << "A(const A&)" << endl;
}
private:
int x_;
};
int main(){
vector<A> vec;
vec.reserve(10); // 防止vector容量变化导致的再分配
vec.push_back(A(10)); // correct!先调用A(int),再调用A(const int&),有两次构造
// vec.push_back(10); // error: no matching function for call to ‘std::vector<A>::push_back(int)’
vec.emplace_back(A(10)); // correct!先调用A(int),再调用A(const int&),有两次构造
vec.emplace_back(20); // correct!直接调用A(int),只有一次构造
return 0;
}