Effective STL 1.仔细选择你的容器

news2024/9/22 4:05:11

Effective STL 1.仔细选择你的容器

文章目录

  • Effective STL 1.仔细选择你的容器
    • 迭代器
    • 容器
      • 分类
      • 连续内存容器和基于节点的容器的区别
    • 如何选择容器
    • 结语
      • >>>>> 欢迎关注公众号【三戒纪元】 <<<<<

  • 标准序列容器

vector、string、deque 和 list

  • 标准关联容器

    set、multiset、map 和 multimap

迭代器

  1. 输入迭代器

    每个迭代位置只能被读1次的只读迭代器,通常表现为 istream_iterator

  2. 输出迭代器

    每个迭代位置只能被写1次的只写迭代器,通常表现为 ostream_iterator

  3. 前向迭代器

    有输入和输出迭代器的能力,可以反复读写1个位置,不支持 operator--,可以高效地向前移动任意次数

    散列容器的一种设计可以产生前向迭代器;

    单链表容器也提供前向迭代器

  4. 双向迭代器

    像前向迭代器一样,后退很容易。标准关联容器都提供双向迭代器,list也有

  5. 随机访问迭代器

    可以做双向迭代器一样的事情,但也提供“迭代器算术”,即迭代器有一步向前或向后跳的能力。

    vector、string 和 deque 都提供随机访问迭代器。

    指针数组的指针可以作为数组的随机访问迭代器。

容器

STL有迭代器算法函数对象,但对于大多数C++程序员,容器是最突出的。

它们比数组更强大更灵活,可以动态增长(也常是缩减),可以管理属于它们自己的内存,可以跟踪它们拥有的对象数目,可以限制它们支持操作的算法复杂度等等。

分类

类别说明
标准STL序列容器vectorstringdequelist
标准STL关联容器setmultisetmapmultimap
非标准序列容器slist和ropeslist是一个单向链表,rope本质上是一个重型字符串。(“绳子(rope)”是重型的“线(string)”)
非标准关联容器hash_sethash_multisethash_maphash_multimap
vector可以作为string的替代品
vector作为标准关联容器的替代品有时候vector可以在时间和空间上都表现得比标准关联容器好
标准非STL容器包括数组、bitsetvalarraystackqueuepriority_queue
值得注意的是,数组可以和STL算法配合,因为指针可以当作数组的迭代器使用

vectorlistdeque提供给程序员不同的复杂度,因此应该这么用:

  • vector是一种可以默认使用的序列类型
  • 当很频繁地对序列中部进行插入和删除时应该用list
  • 当大部分插入和删除发生在序列的头或尾时可以选择deque这种数据结构

连续内存容器和基于节点的容器的区别

  • 连续内存容器(也叫做基于数组的容器)

    在一个或多个(动态分配)的内存块中保存它们的元素。

    如果一个新元素被查入或者已存元素被删除,其他在同一个内存块的元素就必须向上或者向下移动来为新元素提供空间或者填充原来被删除的元素所占的空间。

    这种移动影响了效率和异常安全。

    标准的连续内存容器是vectorstringdeque

    非标准的rope也是连续内存容器。

  • 基于节点的容器

    在每个内存块(动态分配)中只保存一个元素。

    容器元素的插入或删除只影响指向节点的指针,而不是节点自己的内容。

    所以当有东西插入或删除时,元素值不需要移动。

    表现为链表的容器——比如listslist——是基于节点的,所有的标准关联容器也是(它们的典型实现是平衡树)。

    非标准的散列容器使用不同的基于节点的实现。

如何选择容器

  1. 你需要“可以在容器的任意位置插入一个新元素”的能力吗?

    如果是,你需要序列容器,关联容器做不到。

  2. 你关心元素在容器中的顺序吗?

    如果不,散列容器就是可行的选择。否则,你要避免使用散列容器。

  3. 必须使用标准C++中的容器吗?

    如果是,就可以除去散列容器slistrope

  4. 你需要哪一类迭代器?

    如果必须是随机访问迭代器,在技术上你就只能限于vectordequestring,但你也可能会考虑rope

    如果需要双向迭代器,你就用不了slist 散列容器的一般实现。

  5. 当插入或者删除数据时,是否非常在意容器内现有元素的移动

    如果是,你就必须放弃连续内存容器

  6. 容器中的数据的内存布局需要兼容C吗?

    如果是,你就只能用vector

  7. 查找速度很重要吗?

    如果是,你就应该看看散列容器排序的vector标准的关联容器——大概是这个顺序

  8. 你介意如果容器的底层使用了引用计数吗?

    如果是,你就得避开string,因为很多string的实现是用引用计数

    你也不能用rope,因为权威的rope实现是基于引用计数的

    于是你得重新审核你的string,你可以考虑使用vector<char>

  9. 你需要插入和删除的事务性语义吗?也就是说,你需要有可靠地回退插入和删除的能力吗?

    如果是,你就需要使用基于节点的容器

    如果你需要多元素插入(比如,以范围的方式)的事务性语义,你就应该选择list,因为list是唯一提供多元素插入事务性语义的标准容器

    事务性语义对于有兴趣写异常安全代码的程序员来说非常重要。(事务性语义也可以在连续内存容器上实现,但会有一个性能开销,而且代码不那么直观)

  10. 你要把迭代器、指针和引用的失效次数减到最少吗?

    如果是,你就应该使用基于节点的容器,因为在这些容器上进行插入和删除不会使迭代器、指针和引用失效(除非它们指向你删除的元素)。

    一般来说,在连续内存容器上插入和删除会使所有指向容器的迭代器、指针和引用失效

  11. 你需要具有以下特性的序列容器吗:1) 可以使用随机访问迭代器2) 只要没有删除而且插入只发生在容器结尾,指针和引用的数据就不会失效

    这个一个非常特殊的情况,但如果你遇到这种情况,deque就是你梦想的容器

    有趣的是,当插入只在容器结尾时,deque的迭代器也可能会失效deque是**唯一一个“在迭代器失效时不会使它的指针和引用失效”**的标准STL容器。

结语

当面对容器时,STL给了你很多选项。如果你的视线超越了STL的范围,那就会有更多的选项。在选择一个容器前,要保证考虑了所有你的选项。


>>>>> 欢迎关注公众号【三戒纪元】 <<<<<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/959467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【技巧】如何在Excel表格中添加水印?

想要在Excel表格中添加水印展示&#xff0c;但是Excel并没有像word文档一样的直接添加水印的功能&#xff0c;怎么办&#xff1f; 今天小编来分享一个方法&#xff0c;也能实现Excel表格的添加水印~ 1、 打开Excel表格&#xff0c;依次点击菜单栏的“插入” → “文本框” →…

小件固定资产怎么管理好

对于小件固定资产的管理&#xff0c;可以考虑以下几个方面&#xff1a;  建立资产档案&#xff1a;对所有小件固定资产进行登记、编号、分类、评估等工作&#xff0c;建立详细的资产档案。  定期盘点&#xff1a;定期对小件固定资产进行盘点&#xff0c;确保资产账面与实际…

【2022】贝壳找房秋招C++工程师笔试卷1 牛妹的字符串

牛妹的字符串 牛妹拿到了一个只由小写字母组成的字符串s&#xff0c;接下来将字符串执行k次操作&#xff0c;每次操作都会把s中ASCII码最小的字母从s中删除&#xff0c;请返回k次操作之后的字符串s。 参考优秀的网友1&#xff1a;26个小写字母 放在数组里正好由大到小排序。 …

聚合多个电商API接口平台

API接口测试&#xff08;点击免费测试&#xff09; 随着数字化商业时代的到来&#xff0c;API接口已成为电商资源连接利器&#xff0c;也是全球传统互联网企业转型的基础。 2021年 Google Cloud 研究显示&#xff0c;全球互联网企业近3/4的企业持续投入数字化转型&#xff0c…

SpingBoot 过滤器和拦截器有什么区别?

1. 运行顺序不同&#xff08;如图&#xff09;&#xff1a; 过滤器是在 Servlet 容器接收到请求之后&#xff0c;但在 Servlet 被调用之前运行的&#xff1b;而拦截器则是在 Servlet 被调用之后&#xff0c;但在响应被发送到客户 端之前运行的。 2. 配置方式不同&#xff1a; …

划分字母区间【贪心算法】

划分字母区间 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。返回一个表示每个字符串片段的长度的列表。…

跨数据中心Multi-Fabric解决方案:L2和L3网络的高效连接和扩展

云数据中心里&#xff0c;为什么需要DCI互通&#xff1f; 云化数据中心&#xff0c;网络资源通过虚拟化技术形成资源池&#xff0c;实现业务与物理网络解耦&#xff0c;通过网络虚拟化&#xff0c;物理网络资源可以被分成多个虚拟网络资源&#xff0c;从而提高网络资源的使用效…

轻松教你实现多设备使用WhatsApp!

小S之前发过几篇关于WhatsApp的使用技巧还有注意事项的文章&#xff0c;发现大家对WhatsApp这个软件还是非常关注的。那么小S今天就再跟大家说一下WhatsApp。 WhatsApp去年更新推出了多设备使用的功能&#xff0c;通过跟主要手机关联&#xff0c;可以在网页、桌面设备、Androi…

代码随想录算法训练营第38天 | ● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

文章目录 前言一、理论基础二、509. 斐波那契数三、70. 爬楼梯四、746. 使用最小花费爬楼梯总结 前言 动态规划 一、理论基础 1.基础 2.背包问题 3.打家劫舍 4.股票问题 5.子序列问题 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;…

Java使用pdfbox将pdf转图片

前言 目前比较主流的两种转pdf的方式&#xff0c;就是pdfbox和icepdf&#xff0c;两种我都尝试了下&#xff0c;icepdf解析出来有时候会出现中文显示不出来&#xff0c;网上的解决方式又特别麻烦&#xff0c;不是安装字体&#xff0c;就是重写底层类&#xff0c;所以我选择了p…

Segment Routing原理

以上内容均属原创&#xff0c;如有不详或错误&#xff0c;敬请指出。本文作者&#xff1a; 坏坏 本文链接&#xff1a; http://t.csdn.cn/2fUE5 版权声明&#xff1a; 本博客所有文章除特别声明外&#xff0c;如需转载&#xff0c;请联系作者注明出处并附带本文链接&#xf…

软件开发常说的CI/CD是什么

本文翻译自国外论坛 medium&#xff0c;原文地址&#xff1a;本文翻译自国外论坛 medium&#xff0c;原文地址&#xff1a;https://medium.com/gitconnected/basics-of-ci-cd-a98340c60b04 任何软件项目的主要目标都是通过业务流程快速更新迭代来赚钱。我们越快向客户发布新版…

题集-三路划分和三数取中(快排优化)

快排排序是非常快的&#xff0c;但是有一种情况快排是无法进行的。 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 这道题看上去没什么问题&#xff0c;但是如果我们用快排去提交的话&#xff0c;发现快排其实是被针对了的。 有一个样例是这样的。如果我们按照快排的…

SpringCloud入门实战(十五)分布式事务框架Seata简介

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

前端基础3——JavaScript基础用法

文章目录 一、基本使用1.1 内部方式1.2 外部导入方式1.3 css标签调用js脚本&#xff08;触发事件&#xff09; 二、Windows对象2.1 对象属性2.2 对象方法 三、数据类型3.1 字符串处理3.2 数组处理3.3 对象处理 四、流程控制4.1 操作符4.2 if判断语句4.3 for循环语句4.4 continu…

基于nRF52840 Dongle配合Wireshark对Mesh网络抓包并解析(Nordic)

Mesh网络抓包解析 准备说明配置过滤解密分析 准备 1&#xff09;nRF52840 Dongle 2&#xff09;Mesh节点 3&#xff09;手机作为配网器&#xff08;苹果手机安装nRF Mesh APP&#xff09; 说明 1&#xff09;节点使用的例程目录&#xff1a;nrf5sdkformeshv500src\examples\…

手机录屏方法推荐,3种方法带你玩转

随着智能手机的普及&#xff0c;录制手机屏幕已经成为我们在日常生活中和工作中经常需要进行的操作。有时候&#xff0c;我们想录制一段手机游戏的精彩瞬间或者与朋友分享手机操作的技巧。因此&#xff0c;找到一种方便、简单的手机录屏方法变得尤为重要。本文将介绍手机录屏的…

【IEEE会议】第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023)

第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023) 2023 5th International Conference on Frontiers Technology of Information and Computer 第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023)将在中国青岛举行&#xff0c; 会期是2023年11月17-19日&#xff0c;…

(已解决)ModuleNotFoundError: No module named ‘braceexpand‘

问题描述 import braceexpand, yaml ModuleNotFoundError: No module named braceexpand 解决办法 pip install braceexpand 参考链接https://www.roseindia.net/answers/viewqa/pythonquestions/52026-ModuleNotFoundError-No-module-named-braceexpand.html 其他问题-1 im…

安全狗陈奋:数据安全需要建立在传统网络安全基础之上

8月22日-23日&#xff0c;由创业邦主办的“2023 DEMO WORLD 企业开放式创新大会”在上海顺利举办。 作为国内云原生安全领导厂商&#xff0c;安全狗受邀出席此次活动。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;成立于2013年&#xff0c;致力…