#include <iostream>
#include <vector>
using namespace std;
class test1 {
public:
int a;
int b;
//test1(int m, int n) :a(m), b(n) { cout << "constructor1"; }
//test1(int& m, int& n) :a(m), b(n) { cout << "constructor2"; }
test1(int&& m, int&& n) :a(m), b(n) { cout << "constructor3" << endl;; }
test1(const int& m, const int& n) :a(m), b(n) { cout << "constructor4" << endl;; }
//test1(test1& m) { a = m.a; b = m.b; cout << "constructor5" << endl;; }
test1(const test1& m) { a = m.a; b = m.b; cout << "constructor6"<<endl; }
test1(test1&& m) { a = m.a; b = m.b; cout << "constructor7" << endl; }
};
int main() {
int a = 10, b = 11;
test1 m(1, 2);
vector<test1> a1;
a1.push_back(test1(3,4)); //constructor7
a1.push_back(m); //constructor6
a1.emplace_back(test1(3,4)); //constructor7
a1.emplace_back(m); //constructor6
a1.emplace_back(3,4); //constructor3
a1.emplace_back(a,b); //constructor4
return 0;
}
由此可见,当创建类型为vector<T>的vector且插入类型为T的元素时,push_back和emplace_back并无区别,都是根据参数的类型调用复制/移动构造函数并插入。emplace_back的作用在于当存在T(a, b, c...)的构造函数时,可以直接传入a, b, c...,这样比起push_back可以少调用一次构造函数。
不过有个问题不太明白,比如定义了vector<vector<int>>类型的变量,但无法emplace_back initializer_list类型的参数:
vector<vector<int>> x;
vector<int> y({ 1,2,3 }); //correct
x.emplace_back({ 1,2,3 }); //compile error