专题要点:
STL容器体现C++功能强大之处,提高编程效率,提高程序的正确率,对编程者极为友好,是“偷懒”的好方法。
常用的STL容器有vector,set,map,string,queue,stack,array,list,pair等,各自有各自的初始化方法,访问方法,添加删除方法。由于知识点比较琐碎,个人借此总结一下。
用途:
此处重点强调是功能和性能
vector:当需要高效随机访问,不在乎插入删除元素的效率时使用
1、作为数组使用,当元素个数不确定时可以节省空间
2、作二维数组,当每行元素个数不相等时,使用vector存放效果很好(在遍历和访问时)
3、使用vector代替链表,实现邻接表
优点:可以随机访问,与数组相比获取大小size()和判空empty()更加方便
缺点:内部插入删除效率不高,一般在末端添加删除元素
list:当需要大量在任意位置插入删除元素,不关心随机访问的效率时使用(只能双向顺序访问)
优点:由于其是链式结构,因此可在常量时间内任意位置插入删除元素
缺点:只能顺序用迭代器访问,并快速访问开头和末尾,占用的空间较vector大
deque:是vector和list的折中,只能在两端增删,可随机访问
优点:两端插入删除元素,支持随机访问
缺点:访问速度比vector慢,在中间插入不如list
array:元素个数固定,可随机访问
1、与普通数组相比开销较小
2、当需要快速获得size(),判空empty()时,较为方便(但vector也能实现)
set:
当题目需要去重并排序时,考虑使用(去重和排序的功能可以根据需要使用不同的set容器)
map:
map是比较高级的数组,可以存储映射各种类型的数据(尤其是对于字符类型的数据)
PS:set与map的插入删除,查找性能差别不大,均会自动按键排序,因此二者的选择主要取决于功能上而非性能上
string:
1、string与char数组相比,较为灵活,内部函数较为丰富,运算符重载后使用起来更加方便
2、string速度较慢,只能cin读取
queue:
1、bfs配合队列容器效果更佳
2、对于一些需要对数据重复使用的题目,使用过数据后,再次入队,以等待下一次使用
3、一些贪心问题,可以使用优先队列
stack:
1、模拟递归(目前尚未碰到)
2、一些经典问题:逆波兰式,括号匹配,序列输出顺序
pair:
一个小容器,方便对map进行初始化
几点注意:
1、只有vector和string可以使用迭代器加一个常数来进行访问
2、只有vector,string,array,deque可以使用下标访问, 后两者还可通过 at(下标)访问
3、各个容器使用size(),empty(),erase(),clear(),基本一致
4、添加元素push(),push_back(),push_front(),insert(),emplace(), emplace_back(),emplace_front()
5、删除元素:pop(),pop_back(),pop_front(),remove(),erase(),clear()
6、访问函数:top(),front(),back(),find(),count()
7、algorithm头文件中的swap()与sort()也可以对容器使用
8、当数据使用结构体,配合STL容器时,容器中其实没有必要存整个结构体,可以只存结构体数组的下标,按照散列的方式进行查找对应的结构体变量