(0)总体
- 所有stl头文件不包含.h
- stl体现了泛型编程的思想,就操作与数据分离。
- stl中包含:容器,迭代器,算法。
- 常用容器有:
<序列式容器>:元素有固定位置,元素位置与插入顺序有关,与元素值无关,有:vector(向量),deque(双端队列),list (列表)
<关联式容器>:属于已序集群,元素位置与元素值与排序关系有关,与插入次序无关,有:set(集合),map(映射),mutiset(多重集合),mutimap(多重映射)- 常用算法有:
find,count,min,max,min_element,max_element,search,equal,sort,(lambda)
(1)逐一介绍
vector
- 数据结构:数组。内存不够时从新分配新数组,再复制。属于连续空间。
- 特点:随机访问快,中间插入、删除慢(时间:n),末尾插入、删除快,常用做堆栈,[]快。
- 注意:如果想要更好的效率,可以在初始化后使用resize()函数。vector在多线程不安全:
A:程序崩溃,因为线程A vector进行写时,如果内存已满会重新申请内存,此时它的地址已经改变,而线程B依旧在写入/读入已经无效的地址,就会造成崩溃。可以初始化很大区间或者加上进程同步锁。
deque(double-ended queue)
- 数据结构:页链表,在前/尾段增加新空间,内存要分配一段空间,维护整体连续的假象。
- 特点:两端操作快,中间操作慢,按页或块分配内存,每页容纳固定数目元素,deque是list与vector的折中方案,[]快。
list(double linked list)
- 数据结构:双向链表,内存空间不连续。
- 特点:任意地方操作效率高,不提供[]重载,访问开始结束元素快,随机访问慢。
set(集合)
- 数据结构:红黑树(一种平衡搜索树),内部元素自动排序,每个元素只能出现一次,结构体需要重载运算符"<"(重载需要保证唯一性),大部分操作复杂度为:log(n)。
- 特点:自动排序好的,map与set的插入删除效率高。
map(映射)
- 数据结构:红黑树,每个元素需要有键值,基于键值排序,一对一映射,键值结构体也需要重载运算符"<",大部分操作为log(n)。
- 特点:自动建立key-value,对于迭代器,可以修改实值,不可以修改key。
mutiset,mutimap
- 支持重复元素/键值的set/map
(3)其他
- 容器共性
empty(),size(). - 迭代器有:
begin()
end()
rbegin()
rend()
clear()
erase(it)