温馨提示×

c++中push_back函数与emplace_back的区别

c++
小樊
143
2024-09-16 16:04:07
栏目: 编程语言

push_backemplace_back 都是 C++ 标准库中容器(如 vector、list 等)的成员函数,用于在容器末尾添加元素。但它们之间有一些重要的区别:

  1. 参数

    • push_back 需要一个已经构造好的对象作为参数,然后将这个对象复制或移动到容器的末尾。
    • emplace_back 则直接在容器的末尾构造一个新的对象,它接受与对象构造函数相匹配的参数。
  2. 性能

    • 使用 push_back 时,如果对象已经存在,那么可能会涉及到额外的复制或移动操作,这可能会影响性能。
    • 使用 emplace_back 时,由于对象是直接在容器内构造的,因此通常可以提供更好的性能,特别是对于大型对象或者需要复杂构造过程的对象。
  3. 适用场景

    • 如果你已经有了一个构造好的对象,并且想将其添加到容器中,那么使用 push_back 是合适的。
    • 如果你想直接在容器中构造一个新的对象,并且不需要先创建一个临时对象,那么使用 emplace_back 是更好的选择。

下面是一个简单的示例,展示了 push_backemplace_back 的用法:

#include<iostream>
#include<vector>

class MyClass {
public:
    MyClass(int x, int y) : x_(x), y_(y) {
        std::cout << "MyClass constructed with (" << x_ << ", " << y_ << ")\n";
    }

private:
    int x_;
    int y_;
};

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

    // 使用 push_back,先创建一个对象,然后复制到容器中
    MyClass obj(1, 2);
    vec.push_back(obj);

    // 使用 emplace_back,直接在容器中构造对象
    vec.emplace_back(3, 4);

    return 0;
}

在这个示例中,MyClass 是一个简单的类,它有一个接受两个整数参数的构造函数。在 main 函数中,我们创建了一个 std::vector<MyClass> 容器,并使用 push_backemplace_back 向其添加元素。注意,当使用 emplace_back 时,我们没有先创建一个 MyClass 对象,而是直接传递了构造函数所需的参数。

0