📜  C++ STL 向量中的 push_back() 与 emplace_back()(1)

📅  最后修改于: 2023-12-03 15:13:55.064000             🧑  作者: Mango

C++ STL中的push_back()与emplace_back()

在C++ STL中,vector是最常用的容器之一。push_back()和emplace_back()是vector中添加新元素的两种方法。

push_back()

push_back()方法可以将一个元素添加到vector的末尾。其语法如下:

vector_name.push_back(value)

其中,vector_name代表vector的名称,value代表要添加的元素。

例如,下面的代码创建了一个大小为5的int型vector,然后通过push_back()方法添加了两个元素:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec{1, 2, 3, 4, 5};
    vec.push_back(6);
    vec.push_back(7);

    for (auto i : vec)
        cout << i << " ";

    return 0;
}

输出:

1 2 3 4 5 6 7
emplace_back()

emplace_back()方法与push_back()类似,都可以在vector的末尾添加元素。但是,它是直接在vector的末尾构造一个新元素,而不是先构造一个对象再拷贝到vector中。这样可以避免额外的构造和拷贝开销,提高程序效率。

其语法如下:

vector_name.emplace_back(args)

其中,vector_name代表vector的名称,args代表新元素的构造参数列表。

例如,下面的代码创建了一个大小为0的Person型vector,然后通过emplace_back()方法添加了两个Person对象:

#include <iostream>
#include <vector>

using namespace std;

class Person
{
public:
    Person(int _age, string _name) : age(_age), name(_name) {}

    int age;
    string name;
};

int main()
{
    vector<Person> vec;
    vec.emplace_back(20, "Alice");
    vec.emplace_back(25, "Bob");

    for (auto p : vec)
        cout << p.age << " " << p.name << endl;

    return 0;
}

输出:

20 Alice
25 Bob

需要注意的是,emplace_back()方法的参数会被直接传递给vector中元素的构造函数。因此,如果vector中存储的是指针,需要传递指向new出来的对象的指针,而不是指针本身。

总结

push_back()和emplace_back()都是向vector中添加新元素的方法,但是它们的实现方式不同。一般来说,我们应该尽量使用emplace_back(),以提高程序效率。