c++23中的新功能之十平坦容器

这篇具有很好参考价值的文章主要介绍了c++23中的新功能之十平坦容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景介绍

在前面反复提到过,其实所有的编程语言总体的方向是朝着自然语言化和简单在发展,速度有快慢,但方向基本没有错。这里先回顾一下,在STL中有六大组件(侯捷老师的《STL源码剖析》),这其中开发者经常见到的还是以容器为主。容器主要分成两大类:顺序容器和关联容器。这里主要是讲关联容器,即std::map,std::set,std::multimap,std::multiset.这是早期的c++标准中的四个关联容器,在后来又增加了unordered系列。但是无论怎么变,它的基本组织方式原理相同,都是通过KEY来确定Value。这其实就是大家经常提到的字典。
早期的四个属于有序的关联容器,这种情况一般是使用二叉搜索树来实现,在STL中一般使用红黑书;而后来新增的unordered四个,肯定是使用哈希表来实现。这种应用也没有什么稀奇也没有什么错误。
但是,人类的缺点就在于不满足。
树的操作太慢了,特别是对于查询。而哈希肯定浪费间,如果再加上链表,效率也是慢。人们不由得想到了数组,这玩意儿快啊,给个索引就找到了。可数组不容易插入删除啊?有人会问。先解决查询的效率问题,没见互联网上弄得缓存,重中之重就解决查询的速度。

二、平坦容器

所谓平坦的,线性的,序列化的,在某种程度上都可以认为是一种情况(有些情况不同,可以查看一下《数据密集型系统应用设计》)。平坦的意思就是一条直线,没有坑洼(内存中没有空洞)。它的好处就是可以直接定位到数据的地址,这个很好理解,知道基地址,想跳到一个指定的地址,只要在基地址上加一个值即可。在实际的内存中,这种操作几乎是不耗费时间的。
现在再说平坦容器,就容易明白了,其实就是把底层的数据结构直接替换成数组。
不过现在,STL中只是替换了有序的关联容器,也就是以树为底层数据结构的几个容器,而哈希的几个还在探索中(讨论中)。也就是说在STL库中,有flat_map,flat_set,flat_multimap,flat_multiset四个平坦容器。看其中一个的英文:“adapts a container to provide a collection of key-value pairs, sorted by keys, keys are unique”。这说明这四个也是容器适配器。
不过看标准委员会这群大佬的节奏,肯定最终会把所有的关联容器平坦化,这个前面早有类似的例子。
平坦容器既然以有序的数组为基础数据结构,那么它的优点和缺点就很容易分析出来:
1、查询速度快:这个是现在应用的一个痛点,几乎大部分的工作都是查询
2、插入删除太慢
3、空间更紧凑
4、可以使用缓存
5、随机访问稳定
6、灵活性低:迭代器删除会失效,移动存储对象成本太高
看上面的优缺点就可以知道,其实平坦容器不是带着使命来拯救关联容器的,而是在某些方向上帮助关联容器的。
这里需要对flat_map和flat_set简说明一下,前者使用了两个数组进行存储KEY和VALUE,而后者则是使用一个键值对来存储K和V,然后再存储到底层的数组中(std::pair<k,v>)。这样做的结果就是flat_map可以手动的指定底层的数组数据结构,例如vector或者deque。不过有缺点就有好处,flat_map的迭代器就不如flat_set的容易操作,前者同时操作两个数组,变得复杂多了。
整体上看,平坦容器更类似于细而微的查询优化容器。
更多的细节可以参看:
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0429r9.pdf
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1222r4.pdf

三、例程

平坦容器的使用和原来的关联容器使用没有不同,但是c++23毕竟还在完善中,下面看一个其中的例程:

#include <flat_set>
#include <iostream>

int main()
{
  flat_set<int> fs;
  fs.emplace(3);

  fs.emplace(5,65,7,8);//看文档中支持变参

  for (auto x&:fs)
  {
    std::cout<<x<<std::endl;
  }
}

上面的代码不保证准确,只是一种示意。insert不支持变参但支持列表初始化,而empalce则支持变参,看最终的应用吧。

四、总结

c++26的蓝图前些天都通过了,下来肯定又是吵吵嚷嚷的三年,然后再通过一批新功能。其实c++20的功能就已经很强大了,当然除了协程。网络和并行库其实倒不必急于一时,好多高人就是凭这个吃饭呢。标准委员会要是弄进来且很简单,估计这些大牛的饭碗肯定端不稳了。
科技在进步,标准也在进步,得紧跟着,不然,不知道什么时候儿,就落伍了。AI让人看到了希望,同时也看到了绝望。新技术一定是毁灭一些旧的秩序,但一定会诞生更多的新秩序。总之,不能灰心。文章来源地址https://www.toymoban.com/news/detail-538919.html

到了这里,关于c++23中的新功能之十平坦容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】C++11 -- 新功能

    在C++11之前一个类有6个默认成员函数,在C++11标准中又新增了两个默认成员函数,分别是移动构造函数和移动赋值函数 默认移动构造和移动赋值生成的条件 移动构造函数的生成条件:没有自己实现移动构造函数,并且没有自己实现析构函数,拷贝构造函数和拷贝赋值函数 移

    2024年02月17日
    浏览(50)
  • 【C++】C++11类的新功能

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》 《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 默认成员函数 类成员变量初始化 强制生成默认函数的default 禁止生

    2024年04月17日
    浏览(56)
  • Copilot的11个新功能,你不能错过!

    我的新书 《Android App开发入门与实战》 已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 微软发布了Copilot,这个东西真是太疯狂了。 如果你不使用它,你就会在2023年落后了。 将Word文档转换为演示文稿。 从文件中快速创建演示文稿。 通过关键幻灯片总结冗长

    2024年02月04日
    浏览(46)
  • 官宣Windows11十月的Moment 1来了,新功能!附官方ISO镜像(简/繁/英)

    一个月前(2022年9月)微软正式发布了Windows 11的年度大更新——22H2版本(Build 22621.382),过了没几天当月又推出了Build 22621.525的ISO镜像。给人一种特别操之过急的感觉~ 前天微软又向MVS订阅用户推送了10月份的累积更新的ISO镜像,系统版本号Build 22621.674。Windows11也是维持着每

    2024年02月06日
    浏览(53)
  • 【C++】C++11-类的新功能&default&delete&final&override关键字

    一个类有多少个默认成员函数? c++98:6个 C++11:8个 在C++98中,一个类中有如下六个默认成员函数:构造函数,析构函数,拷贝构造函数,拷贝赋值函数,取地址重载函数,const取地址重载函数,其中前四个成员函数最重要.后面两个成员函数一般不会用到 其中这里“默认”的意思就是 你不

    2024年02月02日
    浏览(87)
  • Java 20 新功能介绍

    Java 20 共带来 7 个新特性功能 ,其中三个是孵化提案,孵化也就是说尚在征求意见阶段,未来可能会删除此功能。 JEP 描述 分类 429 作用域值(孵化器) Project Loom,Java 开发相关 432 Record 模式匹配(第二次预览) Project Amber,新的语言特性 433 switch 的模式匹配(第四次预览)

    2024年02月03日
    浏览(63)
  • Midjourney新功能:角色参照指南

    基本概念 角色参照(Character Reference) :这个功能允许用户在不同的图像生成中保持给定参照角色的一致性。 适用模型 :适用于Midjourney V6和Niji6型号。 功能亮点 跨风格一致性 :可以在不同风格(如动漫风、写实风)中保持角色特征一致。 面部、着装、发型调控 :用户可以

    2024年04月10日
    浏览(60)
  • TypeScript 5.1发布,新功能更新

    1:返回类型增加undefined 这里设置了一个别名 fun,当时使用它的时候,我们必须显示返回一个 undefined 。 现在你可以直接设置返回类型: 而不仅限于 void any 。 4.3版本 :❌ 5.1版本 :✅ 2:getter可以设置和 setter 的不相关类型 在之前版本 ,get 返回类型应该为 set 的子类型,如

    2024年02月09日
    浏览(50)
  • SOLIDWORKS 2023新功能揭秘(一):3D CAD功能的十大更新

    SolidWorks 3D CAD  软件拥有设计、模拟、成本估算、可制造性检查、CAM、可持续设计和数据管理等功能,同时还包含适用于钣金,焊件,曲面,模具,产品配置,DFM和CAM的专业工具,支持ECAD/MCAD协作,复杂的零部件库以及高级真实感渲染。更重要的是具有结构和运动分析功能,

    2024年02月05日
    浏览(48)
  • 三星泄露微软 Copilot 新功能:用自然语言操控各种功能

    3 月 11 日消息,微软计划本月晚些时候发布新款 Surface 电脑和适用于 Windows 11 的 Copilot 新功能,但三星似乎等不及了,在其即将推出的 Galaxy Book4 系列产品宣传材料中泄露了一些即将到来的 Copilot 功能。 三星官网上发布的图片证实了此前关于微软正为其人工智能助手 Copilo

    2024年04月09日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包