C++优化之使用emplace、emplace_back
在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相关推荐
- C++优化之使用emplace
在C++开发过程中,我们经常会用STL的各种容器,比如vector,map,set等,这些容器极大的方便了我们的开发.在使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的pus ...
- C++之emplace
最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 首先,写 ...
- emplace与insert
c++中容器定义了很多操作.其中有6种操作: emplace_front,emplace,emplace_back; push_front,insert,push_back 都可以向容器中添加元素,但 ...
- emplace_back减少内存拷贝和移动
--------<深入应用C++11:代码优化与工程级应用>第2章使用C++11改进程序性能,本章将分别介绍右值引用相关的新特性.本节为大家介绍emplace_back减少内存拷贝和移动. ...
- c++11 emplace
template <class... Args> pair<iterator, bool> emplace ( Args&&... args ); emplac ...
- C++11:右值引用、移动构造、std::move, 以及使用emplace_back代替push_back
最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 1.右值 ...
- C++11:右值引用、move, 以及使用emplace_back代替push_back
最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 1.右值 ...
- C++ vector 使用详解
目录 介绍两个关键词 元素访问 迭代器 容量 修改操作 emplace() & emplace_back() std::erase & std::erase_if (std::vect ...
- 《C++ Primer 5th》笔记(9 / 19):顺序容器
文章目录 顺序容器概述 确定使用哪种顺序容器 容器库概览 迭代器 迭代器范围 使用左闭合范围蕴含的编程假定 容器类型成员 begin和end成员 容器定义和初始化 将一个容器初始化为另一个容器的拷贝 ...
最新文章
- java对象转为json字符串
- html 弹出遮罩 iframe,iframe正在加载时显示遮罩层 加载完毕后显示iframe
- 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)
- 惊艳!28岁就任副教授,年纪轻轻已是博导、院长
- Java计算的XML面试题
- 文件、异常、模块——初步了解
- openfire 详细介绍一
- HTML5七夕情人节表白网页制作【圣诞节3d相册】HTML+CSS+JavaScript 圣诞节3D相册代码表白制作
- android studio 读取短信
- BIN转HEX,HEX转BIN,互相转换工具,PIC
- 3D Engine Demo
- 湖南大学计算机专业毕业生待遇,分享湖南大学2017年毕业生就业基本情况及质量薪资...
- 2017年2月14日实习日记 RHEL下dracut制作initramfs
- HTML5俄罗斯方块游戏CSDN,javascript+css实现俄罗斯方块小游戏
- 关于产品的一些思考——阿里巴巴之阿里旺旺
- 食品超声波设备的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 2020北航计算机夏令营机试题目讲解
- pat 7-7 莫尔斯码(Morse Code) (15分) 模拟
- 系统变量和用户变量的区别
- 夏天水果店怎么打理,如何打理好一个水果店