1. string基本概念
本质:string是C++风格的字符串,而string本质上是一个类
string和char * 区别:
- char * 是一个指针
- string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。
特点:
- string 类内部封装了很多成员方法
- 例如:查找find,拷贝copy,删除delete 替换replace,插入insert
- string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责
总结:
- find查找是从左往后,rfind从右往左
- find找到字符串后返回查找的第一个字符位置,找不到返回-1
- replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串
- compare 主要是用于比较两个字符串是否相等
- insert 插入
- erase 删除
- 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可以动态扩展
动态扩展:
- 并不是在原空间之后续接新空间,而是找更大的新的内存空间,然后将原数据拷贝这个大的新空间,并释放原空间
![63 C++ 8个容器的类型及特点(string/vector/list/map/set/deque/queue/stack)_第1张图片](http://img.e-com-net.com/image/info8/e84584629c4c4a028f5f460181a6b29d.jpg)
- vector容器的迭代器是支持随机访问的迭代器
总结:
- 判断是否为空 --- empty
- 返回元素个数 --- size
- 返回容器容量 --- capacity
- 重新指定大小 --- resize
- 尾插 --- push_back
- 尾删 --- pop_back
- 插入 --- insert (位置迭代器)
- 删除 --- erase (位置迭代器)
- 清空 --- clear
- 除了用迭代器获取vector容器中元素,[ ]和at也可以
- front返回容器第一个元素
- back返回容器最后一个元素
- swap可以使两个容器互换,可以达到实用的收缩内存效果
- 如果数据量较大,可以一开始利用reserve预留空间
具体案例:https://blog.csdn.net/weixin_41622043/article/details/120007653
3. deque容器基本概念
功能:双端数组,可以对头端进行插入删除操作
deque与vector区别:
- vector对于头部的插入删除效率低,数据量越大,效率越低
- deque相对而言,对头部的插入删除速度回比vector快
- vector访问元素时的速度会比deque快,这和两者内部实现有关
![63 C++ 8个容器的类型及特点(string/vector/list/map/set/deque/queue/stack)_第2张图片](http://img.e-com-net.com/image/info8/026c940639fa4e16b1a2a91744224357.jpg)
deque内部工作原理:
deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据
中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
![63 C++ 8个容器的类型及特点(string/vector/list/map/set/deque/queue/stack)_第3张图片](http://img.e-com-net.com/image/info8/fa294e7ef75a41069654e2922e41f65a.jpg)
deque容器的迭代器也是支持随机访问的
总结:
- deque没有容量的概念
- 判断是否为空 --- empty
- 返回元素个数 --- size
- 重新指定个数 --- resize
- 插入和删除提供的位置是迭代器!
- 尾插 --- push_back
- 尾删 --- pop_back
- 头插 --- push_front
- 头删 --- pop_front
- 除了用迭代器获取deque容器中元素,[ ]和at也可以
- front返回容器第一个元素
- back返回容器最后一个元素
- sort算法非常实用,使用时包含头文件 algorithm即可
4. stack 基本概念
概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口
![63 C++ 8个容器的类型及特点(string/vector/list/map/set/deque/queue/stack)_第4张图片](http://img.e-com-net.com/image/info8/fe4d03e397324c47b39122db1be7a7a1.jpg)
栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为
栈中进入数据称为 --- 入栈 push
栈中弹出数据称为 --- 出栈 pop
生活中的栈:子弹夹
![63 C++ 8个容器的类型及特点(string/vector/list/map/set/deque/queue/stack)_第5张图片](http://img.e-com-net.com/image/info8/7a085af91be949efb6348d53ffad5bcf.jpg)
总结:
- 入栈 --- push
- 出栈 --- pop
- 返回栈顶 --- top
- 判断栈是否为空 --- empty
- 返回栈大小 --- size
5. queue 容器
概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口
![63 C++ 8个容器的类型及特点(string/vector/list/map/set/deque/queue/stack)_第6张图片](http://img.e-com-net.com/image/info8/c6c8d6bff05848429d667bf98e481622.jpg)
队列容器允许从一端新增元素,从另一端移除元素
队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
队列中进数据称为 --- 入队 push
队列中出数据称为 --- 出队 pop
生活中的队列:
![63 C++ 8个容器的类型及特点(string/vector/list/map/set/deque/queue/stack)_第7张图片](http://img.e-com-net.com/image/info8/207e2f60233a4e9ea1155913e32bd75c.jpg)
总结:
- 入队 --- push
- 出队 --- pop
- 返回队头元素 --- front
- 返回队尾元素 --- back
- 判断队是否为空 --- empty
- 返回队列大小 --- size
6. list容器
功能:将数据进行链式存储
链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:链表由一系列结点组成
结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
STL中的链表是一个双向循环链表
![63 C++ 8个容器的类型及特点(string/vector/list/map/set/deque/queue/stack)_第8张图片](http://img.e-com-net.com/image/info8/58b431d5563f4ecdaab5f9dfd37855b2.jpg)
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器
list的优点:
- 采用动态存储分配,不会造成内存浪费和溢出
- 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
list的缺点:链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大
List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。
总结:
- STL中List和vector是两个最常被使用的容器,各有优缺点
- list容器中不可以通过[]或者at方式访问数据
- 返回第一个元素 --- front
- 返回最后一个元素 --- back
- 判断是否为空 --- empty
- 返回元素个数 --- size
- 重新指定个数 --- resize
- 尾插 --- push_back
- 尾删 --- pop_back
- 头插 --- push_front
- 头删 --- pop_front
- 插入 --- insert
- 删除 --- erase
- 移除 --- remove
- 清空 --- clear
- 反转 --- reverse
- 排序 --- sort (成员函数)
- 对于自定义数据类型,必须要指定排序规则,否则编译器不知道如何进行排序
- 高级排序只是在排序规则上再进行一次逻辑规则制定,并不复杂
7. set/ multiset 容器
简介:所有元素都会在插入时自动被排序
本质:set/multiset属于关联式容器,底层结构是用二叉树实现。
set和multiset区别:
-
set不允许容器中有重复的元素
-
multiset允许容器中有重复的元素
总结:
- set容器插入数据时用insert
- set容器插入数据的数据会自动排序
- 统计大小 --- size
- 判断是否为空 --- empty
- 交换容器 --- swap
- 插入 --- insert
- 删除 --- erase
- 清空 --- clear
- 查找 --- find (返回的是迭代器)
- 统计 --- count (对于set,结果为0或者1)
8. map/ multimap容器
简介:
- map中所有元素都是pair
- pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值自动排序
本质:map/multimap属于关联式容器,底层结构是用二叉树实现。
优点:可以根据key值快速找到value值
map和multimap区别:
- map不允许容器中有重复key值元素
- multimap允许容器中有重复key值元素
总结:
- 统计大小 --- size
- 判断是否为空 --- empty
- 交换容器 --- swap
- map插入方式很多,记住其一即可
- 插入 --- insert
- 删除 --- erase
- 清空 --- clear
- 查找 --- find (返回的是迭代器)
- 统计 --- count (对于map,结果为0或者1)
- 利用仿函数可以指定map容器的排序规则
- 对于自定义数据类型,map必须要指定排序规则,同set容器