C++拾遗(四)——顺序容器

  之前一篇博文(《初窥标准库》)简单了解了一种最常用的顺序容器:vector类型。本文将对该文内容进行进一步的学习和完善,继续讨论标准库提供的顺序容器类型。所谓顺序容器,即将单一类型的元素聚集起来成为容器,并根据位置来存储和访问这些元素。标准库定义了三种顺序容器类型:vector,list和deque(double-ended queue双端队列)。同时还提供了三种顺序容器适配器(adaptor):stack,queue,priority_queue。

顺序容器vector支持快速随机访存
list支持快速插入/删除
deque双端队列
顺序容器适配器stack后进先出栈
queue先进先出队列
priority_queue有优先管理的队列

顺序容器的定义及迭代器

  • 容器元素类型必须满足两个条件:元素支持赋值运算,元素对象可以复制。以上为容器要满足的最低限度,关联容器则需要满足其他元素。注意到,引用不支持赋值运算,IO库类型不支持赋值或复制,故两者都不能作为容器的元素。
  • 注意:容器定义时,必须用空格隔开两个相邻的>符号,否则系统会将>>当作右移操作符,导致编译错误。
1 vector< vector<string> > liens; //ok
2 vector < vector<string>> lines; //error:>>treated as shift operator
  • 标准库为迭代器提供一些常用的运算,如解引用,自增自减等。
  • 关系操作符只适用于vector和deque容器,因为它们提供快速随机访存,可以根据元素位置直接访问容器元素。而list容器的迭代器既不支持算术运算,也不支持关系运算。
  • 迭代器范围为左闭合区间,即[first,last),表示从first所指示的位置到last所指示的位置之前的所有元素。对迭代器的要求为:它们指向同一个容器中的元素或超出末端的下一位置;first反复做自增运算能够到达last。
  • 某些容器操作会修改容器的内在状态或移动容器内的元素,这样将会使部分迭代器失效,进而导致与悬垂指针同样的问题。考虑如下两段代码,有何不同?为何?
     1 vector<int>::iterator mid = iv.begin() + iv.size()/2;
     2 vecor<int>::iterator iter = iv.begin();
     3 while (iter != mid)
     4     if (*iter == someVal)
     5         iv.insert(iter, 2*someVal);
     6 
     7 vector<int>::iterator iter = iv.begin();
     8 while (iter != iv.begin() + iv.size()/2)
     9 {
    10     if (*iter == someVal)
    11     {    
    12           iter = iv.insert(iter, 2*someVal);
    13           iter += 2;
    14     }        
    15     else
    16         ++iter;
    17 }

     

顺序容器的操作

  • 一些基本的操作,如begin和end成员,insert操作,resize操作,erase操作,assign操作,关系操作符等。

vector容器的自增长

  • vector类提供了两个成员函数:capacity和reserve,前者获取在容器需要分配更多的存储空间之前能够存储的元素总数,后者则告诉容器应该预留多少空间。注意,capacity不等于size。

容器的选用

  • 若要随机访存元素,应使用vector或deque。
  • 若要在容器的中间位置插入或删除元素,应使用list。
  • 若是在首尾部分插入或删除,使用deque。
  • 如果只需要在读取输入时在容器的中间位置插入元素,然后需要随即访问元素,则可将元素读入list容器,接着对此容器重新排序,使之适合顺序访问,在复制到vector中。
  • 选择容器的核心取决于:随机访存list的代价与在vector/deque中插入删除时复制元素的代价。

 

转载于:https://www.cnblogs.com/huashu/p/4269430.html

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

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

相关文章

MySQL两种表存储结构MyISAM和InnoDB的性能比较测试

转载 http://www.jb51.net/article/5620.htm MySQL支持的两种主要表存储格式MyISAM&#xff0c;InnoDB&#xff0c;上个月做个项目时&#xff0c;先使用了InnoDB&#xff0c;结果速度特别慢&#xff0c;1秒钟只能插入10几条。后来换成MyISAM格式&#xff0c;一秒钟插入上万条。…

微软全球执行副总裁沈向洋:你给自己的定位是什么,你就会得到什么

来源&#xff1a;AI 科技评论摘要&#xff1a;沈向洋&#xff0c;美国国家工程院院士、微软全球执行副总裁、ACM/IEEE Fellow。多年来&#xff0c;沈向洋专注于计算机视觉和计算机图形学的研究&#xff0c;并领导和开发了 Bing 搜索。目前&#xff0c;他是微软公司级别最高的中…

Linux例行工作crontab

第一步编辑要定时执行的脚本&#xff1a; myScript.sh myScript.sh的内容为&#xff1a;touch /root/date %F %T.txt 为myScript.sh增加可执行权限&#xff1a;chmod x myScript.sh 第二步增加定时任务&#xff1a; crontab -e 内容如下&#xff1a; */2 * * * * /root/myScri…

用互联网大脑模型分析5G重点影响的6个科技产业

作者&#xff1a;刘锋 计算机博士&#xff0c;《互联网进化论》作者5G是指第五代移动电话行动近信标准&#xff0c;也称第五代移动通信技术&#xff0c;是4G之后的延伸&#xff0c;其峰值理论传输速度可达每秒数十Gb。对比4G的主要提高如下&#xff1a;5G的速度将达到4G的100倍…

ubuntu 安装yar和使用

可能你的安装 会出现一些依赖 一般可能是 缺少 m4 autoconf 鸟哥博客:http://www.laruence.com/2012/09/15/2779.html 安装yar 先安装msgpack https://github.com/msgpack/msgpack-php whichis phpize 比如我的在:/usr/local/php/bin/phpize 一般php-config也在这里 我的ms…

Gartner:2019年十大数据与分析技术趋势

来源&#xff1a;网络大数据近日&#xff0c;全球领先的信息技术研究和顾问公司Gartner指出&#xff0c;增强型分析(augmented analytics)、持续型智能(continuous intelligence)与可解释型人工智能(explainable AI)是数据与分析(data and analytics)技术领域内的主要趋势之一&…

UG/Open API基础知识-语法1

UG/Open API语法-数据类型数据类型struct-声明结构体变量union-声明联合数据类型enum-声明枚举类型枚举与#define宏的区别typedef-用于给数据类型取别名(当然还有其他作用)数据类型 UG/Open API编程接口是C语言的语法格式&#xff0c;因而&#xff0c;它支持C语言的标准数据类…

Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步

目录 1, 环境2, Redis简介3, Gearman简介4, MySQL - Redis配合使用方案4, 软件安装5, MySQL UDF Trigger同步数据到Gearman6, 参考资料1, 环境 CentOS, MySQL, Redis, Nodejs 2, Redis简介 Redis是一个开源的K-V内存数据库&#xff0c;它的key可以是string/set/hash/list/...&…

python函数实现求非负实数平方根,在shell里调用

编写python函数实现求非负实数平方根&#xff0c;在shell里调用算法牛顿迭代法描述如下函数代码调用函数算法 牛顿迭代法 利用切线逼近曲线&#xff0c;求曲线零点&#xff0c;对于曲线 yf(x)y f(x)yf(x),采用迭代的方法求其零点&#xff0c;在点&#xff08;xn,f(xn)&#…

5G风起,四大IoT迎风爆发!智能家居与电表高速增长

来源&#xff1a;智东西摘要&#xff1a;深度剖析智能家居、智能城市、车联网、网联无人机四大领域新机遇。2018年&#xff0c;我国物联网&#xff08;IoT&#xff09;连接数从2017年的15.4亿飙升至30.63亿&#xff0c;几近增长了100%&#xff0c;增速喜人。而在这组数据背后&a…

机器学习基石笔记5——为什么机器可以学习(1)

转载请注明出处&#xff1a;http://www.cnblogs.com/ymingjingr/p/4271742.html 目录 机器学习基石笔记1——在何时可以使用机器学习(1) 机器学习基石笔记2——在何时可以使用机器学习(2) 机器学习基石笔记3——在何时可以使用机器学习(3)(修改版) 机器学习基石笔记4——在何时…

PPT|工业互联网关键技术专利态势

来源&#xff1a;中国信通院CAICT摘要&#xff1a;《工业互联网关键技术专利态势分析&#xff08;2019&#xff09;》对工业互联网的三个重要体系进行深入知识产权分析。以下PPT资料是工业互联网产业联盟和中国信通院团队对《工业互联网关键技术专利态势分析&#xff08;2019&a…

由二分查找算法学习算法的时间复杂度

文章目录二分查找数据算法函数代码调用函数大OOO表示法表示算法运行速度一些常见的大 OOO 运行时间启示&#xff1a;二分查找 二分查找是一种算法&#xff0c;其输入是一个有序的元素列表和要查找的元素。如果要查找的元素包含在列表中&#xff0c;二分查找返回其位置&#xf…

生命简史——跨越地球40亿年

来源&#xff1a;新原理研究所摘要&#xff1a;你一定也曾好奇过&#xff0c;地球上的生命究竟是如何起源和演化的&#xff1f;它又是如何从简单的原核细胞不断地演化成复杂的多细胞&#xff1f;如此多元化的物种是如何进化而成的&#xff1f;每一次变化都历经了怎样的挑战与压…

图论解决复杂路口红绿灯安排,python语言实现

文章目录问题描述说明性描述操作性描述图着色问题图着色算法算法精化和python描述算法细节处理&#xff1a;python实现讨论问题描述 说明性描述 说明性描述说明了需要解决的问题是什么&#xff0c;针对什么样的问题&#xff0c;期望什么样的解 这是一个5条路的交叉口&#x…

从算法到硬件,一文读懂2019年 AI如何演进

来源&#xff1a;图灵TOPIA翻译&#xff1a;黄姗&#xff0c;杨鹏岳在刚刚过去的2018年&#xff0c;人工智能领域的大事件、新发现和新进展层出不穷。BERT重磅发布&#xff0c;刷新了很多NLP的任务的最好性能&#xff1b;GAN相关研究论文持续增长&#xff0c;生成的照片达到了以…

apache2.2 虚拟主机配置

一、改动httpd.conf 打开appserv的安装文件夹&#xff0c;找到httpd.conf文件&#xff0c;分别去掉以下两行文字前面的#号。 #LoadModule vhost_alias_module modules/mod_vhost_alias.so去掉#意思是启用apache的虚拟主机功能。 #Include conf/extra/httpd-vhosts.conf去掉这…

Python Cookbook 3rd Edition Documentation

Python Cookbook 3rd Edition Documentation 文章目录第一章&#xff1a;数据结构和算法1.1 解压序列赋值给多个变量问题解决方案讨论1.2 解压可迭代对象赋值给多个变量问题解决方案讨论第一章&#xff1a;数据结构和算法 Python 提供了大量的内置数据结构&#xff0c;包括列表…

《阿丽塔》脑机接口正从科幻走向现实

来源&#xff1a;zhongcap摘要&#xff1a;《流浪地球》和《阿丽塔》前后脚上映&#xff0c;难免不让人比较一番。科幻片的魅力&#xff0c;在于它试验和想象未来的可能性。昨天晚上小编去看了卡梅隆的新作《阿丽塔&#xff1a;战斗天使》。《流浪地球》和《阿丽塔》前后脚上映…

2015年2月12日——不懂点

CNBLOG项目不懂知识点&#xff1a;1. local:[...]的写法 这样声明可使用。 1    xmlns:local"using:CNBlogs" 2 xmlns:ControlHelper"using:CNBlogs.ControlHelper" 2. 书写格式上 - 把所有的繁杂的 style template 等等都放到了具体类似于 .css …