C++11 新特性 emplace操作 使用心得

C++11 新引入了emplace()/empalce_front()/empalce_back()三个操作,对应了insert()/push_front()/push_back()操作。

不同之处是:

  • insert是进行拷贝操作,而emplace是直接在容器的内存空间中进行构造一个对象。

这可以提高代码的运行效率, 避免不必要的copy操作。

下面看代码:

#include <iostream>
#include <list>
using namespace std;
class TyData {
public:
    TyData(int a, int b) {
        x = a;
        y = b;
        cout << "这是构造函数\n";
    }
    TyData(const TyData &d) {
        cout << "这是复制构造函数\n";
        x = d.x;
        y = d.y;
    }
    void showTydata() { cout << "x:" << x << " y:" << y << endl; }

private:
    int x;
    int y;
};
void main() {
    cout << "use emplace :(parameter)\n";
    std::list< TyData > m_emplace_list;
    m_emplace_list.emplace_back(1, 2);
    m_emplace_list.emplace_back(3, 4);
    m_emplace_list.emplace_back(5, 6);
    m_emplace_list.emplace_back(7, 8);
    m_emplace_list.emplace_back(9, 10);

    cout << "not use emplace but objec:" << endl;
    TyData d1(11, 12);
    TyData d2(13, 14);
    TyData d3(15, 16);
    TyData d4(17, 18);
    TyData d5(19, 20);

    std::list< TyData > m_stlist;
    m_stlist.push_back(d1);
    m_stlist.push_back(d2);
    m_stlist.push_back(d3);
    m_stlist.push_back(d4);
    m_stlist.push_back(d5);

    cout << "use emplace :(objec)" << endl;
    m_emplace_list.emplace_back(d1);
    m_emplace_list.emplace_back(d2);
    m_emplace_list.emplace_back(d3);
    m_emplace_list.emplace_back(d4);
    m_emplace_list.emplace_back(d5);

    system("pause");
    return 0;
}

运行结果:

可以看出,

  • 使用emplace_back()直接赋值是直接在容器的内存空间中进行构造一个对象。而push_back()需要调用复制构造函数。
  • 当emplace_back()和push_back()追加已经构造好的对象时,两者没有区别,都会调用拷贝构造。

所以只有当使用参数,也就是说将emplace当做一个构造函数的时候才能体现出它的优势。

posted @   Happinesspill  阅读(211)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示