c++ emplace_back()和push_back()的区别
emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
#include <vector>
#include <iostream>
using namespace std;
class testDemo
{
public:
testDemo(int num):num(num){
std::cout << "调用构造函数" << endl;
}
testDemo(const testDemo& other) :num(other.num) {
std::cout << "调用拷贝构造函数" << endl;
}
testDemo(testDemo&& other) :num(other.num) {
std::cout << "调用移动构造函数" << endl;
}
private:
int num;
};
int main()
{
cout << "emplace_back:" << endl;
std::vector<testDemo> demo1;
demo1.emplace_back(2); //可以被认为是一个右值
cout << "push_back:" << endl;
std::vector<testDemo> demo2;
demo2.push_back(2);
}
{"mode":"full","isActive":false}
运行结果:
emplace_back:
调用构造函数
push_back:
调用构造函数
调用移动构造函数
总结:
1. push_back 可以接收左值也可以接受右值,接收左值时使用拷贝构造,接收右值时使用移动构造
2. emplace_back 接收右值时调用类的移动构造
3. emplace_back 接收左值时,实际上的执行效果是先对传入的参数进行拷贝构造,然后使用拷贝构造后的副本,也就是说,emplace_back在接收一个左值的时候其效果和push_back一致!所以在使用emplace_back 时需要确保传入的参数是一个右值引用,如果不是,请使用std::move()进行转换
4. emplace_back 接收多个参数时,可以调用匹配的构造函数实现在容器内的原地构造。
最后放一张相关内容的图片:
不想讀研的研究僧: 应该是开发岗,现在已凉
花川镜雅: 请问投的什么岗呀
不想讀研的研究僧: 是字符串的第k个字符吧
杠杠的丶: 我忘了返回的是什么了,是第n个字母吗
不想讀研的研究僧: 已经忘了,可以找找别人写的 当时没在本地写