C++标准库容器的emplace_back 和push_back方法的区别

emplace_backpush_back 是 C++ 标准库容器(如 std::vectorstd::liststd::deque 等)中用于在容器末尾添加元素的方法。它们在功能上类似,但有一些关键的区别:

  1. 参数传递方式

    • push_back:接受一个已经构造好的元素,然后将其副本插入容器。这意味着在调用 push_back 时,需要先构造一个元素,然后将其复制或移动到容器中。
    • emplace_back:接受构造元素所需的参数,并在容器内部直接构造一个新的元素。这避免了额外的复制或移动操作。
  2. 构造和移动成本

    • push_back:需要构造一个元素并将其插入容器,可能涉及拷贝或移动构造,因此可能会有额外的性能开销。
    • emplace_back:直接在容器内部构造元素,避免了额外的构造和移动开销,因此通常比 push_back 更高效。
  3. 代码简洁性

    • push_back:需要先创建一个元素,然后再通过 push_back 将其插入,这可能会使代码更冗长。
    • emplace_back:由于可以直接传递构造参数,代码可能会更加简洁。
  4. 支持类型

    • push_back:支持传递已经构造好的对象,适用于任何支持拷贝或移动构造的类型。
    • emplace_back:支持直接在容器内构造对象,适用于任何可构造的类型。

示例代码:

#include <iostream>
#include <vector>

class MyClass {
public:
    MyClass(int value) : data(value) {
        std::cout << "Constructor" << std::endl;
    }

private:
    int data;
};

int main() {
    std::vector<MyClass> vec;

    // 使用 push_back
    vec.push_back(MyClass(1));

    // 使用 emplace_back
    vec.emplace_back(2);

    return 0;
}

在这个示例中,使用 push_back 会导致 MyClass 的构造函数被调用两次,因为要先构造一个临时对象,然后将其复制到容器中。而使用 `emplace

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值