63 C++ 8个容器的类型及特点(string/vector/list/map/set/deque/queue/stack)

1. string基本概念

本质:string是C++风格的字符串,而string本质上是一个类

string和char * 区别:

  • char * 是一个指针
  • string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。

特点:

  1. string 类内部封装了很多成员方法
  2. 例如:查找find,拷贝copy,删除delete 替换replace,插入insert
  3. string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责

总结:

  1. find查找是从左往后,rfind从右往左
  2. find找到字符串后返回查找的第一个字符位置,找不到返回-1
  3. replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串
  4. compare 主要是用于比较两个字符串是否相等
  5. insert 插入
  6. erase 删除
  7. substr 子串:获取字符串中的某字段

string功能练习:https://blog.csdn.net/weixin_41622043/article/details/118585408

string类型转换:https://blog.csdn.net/weixin_41622043/article/details/118740343

string切片:https://blog.csdn.net/weixin_41622043/article/details/118864154

2. vector基本概念

功能:vector数据结构和数组非常相似,也称为单端数组 

vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:

  • 并不是在原空间之后续接新空间,而是找更大的新的内存空间,然后将原数据拷贝这个大的新空间,并释放原空间
  • vector容器的迭代器是支持随机访问的迭代器

总结:

  1. 判断是否为空 --- empty
  2. 返回元素个数 --- size
  3. 返回容器容量 --- capacity
  4. 重新指定大小 --- resize
  5. 尾插 --- push_back
  6. 尾删 --- pop_back
  7. 插入 --- insert (位置迭代器)
  8. 删除 --- erase (位置迭代器)
  9. 清空 --- clear
  10. 除了用迭代器获取vector容器中元素,[ ]和at也可以
  11. front返回容器第一个元素
  12. back返回容器最后一个元素
  13. swap可以使两个容器互换,可以达到实用的收缩内存效果
  14. 如果数据量较大,可以一开始利用reserve预留空间

具体案例:https://blog.csdn.net/weixin_41622043/article/details/120007653

3. deque容器基本概念

功能:双端数组,可以对头端进行插入删除操作

deque与vector区别:

  • vector对于头部的插入删除效率低,数据量越大,效率越低
  • deque相对而言,对头部的插入删除速度回比vector快
  • vector访问元素时的速度会比deque快,这和两者内部实现有关

deque内部工作原理:

        deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据

中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间

 deque容器的迭代器也是支持随机访问的

总结:

  1. deque没有容量的概念
  2. 判断是否为空 --- empty
  3. 返回元素个数 --- size
  4. 重新指定个数 --- resize
  5. 插入和删除提供的位置是迭代器!
  6. 尾插 --- push_back
  7. 尾删 --- pop_back
  8. 头插 --- push_front
  9. 头删 --- pop_front
  10. 除了用迭代器获取deque容器中元素,[ ]和at也可以
  11. front返回容器第一个元素
  12. back返回容器最后一个元素
  13. sort算法非常实用,使用时包含头文件 algorithm即可

4. stack 基本概念

概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口

栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为

栈中进入数据称为 --- 入栈 push

栈中弹出数据称为 --- 出栈 pop

生活中的栈:子弹夹

总结:

  1. 入栈 --- push
  2. 出栈 --- pop
  3. 返回栈顶 --- top
  4. 判断栈是否为空 --- empty
  5. 返回栈大小 --- size

5. queue 容器

概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口

 队列容器允许从一端新增元素,从另一端移除元素

队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为

队列中进数据称为 --- 入队 push

队列中出数据称为 --- 出队 pop

生活中的队列:

总结:

  1. 入队 --- push
  2. 出队 --- pop
  3. 返回队头元素 --- front
  4. 返回队尾元素 --- back
  5. 判断队是否为空 --- empty
  6. 返回队列大小 --- size

6. list容器

功能:将数据进行链式存储

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的

链表的组成:链表由一系列结点组成

结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

STL中的链表是一个双向循环链表

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

list的优点

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

list的缺点:链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大

List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。

总结:

  1. STL中List和vector是两个最常被使用的容器,各有优缺点
  2. list容器中不可以通过[]或者at方式访问数据
  3. 返回第一个元素 --- front
  4. 返回最后一个元素 --- back
  5. 判断是否为空 --- empty
  6. 返回元素个数 --- size
  7. 重新指定个数 --- resize
  8. 尾插 --- push_back
  9. 尾删 --- pop_back
  10. 头插 --- push_front
  11. 头删 --- pop_front
  12. 插入 --- insert
  13. 删除 --- erase
  14. 移除 --- remove
  15. 清空 --- clear
  16. 反转 --- reverse
  17. 排序 --- sort (成员函数)
  18. 对于自定义数据类型,必须要指定排序规则,否则编译器不知道如何进行排序
  19. 高级排序只是在排序规则上再进行一次逻辑规则制定,并不复杂

7. set/ multiset 容器

简介:所有元素都会在插入时自动被排序

本质:set/multiset属于关联式容器,底层结构是用二叉树实现。

set和multiset区别

  • set不允许容器中有重复的元素

  • multiset允许容器中有重复的元素

总结:

  1. set容器插入数据时用insert
  2. set容器插入数据的数据会自动排序
  3. 统计大小 --- size
  4. 判断是否为空 --- empty
  5. 交换容器 --- swap
  6. 插入 --- insert
  7. 删除 --- erase
  8. 清空 --- clear
  9. 查找 --- find (返回的是迭代器)
  10. 统计 --- count (对于set,结果为0或者1)

8. map/ multimap容器

简介:

  1. map中所有元素都是pair
  2. pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  3. 所有元素都会根据元素的键值自动排序

本质:map/multimap属于关联式容器,底层结构是用二叉树实现。

优点:可以根据key值快速找到value值

map和multimap区别:

  • map不允许容器中有重复key值元素
  • multimap允许容器中有重复key值元素

总结:

  1. 统计大小 --- size
  2. 判断是否为空 --- empty
  3. 交换容器 --- swap
  4. map插入方式很多,记住其一即可
  5. 插入 --- insert
  6. 删除 --- erase
  7. 清空 --- clear
  8. 查找 --- find (返回的是迭代器)
  9. 统计 --- count (对于map,结果为0或者1)
  10. 利用仿函数可以指定map容器的排序规则
  11. 对于自定义数据类型,map必须要指定排序规则,同set容器

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值