emplace_back()
是C++11的新特性
emplace_back()和push_back()的区别
push_back()
在vector尾部添加一个元素时,首先会创建一个临时对象,然后再将这个临时对象移动或拷贝到 vector 中- 如果是拷贝的话,事后会自动销毁先前创建的这个临时元素
emplace_back()
是直接在 vector 尾部创建这个元素,省去了移动或者拷贝元素的过程- 但
emplace_back()
并不是任何场景效率都比push_back()
高
emplace_back()效率更高的应用场景
在向 vector 中添加元素时(假设元素类型是一个类类型)
- 如果添加的是类类型的有参构造函数的参数类型对应的变量:
- 如果通过
push_back()
方式添加,则会调用一次有参构造 + 一次移动构造 ,如果移动构造不可用则为拷贝构造 - 如果通过
emplace_back()
方式添加,则只会调用一次有参构造
- 如果通过
- 如果添加的是类类型的变量:
- 不论是通过
push_back()
方式还是emplace_back()
方式,都只会调用一次拷贝构造
- 不论是通过
1 | class Person { |
以有参构造中的参数类型的变量作为实参来使用 push_back()
和emplace_back()
,可以提升效率,但我认为这种实参形式不易于理解