emplace/emplace_back

2018-08-12  本文已影响0人  _gentle

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

template <class... Args>
  void emplace_back (Args&&... args);
#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

上一篇 下一篇

猜你喜欢

热点阅读