C++_顺序容器

顺序容器类型

顺序容器

  • vector: 支持快速随机访问
  • list: 支持快速插入与删除
  • deque: 双端队列

顺序适配器
- stack: 后进先出(LIFO)堆栈
- queue: 先进先出(FIFO)队列
- priority_queue: 有优先级管理的队列

上述顺序容器包含于以下头文件中:< vector >,< list >,< deque >;
所有的容器类型都定义了默认的构造函数,用于创建指定的空容器类型, 默认构造函数不带参数

容器构造函数
//C为容器名, T元素类型(T也可以是容器类型), c容器

  1. C< T > c; 创建一个空容器,适用所有容器
  2. C c(c2); 创建容器c2的副本, c与c2具有相同的容器类型, 用于存放相同类型元素,适用所有容器
  3. C c(begin,end); 创建c,其元素为begin到end内元素副本,适用所有容器
  4. C c(n,t); 创建n个值为t的容器, t必须是C的元素类型值, 只适用于顺序容器
  5. C c(n); 创建n个值初始化元素的容器,只适用于顺序容器

    注: 将一个容器复制给另一个容器的时候, 容器类型,元素类型必须匹配;
    容器内元素类型必须支持赋值运算, 元素对象必须可以复制(IO流对象就不可以作为元素类型,不支持复制或赋值)
    例:

vector<int> v1;
vector<int> v2(v1);//ok
list<int> l(v1);//error 容器类型不匹配
vector<double> v3(v1);//error 元素类型不匹配

迭代器
所有迭代器都具有相同接口, 迭代器可看做指针;
迭代器常用运算

  • *iter : 返回迭代器iter所指向元素的引用
  • ++iter/iter++/iter–/–iter : 给iter加1或减1,使其指向容器中前一个元素与后一个元素
  • iter==/!= : 比较两个迭代器是否相等, 两个迭代器指向容器中同一个元素时,迭代器相等

vector与deque容器中提供额外运算, 可进行+/-n的算术运算,以及比较大小, 等同于数组中元素地址的运算
注: 在迭代器范围中遵守: [begin, end) ,end表示最后一个元素的后一个位置, 当begin等于end的时候则容器为空; 在元素的添加或删除的时候, 应该相应调整迭代器的值,避免产生无效的迭代器

容器定义的类型

  • size_type: 无符号整数,表示容器的最大存储长度
  • iterator: 容器迭代器类型
  • const_iterator: 只读迭代器,类似于 const TYPE* iter
  • reverse_iterator: 按逆序查找元素
  • difference_type: 存储两个迭代器的差值(包含负数)

    在顺序容器中添加元素

  • c.push_back(t): 尾部插入t, 返回void

  • c.push_front(t): 前端插入t, 返回void, 只适用于list ,deque (其主要原因在于list,deque可基于链表实现,而vector为数组,其扩容方式与链表不同)
  • c.insert(p,t): 在迭代器p所指向的元素前面插入元素为t的新元素, 返回添加新元素的迭代器
  • c.insert(p,n,t): 在迭代器p所指向的元素前面插入n个值为t的新元素, 返回void
  • c.insert(p,b,e): 在迭代器p所指向元素的前面插入由迭代器b和e标记的范围元素, 返回void

注:push_back与push_fron 也可写成: c.insert(c.end(), t)与c.insert(c.begin(),t) ,vector不可push_front;
在插入元素后应注意迭代器的更新, 当新元素插入后迭代器都将出现失效, 在循环使用insert的时候应注意迭代器的更新
例:

vector<int>::iterator first=v.begin(), last=v.end();
while(first!=last){cin>>t;first=v.insert(first,t);++first;
}
//上述操作将出现死循环,每次元素的添加将导致last迭代器的改变,last未更新,需每次添加后将last=v.end()

容器之间的比较
容器之间的比较必须二者具有相同容器类型和元素类型;
容器之间的比较是基于元素类型的比较运算,若当前元素类型不支持大小比较, 那容器就不能进行比较操作
所有容器都通过比较其元素对来实现关系运算

容器大小容量操作

  • c.size() : 返回容器c中元素个数,返回类型为c::size_type
  • c.max_size(): 返回容器的最大容纳量,返回c::size_type
  • c.empty(): 返回标记容器大小是否为0的bool值
  • c.resize(n): 重新调整容器大小,使其能容纳n个元素,超出范围时,删除多余元素(属于压缩容器)
  • c.resize(n,t): 重新调整容器大小,使其能容纳n个元素,所添加的新元素的值都为t

注: resize操作将导致迭代器失效

访问顺序容器元素

  • c.back(): 返回c最后一个元素的引用,c为空时, 该操作未定义
  • c.front(): 返回第一个元素的引用,c为空, 则操作未定义
  • c[n] : 返回下标为n的元素的引用, n<0||n>c.size(), 则操作未定义,只适用于vector与deque
  • c.at(n):与c[n]一致

顺序容器元素删除

  • c.erase(p): 删除迭代器p所指向的元素,返回一个迭代器, 指向被删除元素的后一位置, p若超出末端则操作未定义
  • c.erase(b,e): 删除迭代器b,e标记的范围内所有元素, 返回一个迭代器,指向被删除元素的后一位置,超出末端的时候返回超出末端的下一位置
  • c.clear(): 删除所有元素,返回void
  • c.pop_back(): 删除容器c的最后一个元素,返回void,c为空时则操作未定义
  • c.pop_front():删除c的第一个元素,返回void,只适用于list或deque

注:采用pop_front与front结合使用,可实现栈结构

list<int>ll;
while(!ll.empty()){cout<<ll.front();ll.pop_front();
}

当使用erase删除时,必须保证迭代器位置正确
删除操作也会导致迭代器失效

容器的选择

  1. 程序要求随机访问元素,使用vector或deque
  2. 必须在中间位置插入元素,采用list
  3. 在首位插入元素,采用deque
  4. 若既要支持随机访问且可较快插入,可将list容器作为vector的类型,或者将vector容器作为list的类型( 类似于java中的ArrayList)

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

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

相关文章

python画tan_Python入门之三角函数tan()函数实例详解

描述tan() 返回x弧度的正弦值。语法以下是 tan() 方法的语法:import mathmath.tan(x)注意&#xff1a;tan()是不能直接访问的&#xff0c;需要导入 math 模块&#xff0c;然后通过 math 静态对象调用该方法。参数x -- 一个数值。返回值返回x弧度的正弦值&#xff0c;数值在 -1 …

课程作业一

由于代码的难点部分是王源写的。。所以开始我选择了重写。。但是重写好像比我想象的复杂太多&#xff0c;加上时间分配不够所以现在还没有完成。。先提交随笔写好后补上代码。。我道歉认罚。。把这次当成一个教训。。 转载于:https://www.cnblogs.com/daydreams/p/6759372.html…

不废话~就是抽奖~

不废话就是抽奖 在公众号回复-抽奖- 获取抽奖二维码参与抽奖

C++关联容器总结一

关联容器 关联容器: 通过键(key)储存与读取元素 顺序容器: 通过元素在容器中的位置顺序储存,访问 关联容器类型 map 关联数组&#xff1a;元素通过键来存储和读取 set 大小可变的集合&#xff0c;支持通过键实现的快速读取, 具有集合的性质 multimap 支持同一个键多次出现…

威纶触摸屏与电脑连接_PLC与这7种设备的连接方式,一看就懂!

点击上方电工小青年&#xff0c;关注并星标专业的电工电气领域自媒体&#xff0c;不容错过欢迎转发朋友圈~PLC常见的输入设备有按钮、行程开关、接近开关、转换开关、拨码器、各种传感器等&#xff0c;输出设备有继电器、接触器、电磁阀等。正确地连接输入和输出电路&#xff0…

okHttp源码解析------待续

看该篇文章前首先要熟悉okHttp的使用&#xff0c;建议先读OkHttp的简单使用 本文的源码解析参考链接&#xff1a;okhttp3总和解析 1.从URL请求处理开始分析 由异步将请求加入调度方法开始引入正题&#xff1a; getClient().newCall(request).enqueue(new Callback() {Overridep…

Android studio JNI jni实例

1.Jni的作用 1.Jni的作用 Java是一种比较高级的语言&#xff0c;Java调用c库&#xff0c;调用c库是必不可少的&#xff0c;所以Jni就应运而生了。看了这个文章的同学&#xff0c;应该能够自己写个APK装在自己的手机里面吧&#xff0c;以前刚开始做android的时候&#xff0c;写…

二叉树先序遍历,中序遍历,后序遍历,层次遍历学习总结及完整C/C++代码

伪代码阐述 先序遍历 先序遍历:先访问根节点, 然后深入左子树,直到不能深入时再深入右子树 由定义可得递归式 void travPre_R(BinNodePosi* x,VISIT& visit){if(!X) return; //到达叶子节点,开始回归visit(x->data);//向左子树深入的过程中便开始进行对每个节点的数据…

nedc工况_东南DX3 EV续航升级 NEDC综合工况续航451公里

东南DX3 EV续航升级版车型曝光&#xff0c;电池系统能量密度由之前的141Wh/kg提升至了161Wh/kg&#xff0c;NEDC综合工况续航也由老款产品的351km提升至了451km。近日&#xff0c;工信部公布了2019年第7批《新能源汽车推广应用推荐车型目录》&#xff0c;东南DX3 EV续航升级版车…

不笑找我系列 | 程序员爆笑漫画十条

原创翻译~ 转载请说明出处~~~~~~~~ 1、如果你让码农给你做个事情&#xff0c;比如修个灯泡&#xff0c;他会这样去执行你的指令 2、分享一个码农发现并解决bug的过程&#xff0c;实在是符合我们码农的人设 3、码农的一天&#xff0c;像极了我的一天 4、至今为止&#xff0c;没…

AVL树学习总结

AVL树 平衡二叉树的缺点 由于平衡二叉搜索树的search(), insert(),remove()接口的运行时间与二叉树的高度成正比,所以若不能有效控制树高, 从平均复杂度来看,二叉平衡搜索树并不能让人满意 理想平衡 二叉树的性能取决于树的高度,只有当左右子树的高度接近时才能达到理想平衡…

nginx编译安装_Nginx编译安装nginx-upsync-module模块以实现动态负载

安装依赖包OpenSSL在官网下载页下到最新稳定版1.0.2q。PCRE在 PCRE 官网可以找到下载地址&#xff0c;这里选择8.x的最高版本 pcre-8.42.tar.gz。zlibzlib 直接选择官网首页最新的zlib-1.2.11.tar.gz。下载nginx 源码包及nginx-upsync-module模块源码这里下载的是nginx稳定版ng…

centos7 qt之程序编译 cant start process “cmake”

之所以出现这个问题&#xff0c;是由于qt内置的cmake与系统已安装的cmake命令冲突。解决的方法是&#xff0c;在build里将cmake命令加上绝对路径。 问题得以解决。转载于:https://www.cnblogs.com/jiu0821/p/6762343.html

码农笑话图片十张

原创翻译~转载请说明出处~~~~~~~~1、如果你让码农给你做个事情&#xff0c;比如修个灯泡&#xff0c;他会这样去执行你的指令2、分享一个码农发现并解决bug的过程&#xff0c;实在是符合我们码农的人设3、码农的一天&#xff0c;像极了我的一天4、至今为止&#xff0c;没有遇到…

伸展树学习总结

伸展树 与AVL树类似, 伸展树也是二叉搜索树的一种形式, 伸展树无需保证时刻保持全树的平衡,也不需要像AVL树一样要求记录平衡因子的附加信息 伸展树的提出源于信息访问的局部性(刚被访问过的信息有可能再次被访问,要被访问的元素可能位于刚访问过的元素的附近), 就伸展树而言…

python的if和else、for、while语法_python-变量、if else语句 、for循环、while循环(4月26号)...

变量&#xff1a;五&#xff0e;注意&#xff1a;python是可执行程序 在linux写python第一行必须写#!/usr/bin/env python(声明解释器在windows中写python第一行需要写# -*- coding:utf-8 -*-Pycharm:开发调试效率高 在pycharm中new project 并且每天创建一个目录右键diectory…

c语言 库打印函数

函数#include<stdio.h>int printf(const char *format, ... );/* [until c99]写结果到stdout */int printf(const char *restrict format, ... );/* [since c99] */int fprintf(FILE *stream, const char *format, ... );/* [until c99]写结果到文件流stream */int fprin…

xhprof windows下安装和使用(转载)

1、使用5.3.3以上的php版本&#xff0c;或者直接下载wamp2.1集成环境。 2、下载xhprof for windows版本&#xff0c;地址&#xff1a;http://www.benjamin-carl.de/?downloadXHProf-0.10.0-PHP-5.3.3-VC6-x86-TS&#xff0c;把解压后的dll文件放到php的ext目录里面。 关于这个…

B树学习总结

B树 多路搜索树 当数据规模足够大的时候, 大部分数据存储到外存中, 常规的平衡二叉搜索树将无法满足需求理由如下: 常规二叉平衡搜索树每当进行search(),insert(),remove()操作的时候就会进行节点的切换,从而导致大量的IO操作,就此提出了多路搜索,尝试将原本的多个节点合在一…

嵌入式未来趋势是什么?

感谢CSDN编辑邀请 前几天通过了CSDN博客专家的申请&#xff0c;在CSDN博客摸爬滚打多少个日日夜夜后终于修成正果了&#xff0c;当时通过CSDN博客专家时赶紧把消息发给了以前的创新基地同学&#xff0c;想起来&#xff0c;我们那时候刚开始学习单片机&#xff0c;就是从CSDN上面…