push_back 和 emplace_back 的区别
发布人:shili8
发布时间:2025-03-01 16:49
阅读次数:0
**推送和emplace_push_back的区别**
在C++中,`push_back()`和`emplace_back()`是两个常用的函数,它们都用于向容器(如vector、list等)添加新元素。但是,这两个函数有着不同的使用场景和实现原理。
###1. push_back()
`push_back()`函数的作用是将一个已有的对象追加到容器的末尾。它接受一个参数,通常是一个值类型(如int、double等),或者一个引用类型(如string等)。当你调用`push_back()`时,它会创建一个新的对象,并将其添加到容器中。
cpp// 使用 push_back() 添加元素std::vector<int> vec; vec.push_back(10); // 创建一个新对象 int(10) 并追加到 vec 中
###2. emplace_back()
`emplace_back()`函数的作用与`push_back()`类似,但它接受的是参数列表,而不是一个已有的对象。通过使用`emplace_back()`,你可以直接在容器中创建一个新元素,而不需要额外的拷贝或移动操作。
cpp// 使用 emplace_back() 添加元素std::vector<int> vec; vec.emplace_back(10); // 直接在 vec 中创建一个 int(10) 元素
### 区别**1. 对象创建方式**
`push_back()`会创建一个新的对象,然后追加到容器中,而`emplace_back()`则直接在容器中创建一个新元素。
**2. 拷贝或移动操作**
当使用`push_back()`时,如果你传入的是一个引用类型(如string等),那么它会进行拷贝或移动操作;而如果你传入的是一个值类型(如int、double等),那么它不会进行任何拷贝或移动操作。相比之下,`emplace_back()`则不需要额外的拷贝或移动操作,因为它直接在容器中创建了一个新元素。
**3. 性能**
由于`emplace_back()`不需要额外的拷贝或移动操作,因此它通常比`push_back()`更快。特别是在添加大量元素时,使用`emplace_back()`可以显著提高性能。
###代码示例
cpp#include <iostream> #include <vector> int main() { // 使用 push_back() 添加元素 std::vector<int> vec1; vec1.push_back(10); // 创建一个新对象 int(10) 并追加到 vec1 中 vec1.push_back(20); // 创建一个新对象 int(20) 并追加到 vec1 中 // 使用 emplace_back() 添加元素 std::vector<int> vec2; vec2.emplace_back(10); // 直接在 vec2 中创建一个 int(10) 元素 vec2.emplace_back(20); // 直接在 vec2 中创建一个 int(20) 元素 // 输出结果 std::cout << "vec1: "; for (int i : vec1) { std::cout << i << " "; } std::cout << std::endl; std::cout << "vec2: "; for (int i : vec2) { std::cout << i << " "; } std::cout << std::endl; return0; }
### 总结`push_back()`和`emplace_back()`都是用于向容器添加新元素的函数,但它们有着不同的使用场景和实现原理。`push_back()`会创建一个新的对象,然后追加到容器中,而`emplace_back()`则直接在容器中创建一个新元素。由于`emplace_back()`不需要额外的拷贝或移动操作,因此它通常比`push_back()`更快。