C++中push_back和emplace_back的区别(代码+踩坑记录

文章讲述了C++中`push_back`和`emplace_back`的区别,前者涉及临时对象构造和拷贝,后者直接在容器末尾构造,避免拷贝。通过自定义类A的实例,展示了如何通过`emplace_back`提高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 主要区别

如果要将一个临时变量push到容器的末尾:

  • push_back()需要先构造临时对象,再将这个对象拷贝到容器的末尾,
  • emplace_back()则直接在容器的末尾构造对象,这样就省去了拷贝的过程。

2. 自定义一个数据类型测试

2.1 push_back

class A
{
public:
    A(int i) {
        this->str = std::to_string(i);
        cout << "构造函数" << endl;
    };
    ~A() {};

    A(const A& other) :str(other.str) {
        cout << "拷贝构造函数" << endl;
    };
    string str;
};


void fun() {
	vector<A> v1;
	v1.reserve(3);
	for (int i = 0; i < 3; i++)
	{
		v1.push_back(A(i));
		//v1.emplace_back(i);
	}
}

输出是3次构造, 3次拷贝:

2.2 emplace_back 

传入的参数是什么很重要!!!!!!

如果传入A(i),也是3次构造,3次拷贝。因为A(i)相当于构造了对象,再把对象传入。


void fun() {
	vector<A> v1;
	v1.reserve(3);
	for (int i = 0; i < 3; i++)
	{
		v1.emplace_back(A(i)); // 传入 A(i)
        //v1.emplace_back(i);
	}
}

 

直接传入i,emplace back 会自动在末尾构造对象,不需要拷贝。


void fun() {
	vector<A> v1;
	v1.reserve(3);
	for (int i = 0; i < 3; i++)
	{
		//v1.emplace_back(A(i)); // 传入 A(i)
        v1.emplace_back(i);  //直接传i
	}
}

 从输出结果可以看到,仅仅调用了三次构造函数!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值