在之前的学习中,了解到在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()向容器中加入一个右值元素(临时对象)时,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题就是临时变量申请资源的浪费。


















