vector emplace_back push_back
时间: 2023-05-01 18:02:47 浏览: 129
vector中的emplace_back和push_back都是向向量末尾插入一个元素的函数。emplace_back是在向量末尾插入一个构造函数的参数列表,然后在向量内部构造一个新元素;push_back则是在向量末尾插入一个已构造好的元素。不过,由于emplace_back可以直接在向量内部构造对象,所以通常会比push_back更高效。
相关问题
vector的push_back和emplace_back
vector是C++ STL中的一个容器,用于存储线性序列的数据。在向vector中添加元素时,可以使用push_back和emplace_back两个函数。
push_back函数将一个元素添加到vector的末尾,如下所示:
```c++
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
```
emplace_back函数也将一个元素添加到vector的末尾,但它是通过调用元素的构造函数来构造元素的,而不是先构造一个临时对象再将其复制到vector中,如下所示:
```c++
std::vector<std::pair<int, std::string>> v;
v.emplace_back(1, "one");
v.emplace_back(2, "two");
v.emplace_back(3, "three");
```
在使用emplace_back函数时,我们可以直接传递构造函数中需要的参数,这样可以避免构造临时对象的开销,从而提高程序的效率。因此,如果元素类型支持移动构造函数,那么emplace_back函数通常比push_back函数更快。
emplace_back和push_back
emplace_back和push_back都是vector容器的成员函数,用于在容器的末尾添加元素。但是它们有一些不同之处。
push_back需要传入一个具体的元素,而emplace_back可以直接传入构造该元素所需的参数,然后容器会在内部自行构造元素。这意味着,如果添加的是一个较大的对象,使用emplace_back可以避免不必要的复制或移动操作,减少开销。同时,emplace_back也有更好的性能优化,因为它不需要调用复制构造函数或移动构造函数。
例如,假设存在一个名为Student的类,其构造函数需要传入一个string类型的学生姓名和一个int类型的学生年龄。如果想要向一个vector<Student>容器中添加一个学生,可以这样写:
```
std::vector<Student> students;
// push_back方式
Student s1("Tom", 18);
students.push_back(s1);
// emplace_back方式
students.emplace_back("Tom", 18);
```
可以看到,使用emplace_back的语法更加简洁。但是需要注意的是,由于emplace_back使用了变长模板实现,所以要保证传入的参数类型正确,并且构造函数的参数列表应该与传入的参数一一对应。
在总体上,emplace_back是更加灵活、性能更好的选择,但是如果只需要向容器中添加简单类型的元素,使用push_back就足够了。
阅读全文