emplace/emplace_back

emplace_back/emplace等能通过参数直接在容器中构造对象,相比push_back/insert能更好避免内存的拷贝与移动。
emplace_back的函数原型为

template <class... Args>
  void emplace_back (Args&&... args);
  • 所有的标准库容器都增加了类似的方法emplace、emplace_hint、emplace_front、emplace_after和emplace_back。
  • emplace能通过构造函数的参数就直接构造对象,如果没有相应的构造函数则会报错
    可以通过下面的例子来看其基本的使用和特性
#include<iostream>
#include<map>
#include<vector> 
using namespace std;
struct Test {
    int a;
    string b;
    Test(int _a, string _b):a(_a), b(_b){
        cout << "construct" << endl;
    }
    Test(const Test&& test):a(test.a), b(move(test.b)) {
        cout << "move" << endl;
    }
};

int main() {
    map<int, Test> m;
    int a = 0;
    string b = "test";
    cout << "--insert--" << endl;
    m.insert(make_pair(4, Test(a, b)));
    cout << "--emplace--" << endl;
    m.emplace(4, Test(a, b)); //通过构造函数参数直接构造对象 
    
    vector<Test> v;
    cout << "--push_back--" << endl;
    v.push_back(Test(a,b));
    cout << "--emplace_back--" << endl;
    v.emplace_back(a, b);
    
}

其输出为


image.png

上面例子是在TDM-GCC 4.8中的运行结果。emplace比insert少用一次移动拷贝构造函数、push_back和emplace_back的运行情况相同。可以看出,emplace*的性能与STL的具体实现和编译器都有关系。不过一般情况下emplace(或emplace_back等)的性能要好于insert(或push_back等)的性能。关于emplace实现可能存在的问题可参考https://stackoverflow.com/questions/4303513/push-back-vs-emplace-back

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容