在之前的学习中,了解到在STL中,进行插入元素的时候,有insert和push两种选择方式,而在有了右值引用和移动语义的时候,就提出了更高效的插入方法:emplace_back,下面来介绍一下C++11新特性中的emplace_back是怎样的:
先来看一下代码来分析:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
struct Youbain
{
string _contry;
string _privence;
int _number;
Youbain(string&& contry, string&& privence, int number)
:_contry(std::move(contry)), _privence(std::move(privence)), _number(number)
{
cout << "转移构造" << endl;
}
Youbain(Youbain&& y)
:_contry(std::move(y._contry)), _privence(std::move(y._privence)), _number(y._number)
{
cout << "转移拷贝" << endl;
}
Youbain& operator = (const Youbain& y) = default;
}
int main()
{
vector<Youbain> el;
el.emplace_back("China", "Shannxi", 610000);
el.push_back(Youbain("China", "Beijing", 10000));
}
在执行emplace_back的时候,只调用了转移构造函数,在插入的时候直接构造,效率更高,减少额外空间的开辟
在执行push_back的时候,调用了构造和拷贝构造函数,因为在使用push_back()向容器中加入一个右值元素(临时对象)时,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题就是临时变量申请资源的浪费。