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

重庆维力安网站建设赚钱网页

重庆维力安网站建设,赚钱网页,百度搜索引擎营销,普洱网站搭建目录 顺序容器 关联容器 容器适配器 使用统一擦除函数从容器中删除指定项 在恒定时间内对一个对排序不敏感的vector中删除项目 如果不确定自己访问容器会不会越界#xff0c;那就使用.at方法而不是[] 在我们开始之前#xff0c;先来回顾一下传统的经典的几个容器#…目录 顺序容器 关联容器 容器适配器 使用统一擦除函数从容器中删除指定项 在恒定时间内对一个对排序不敏感的vector中删除项目 如果不确定自己访问容器会不会越界那就使用.at方法而不是[] 在我们开始之前先来回顾一下传统的经典的几个容器 顺序容器 顺序容器提供了一个接口其中元素按顺序排列。虽然您可以按顺序使用元素但其中一些容器使用连续存储而其他容器则不使用。STL 包括这些顺序容器 数组是一个固定大小的序列在连续存储中保存特定数量的元素。一旦分配它就不能改变大小。这是最简单、最快的连续存储容器。 向量就像一个可以缩小和增大的数组。它的元素是连续存储的因此更改大小可能涉及分配内存和移动数据的费用。向量可能会保留额外的空间以减轻这种成本。从向量后面以外的任何位置插入和删除元素将触发元素的重新对齐以保持连续存储。列表是一种双向链接列表结构允许在常数O(1)时间内插入和删除元素。遍历列表的时间复杂度为线性 O(n)。 单链接变体可用作 forward_list它仅向前迭代。forward_list 使用的空间较少并且比双向链接列表更高效但缺少一些功能。 双端队列通常发音为 deck是一种双端队列。它是一个可以在两端扩展或收缩的顺序容器。双端队列允许随机访问其元素就像向量一样但不保证连续存储。 关联容器 关联容器将一个键与每个元素关联。元素由其键引用而不是其在容器中的位置。 STL 关联容器包括以下容器 集合是一种关联容器其中每个元素也是其自己的键。元素通常是按某种二叉树排序的。集合中的元素是不可变的无法修改但可以插入和删除。集合中的元素是唯一的不允许重复。集合根据其排序运算符按顺序迭代。 多集类似于具有非唯一键的集合其中允许重复。 unordered_set 类似于不按顺序迭代的集合。元素不按任何特定顺序排序而是根据其哈希值进行组织以便快速访问。 unordered_multiset 类似于具有非唯一键的 unordered_set其中允许重复。 映射是键值对的关联容器其中每个键都映射到特定值或有效负载。键和值的类型可能不同。键是唯一的但值不是。映射根据其排序运算符按其键的顺序进行迭代。 多映射类似于具有非唯一键的映射其中允许重复的键。 unordered_map 类似于不按顺序迭代的映射。 unordered_multimap 类似于具有非唯一键的 unordered_map其中允许重复。 容器适配器 容器适配器是封装底层容器的类。容器类提供一组特定的成员函数来访问底层容器元素。STL 提供以下容器适配器 堆栈提供 LIFO后进先出接口其中元素只能从容器的一端添加和提取。底层容器可以是向量、双端队列或列表之一。如果未指定底层容器则默认为双端队列。 队列提供 FIFO先进先出接口其中元素可以添加到容器的一端并从另一端提取。底层容器可以是双端队列或列表之一。如果未指定底层容器则默认为双端队列。 priority_queue 根据严格的弱排序将最大值元素保持在顶部。它提供对最大值元素的恒定时间查找但插入和提取的时间对数为代价。底层容器可以是向量或双端队列之一。如果未指定底层容器则默认为向量。 使用统一擦除函数从容器中删除指定项 在 C20 之前通常使用擦除-删除习语来有效地从 STL 容器中删除元素。这有点麻烦但负担不大。通常使用这样的函数来完成任务 templatetypename Tc, typename Tv void remove_value(Tc c, const Tv v) {auto remove_it std::remove(c.begin(), c.end(), v);c.erase(remove_it, c.end()); } 嘿实际上是这样的 std::remove() 函数来自 algorithms 标头。std::remove()搜索指定的值并通过从容器末尾向前移动元素来删除它。它不会改变容器的大小。它返回一个超出移位范围末尾的迭代器。然后我们调用容器的 erase() 函数来删除剩余元素。 现在使用新的统一擦除函数这个两步过程简化为一步 std::erase(c, 5);   // 与 remove_value() 函数相同 这个函数调用与我们上面编写的 remove_value() 函数执行相同的操作。还有一个使用谓词函数的版本。例如要从数字容器中删除所有偶数值 std::erase_if(c, [](auto x) { return x % 2 0; }); 当我们调用 remove(c.begin(), c.end(), 5) 时算法会从 begin() 迭代器开始搜索匹配元素。对于找到的每个匹配元素它会将下一个元素移到其位置。它会继续搜索和移动直到到达 end() 迭代器。 结果是一个容器其中所有剩余元素都在开头没有被删除的元素并且按其原始顺序排列。end() 迭代器保持不变剩余元素未定义。我们可以像这样可视化操作 如你所见这就是remove_iterator的基本原理那就是不停的拷贝元素覆盖。 在恒定时间内对一个对排序不敏感的vector中删除项目 使用统一擦除函数或擦除-删除习语从向量中间删除项目需要 O(n)线性时间。这是因为必须从向量末尾移动元素以填补已删除项目的间隙。 如果向量中项目的顺序不重要我们可以优化此过程以花费 O(1)常数时间。方法如下。 templatetypename T void quick_delete(T v, size_t idx) {if (idx v.size()) {v[idx] move(v.back());v.pop_back();} } 如你所见其实很简单就是简单的交换一下最后一个元素和目标元素然后直接使得长度减一但是注意必须是对那些排序不敏感的 如果不确定自己访问容器会不会越界那就使用.at方法而不是[] 是的我们一直喜欢这样写来访问容器的元素 vector v{ 19, 71, 47, 192, 4004 }; auto i v[2]; 当然一些人会争论我们应该这样写更好 auto i v.at(2); 两者的区别何在呢答案是 at() 函数会进行边界检查而 [] 运算符则不会。 这是有意为之因为它允许 [] 运算符与原始 C 数组保持兼容性。让我们更详细地研究一下。 这里我们来直接使用 [] 运算符直接访问向量中的第三个元素。与 C 中的大多数顺序对象一样索引从 0 开始因此第三个元素是数字 2。 向量有五个元素编号为 0 到 4。如果我尝试访问元素编号 5则会超出向量的边界 vector v{ 19, 71, 47, 192, 4004 }; auto i v[5]; cout format(element is {}\n, i); element is 0 这个结果非常具有欺骗性。这是一个常见的错误因为人类倾向于从 1 开始计数而不是从 0 开始。但不能保证向量末尾之后的元素具有任何特定值。更糟糕的是[] 运算符会默默地允许您写入超出向量末尾的位置 vector v{ 19, 71, 47, 192, 4004 }; v[5] 2001; auto i v[5]; cout format(element is {}\n, i); element is 2001 现在已经写入不受我们控制的内存对于MSVC的库他会给我们惊喜 越界内存访问是安全漏洞的主要原因之一。 解决方案是尽可能使用 at() 成员函数而不是 [] 运算符 vector v{ 19, 71, 47, 192, 4004 }; auto i v.at(5); cout format(element is {}\n, i); 现在我们得到一个运行时异常 代码编译时没有错误但 at() 函数会检查容器的边界并在您尝试访问这些边界之外的内存时抛出运行时异常。 [] 运算符和 at() 成员函数执行相同的工作它们根据容器元素的索引位置提供对容器元素的直接访问。 [] 运算符无需任何边界检查即可完成此操作因此在某些迭代密集型应用程序中它可能会稍微快一点。 好了不说废话了对于那些可以完全保证不会越界的代码段使用[]无可厚非。但是笔者的态度是总有人喜欢在酒吧里点炒饭或者是-1杯啤酒不要小看输入的多样性。所以at() 函数应该是您的默认选择。 写过汇编的朋友都知道比较两个数只需要几个CPU周期啊哈咱们不谈分支预测的事情但是类似likely的操作总是好的不是吗但它是一种廉价的保险。对于大多数应用程序来说其好处是值得的。 更加严肃的是对于那些不允许因为内存overflow践踏而终止或者希望程序自发的抛出异常传递而不是限制错误的编程理念的朋友更加应该使用at函数。他省去您做限制的心智负担。
http://www.w-s-a.com/news/914731/

相关文章:

  • 如何拿网站后台账号wordpress 电影下载站源码
  • 公司网站建设方案书安卓应用市场免费下载安装
  • phpmysql网站设计建设好一个网站需要
  • 自己做的网站能被别人看到吗idea怎么做网页
  • 燕莎网站建设互联网排名前十的公司2021
  • 微软云怎么做网站微商城和小程序区别
  • 哈尔滨建站的系统网站到首页排名
  • 运动网站开发的需求分析南通市住房和城乡建设局网站
  • 佘山做网站谷歌云做网站
  • 免费发布信息网站大全666做p2p网站费用
  • 北京 网站建设咨询顾问公司网络公司有几家
  • 设计类网站如何用ps做网站首页
  • 品牌网站建设的关键事项设计网有哪些
  • 网站没收录徐州建设工程审图中心网站
  • 网站建设记账做什么科目erp系统有哪些软件
  • 泰拳图片做网站用哪里有做空包网站的
  • 查外链网站重庆做网站微信的公司
  • 有没有外包活的网站如何做网站快捷键的元素
  • 公司网站赏析网站制作2019趋势
  • 企业进行网站建设的方式有( )推广引流违法吗
  • 按营销型网站要求重做网站 费用点金网站建设
  • 深圳做网站互联网服务
  • 网站sem托管wordpress安装无法连接数据库
  • 深圳网站建设开发公司哪家好微信小程序商家入口
  • 江门站排名优化建立什么网站赚钱
  • 科普文章在那个网站做招聘网站代做
  • 监控设备东莞网站建设游戏网站域名
  • 对商家而言网站建设的好处网址导航怎么彻底删除
  • app设计网站模板企业展厅策划设计公司有哪些
  • wordpress销售主题手机网站关键词优化