场景:向一个vector
末尾插入一个元素,一般我们使用的函数是push_back
,代码如下:
#include <iostream>
#include <vector>
class ComplexClass{
public:
ComplexClass(){
std::cout<<"Constructor"<<std::endl;
}
~ComplexClass(){
std::cout<<"Destructor"<<std::endl;
}
private:
//some data member
};
int main(){
std::vector<ComplexClass> vec;
vec.push_back(ComplexClass());
return 0;
}
执行上述的代码,结果如下:
Constructor
Destructor
Constructor
Destructor
为了在一个vector的末尾添加一个元素,C++竟然将这个元素构建了两次,这两次分别是:
- 在栈上构建这个对象
- 将这个对象以参数传入
push_back
的时候还要构建一次
这明显是不可接受的,为了解决这个问题,C++11引入了emplace_back
,该函数的作用是直接在emplace_back中构建对象,而不是以参数的形式传入。所以这个函数的实际参数是可以构建对象的构造函数的参数。由于ComplexClass
的构造函数是没有参数的,所以,上述的代码可以修改为
vec.emplace_back();
代码修改后的运行结果为:
Constructor
Destructor
网友评论