push_back()与emplace_back()
vector<string> res;
res.push_back()
和 res.emplace_back()
在功能上类似,但它们之间有一些关键的区别。让我们详细比较一下它们:
1. push_back()
- 作用:将一个已经构造好的对象添加到容器的末尾。
-
语法:
res.push_back(value);
-
特点:
-
push_back()
会复制或移动一个现有对象到容器中。 - 必须先构造
value
对象,然后才能将其添加到容器中。
-
示例:
std::vector<std::string> res;
std::string s = "hello"; // 构造对象
res.push_back(s); // 复制 s 到 res 中
// 或者使用移动
res.push_back(std::move(s)); // 移动 s 到 res 中
2. emplace_back()
- 作用:直接在容器的末尾原地构造对象。
-
语法:
res.emplace_back(args...);
-
特点:
-
emplace_back()
通过传递构造函数的参数,直接在容器末尾构造对象,避免了不必要的临时对象和拷贝。 - 更高效,尤其是在对象的构造和拷贝成本较高时(如复杂类对象)。
-
示例:
std::vector<std::string> res;
res.emplace_back("hello"); // 直接在容器中构造一个 std::string 对象
主要区别:
区别 | push_back() | emplace_back() |
---|---|---|
对象构造 | 需要一个已构造的对象进行复制或移动。 | 直接在容器内构造对象,避免临时对象。 |
性能 | 可能涉及一次或多次拷贝/移动操作。 | 通常更高效,避免了不必要的拷贝或移动。 |
使用场景 | 已有对象或简单对象。 | 构造复杂对象或需要传递构造函数参数时。 |
总结:
- 如果你已经有一个对象实例并想将它添加到容器中,使用
push_back()
。 - 如果你想直接在容器中构造对象,避免拷贝或移动,使用
emplace_back()
。
在现代 C++ 编程中,如果需要构造对象,通常推荐使用 emplace_back()
,因为它可以提高性能并简化代码。
允许的
vector<string> res;
res.push_back();
res.push_back("hello");
区别 push_back("hello") emplace_back("hello")
操作 隐式构造 std::string,然后移动或复制。 直接在容器中构造 std::string。
性能 可能涉及一次构造和一次移动操作。 通常更高效,避免额外的移动。
推荐场景 已经有现成的 std::string 对象。 直接使用构造参数构造对象。