c++ stl中的emplace_back和push_back

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值