在C++开发过程中,我们经常会用STL的各种容器,比如vector,map,set等。在使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的push_back,map的insert,set的insert。这些插入操作会涉及到两次构造,首先是对象的初始化构造,接着在插入的时候会复制一次,会触发拷贝构造。但是很多时候我们并不需要两次构造带来效率的浪费,如果可以在插入的时候直接构造,就只需要构造一次就够了。

push_back/insert 插入操作过程:
1. 有参构造
2. 拷贝构造
3. 析构

C++11标准已经有这样的语法可以直接使用了,那就是emplace。vector有两个函数可以使用:emplace,emplace_back。emplace类似insert,emplace_back类似push_back。emplace的插入过程只调用了一次有参构造。

emplace 插入操作过程:
1. 有参构造
1、vectoremplace <->  insertemplace_back​  <-> ​push_back2、setemplcace <->  insert3、mapemplace <->  insert

通过示例代码可以更清晰的了解到他们的区别。

#include <iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<string>//Book结构,保存书本信息
struct SBook
{SBook() : bookName(""), price(0){std::cout << "default construct: " << bookName << std::endl;}SBook(std::string bookName_, int price_) : bookName(bookName_), price(price_){std::cout << "construct: " << bookName << std::endl;}SBook(SBook& rhs) : bookName(rhs.bookName), price(rhs.price){std::cout << "copy construct: " << bookName << std::endl;}~SBook(){std::cout << "deconstruct: " << bookName << std::endl;}bool operator <(const SBook& rhs) const{return bookName < rhs.bookName;}std::string bookName;int price;
};int main()
{//测试vectorstd::vector<SBook> books;// 预先分配,否则整个vector在容量不够的情况下重新分配内存books.reserve(100);std::cout << "test push_back:" << std::endl;books.push_back(SBook("C++从入门到放弃", 1));std::cout << std::endl;std::cout << "test emplace_back:" << std::endl;books.emplace_back("水浒传", 2);std::cout << std::endl;std::cout << "test emplace_back default:" << std::endl;books.emplace_back();auto& book = books.back();book.bookName = "红楼梦";book.price = 5;std::cout << std::endl;std::cout << "test emplace:" << std::endl;auto it = books.emplace(books.end());it->bookName = "西游记";it->price = 3;std::cout << std::endl;//std::cout << "output all books: " << std::endl;//for_each(books.begin(), books.end(), [](const SBook& book)->void//    {//        std::cout << book.bookName << std::endl;//    });//std::cout << std::endl; ​​​ // 测试setstd::set<SBook> bookSet;std::cout<< "test bookSet insert:" << std::endl;bookSet.insert(SBook("十万个为什么", 1));std::cout << std::endl;std::cout << "test bookSet emplace:" << std::endl;bookSet.emplace("新华字典", 2);std::cout << std::endl;//std::cout << "output bookset: " << std::endl;//for_each(bookSet.begin(), bookSet.end(), [](const SBook& book)->void//    {//        std::cout << book.bookName << std::endl;//    });//std::cout << std::endl;return 0;
}

vector:

set:

C++优化之使用emplace、emplace_back相关推荐

  1. C++优化之使用emplace

    在C++开发过程中,我们经常会用STL的各种容器,比如vector,map,set等,这些容器极大的方便了我们的开发.在使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的pus ...

  2. C++之emplace

    最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 首先,写 ...

  3. emplace与insert

    c++中容器定义了很多操作.其中有6种操作: emplace_front,emplace,emplace_back; push_front,insert,push_back 都可以向容器中添加元素,但 ...

  4. emplace_back减少内存拷贝和移动

    --------<深入应用C++11:代码优化与工程级应用>第2章使用C++11改进程序性能,本章将分别介绍右值引用相关的新特性.本节为大家介绍emplace_back减少内存拷贝和移动. ...

  5. c++11 emplace

    template <class... Args> pair<iterator, bool> emplace ( Args&&... args ); emplac ...

  6. C++11:右值引用、移动构造、std::move, 以及使用emplace_back代替push_back

    最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 1.右值 ...

  7. C++11:右值引用、move, 以及使用emplace_back代替push_back

    最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 1.右值 ...

  8. C++ vector 使用详解

    目录 介绍两个关键词 元素访问 迭代器 容量 修改操作 emplace() & emplace_back() std::erase & std::erase_if (std::vect ...

  9. 《C++ Primer 5th》笔记(9 / 19):顺序容器

    文章目录 顺序容器概述 确定使用哪种顺序容器 容器库概览 迭代器 迭代器范围 使用左闭合范围蕴含的编程假定 容器类型成员 begin和end成员 容器定义和初始化 将一个容器初始化为另一个容器的拷贝 ...

最新文章

  1. java对象转为json字符串
  2. html 弹出遮罩 iframe,iframe正在加载时显示遮罩层 加载完毕后显示iframe
  3. 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)
  4. 惊艳!28岁就任副教授,年纪轻轻已是博导、院长
  5. Java计算的XML面试题
  6. 文件、异常、模块——初步了解
  7. openfire 详细介绍一
  8. HTML5七夕情人节表白网页制作【圣诞节3d相册】HTML+CSS+JavaScript 圣诞节3D相册代码表白制作
  9. android studio 读取短信
  10. BIN转HEX,HEX转BIN,互相转换工具,PIC
  11. 3D Engine Demo
  12. 湖南大学计算机专业毕业生待遇,分享湖南大学2017年毕业生就业基本情况及质量薪资...
  13. 2017年2月14日实习日记 RHEL下dracut制作initramfs
  14. HTML5俄罗斯方块游戏CSDN,javascript+css实现俄罗斯方块小游戏
  15. 关于产品的一些思考——阿里巴巴之阿里旺旺
  16. 食品超声波设备的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. 2020北航计算机夏令营机试题目讲解
  18. pat 7-7 莫尔斯码(Morse Code) (15分) 模拟
  19. 系统变量和用户变量的区别
  20. 夏天水果店怎么打理,如何打理好一个水果店

热门文章

  1. 2021数模国赛A题
  2. 成年男性如何挑选衣服
  3. 关系型数据库迁移达梦数据库
  4. 生存还是毁灭?新物种爆发时代,企业请回答
  5. 准备2021年全国大学生数学建模竞赛 固赛助力
  6. C++的静态成员变量和静态成员函数
  7. #734. 徐老师的养花装置
  8. 微积分-微积分的本质
  9. 如果解决长尾数据(样本不均衡)
  10. 2019年未来软件工作室年会总结