push_back 和 emplace_back
网络上讲这两个操作差异的文章很多,这里仅从使用差异分析。
定义
假设:
- 控制变量:当前vector能够容下push_back和emplace_back的所有元素,没有触发扩容操作。 使用
vector.reserve()
; - push_back和emplace_back操作的对象类型:
- 普通变量、普通变量
- 普通变量、临时变量
- 临时变量、普通变量
- 临时变量、临时变量
实验的类Foo
#include <iostream>
#include <vector>
class Foo {
public:
// default ctor
Foo(int value = 0) : value_(value) {
std::cout << "Foo(int value = 0)" << std::endl;
}
// copy ctor
Foo(const Foo& foo) : value_(foo.value_) {
std::cout << "Foo(const Foo& foo)" << std::endl;
}
// move ctor
Foo(Foo&& foo) : value_(foo.value_) {
foo.value_ = 0;
std::cout << "Foo(Foo&& foo)" << std::endl;
}
// copy assignment
Foo& operator=(const Foo& foo) {
value_ = foo.value_;
std::cout <<