什么是 emplace_back?
emplace_back 是 C++11 引入的一个成员函数,用于在容器(如 std::vector、std::deque、std::list)的末尾直接构造元素,避免了不必要的临时对象创建和拷贝/移动操作。
emplace_back vs push_back
与 push_back 不同,emplace_back 接收的是构造函数参数,而不是一个已存在的对象。这使得它在性能上更具优势,尤其是在处理复杂对象时。
// 使用 push_back
std::vector<std::string> vec;
vec.push_back("Hello"); // 创建临时 string,再移动
// 使用 emplace_back
vec.emplace_back("Hello"); // 直接在 vector 内存中构造 string
使用示例
#include <vector>
#include <iostream>
struct Point {
int x, y;
Point(int x, int y) : x(x), y(y) {}
};
int main() {
std::vector<Point> points;
points.emplace_back(10, 20); // 直接构造 Point(10, 20)
std::cout << "Point: (" << points[0].x << ", " << points[0].y << ")\n";
return 0;
}
注意事项
- 仅适用于支持原位构造(in-place construction)的容器。
- 参数必须能匹配目标类型的某个构造函数。
- 对于简单类型(如 int、double),性能差异通常可忽略。