当前位置: 首页 > news >正文

C++11之emplace

emplace

  • 可变参数模版
  • emplace系列
  • 总结

可变参数模版

C++11⽀持可变参数模板,也就是说支持可变数量参数的函数模板和类模板,可变数⽬的参数被称为参数包,存在两种参数包:模板参数包,表示零或多个模板参数;函数参数包:表示零或多个函数参数。

template <class ...Args> void Func(Args... args) {}
template <class ...Args> void Func(Args&... args) {}
template <class ...Args> void Func(Args&&... args) {}

我们用省略号来指出⼀个模板参数或函数参数的表示⼀个包,在模板参数列表中,class…或typename…指出接下来的参数表示零或多个类型列表;在函数参数列表中,类型名后⾯跟…指出接下来表示零或多个形参对象列表;函数参数包可以用左值引用或右值引用表示,跟前⾯普通模板⼀样,每个参数实例化时遵循引用折叠规则。

可变参数模板的原理跟模板类似,本质还是去实例化对应类型和个数的多个函数。

可以使⽤sizeof…运算符去计算参数包中参数的个数。
在编译时来确定包的参数个数。

emplace系列

在这里插入图片描述

emplace系列的接口就是上述的可变参数模版。
先说结论:emplace在插入字面常量的时候要比push_back要高效,因为此时emplace是直接构造,而push_back是构造+移动构造+析构。如果插入的是左值或者右值,效率都一样。
原因就是当插入的是字面常量的时候,emplace是模板函数,而push_back是一个普通函数,因为push_back在类实例化的时候就已经确定了,而emplace是在函数传参的时候才会确定。
在这里插入图片描述
那么此时就会进行推演加构造,如果是多个参数就会把参数包给传递下去最后直接在容器里面构造对象。

总结

STL的容器都推荐使用emplace系列,虽然不是每次插入都会比push_back效率高。
但是在传递参数的时候要传对象参数包,例如

list<pair<string,int>>l;
l.emplace_back("1111",2);
l.push_back({"1111",2});

注意两者的区别,对于多参数的类型,如果有{}会识别成initializer_list,这就导致emplace是无法进行识别参数类型的,所以对于多参数类型,emplace是传递的对象参数包。

http://www.lryc.cn/news/586352.html

相关文章:

  • 【C++】封装红黑树模拟实现set和map
  • 支付宝购买功能的使用
  • EPLAN 电气制图(七):电缆设计全攻略
  • 从0设计一个短链接服务:如何实现尽可能短、可变长的短网址系统?
  • NLP:RNN文本生成案例分享
  • 【MediaSoup】MS_DUMP打印转换为PLOGI的形式
  • CTFHub————Web{信息泄露[Git泄露(Stash、Index)]}
  • React - createPortal
  • React useState原理解密:从源码到实战
  • python的婚纱影楼管理系统
  • 【深度学习】常见评估指标Params、FLOPs、MACs
  • 单向链表反转 如何实现
  • 电子电气架构 --- ECU存储与计算资源冗余设计规范
  • 深入详解:决策树在医学影像脑部疾病诊断中的应用与实现
  • 使用ESM3蛋白质语言模型进行快速大规模结构预测
  • Syntax Error: TypeError: Cannot set properties of undefined (setting ‘parent‘)
  • SSM项目上传文件的方式及代码
  • AI图像修复工具CodeFormer实测:马赛克去除与画质增强效果评测
  • 基于随机森林的金融时间序列预测系统:从数据处理到实时预测的完整流水线
  • 从零到一:企业如何组建安全团队
  • 系统引导修复
  • C#调用Matlab生成的DLL
  • S7-200 SMART PLC:硬件、原理及接线特点全解析
  • QWidget的属性
  • monorepo 发布库 --- 打包文件
  • Gameplay - 独立游戏Celeste的Player源码
  • 程序在计算机中如何运行?——写给编程初学者的指南
  • [ABC267F] Exactly K Steps
  • Go语言高并发聊天室(二):WebSocket服务器实现
  • 【中文大模型开源平台】魔塔社区基本使用