一.STL概述
1.STL定义
STL(Standard Template Library)标准模板库,该库包含了许多基本数据结构和基本算法,为广大C++程序猿提供了一个可扩展的一应用框架,STL是最新的C++标准函数库中的一个子集
2.常见组件
容器:可容纳各种数据类型的数据结构
迭代器:可依次存取容器中元素的东西
算法:用来操作容器中的元素的函数模板。例如,STL用sort()来对一个vector中的数据进行排序
例子:数组int array[100]就是一个容器,而int*类型的指针就可以作为迭代器,可以为这个容器编写一个排序算法
二.容器
1.vector
1)用动态数组来实现
2)必须包含头文件#include
3)vector支持随机存取
4)vectorde 大小(size)和容量(capacity)
size :返回实际元素的个数
capacity:返回能容纳元素最大的数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器
2.deque
1)deque是“double-ended queue”的缩写。在两端增删元素具有较佳的性能。
2)模拟动态数组,与vector相似,所有适用于vector的操作都适用于deque
3)deque还有push_front(将元素插到前面)和pop_front(删除最前面的元素)操作
3.List
1)list是双向链表。
2)不支持随机存取,不支持at.[pos]函数和[]操作符
3)list除了具有所有顺序容器都有的成员函数以外,还支持下面成员函数
函数 | 解释 |
---|---|
push_front | 在前面插入 |
pop_front | 删除前面的元素 |
sort | 排序(list单独实现) |
remove | 删除和指定值相同的元素 |
merge | 合并两个链表,并清空被合并的那个(list单独实现) |
reverse | 颠倒链表 |
4.set/multiset
1)底层使用平衡的搜索树—红黑树
2)内部元素有序排列,新元素插入的位置取决于它的值,查找速度快
3)支持通过键值是实现快速读取
4)不支持at.[pos]函数和[]操作符
5)不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素
6)multiset支持同一个键多次出现的set类型
5.map/multimap
1)底层使用平衡的搜索树—红黑树实现
2)元素包含两部分(key,value),key和value可以是任意类型
3)根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢
4)不能直接改变元素的key,可以通过[]操作符直接存取元素的值
5)map中不允许key相同的元素,multimap允许key相同的元素
6.stack
1)是后进后出的数据结构,只能插入、删除、访问栈顶的元素
2)可以做如下操作
a)push(e) 将元素压栈
b)top() 返回栈顶元素的引用,但不移除
c)pop() 从栈中移除栈顶元素,但不返回
3)结构
7.queue/priority_queue
queue
1.先进先出的数据结构
2.可以做如下操作
a)push(e) 将元素置入队尾
b)front() 返回队列头部的引用,但不移除
c)back() 返回队列尾部的引用,但不移除
d)pop() 从队列头部移除元素但不迟到
3.示意图
priority_queue
1.以某种排序规则(默认是less)管理队列中的元素
2.可以做如下操作
a)push(e) 根据元素的优先级将元素置入队列
b)top() 返回队列头部(最大元素)的引用,但不移除
c)pop() 删除队列头部(最大)的元素,但不返回
d)empty() 判断队列是否为空
三.算法
1.基本概念
STL提供了能在各种容器中通用的算法,比如插入,删除,查找,排序等
算法部分主要由头文件 < algorithm > < numeric > < functional > 组成
< algorithm >所有STL头文件中最大的一个,其中常用的功能涉及到比较交换查找遍历操作、复制、修改、反转、排序、合并等等
< numeric >体积较小,简单的数学模板函数
< functional >定义一些模板类
2.常见算法
算法 | 说明 | 举例 |
---|---|---|
非可变序列算法 | 指不直接修改其所操作的容器内容的算法,如查找、统计、搜索函数 | find() find_if() count()统计等于某值的容器元素个数 count_if() search() search_if() |
可变序列算法 | 指可以修改它们所操作的容器内容的算法,如拷贝、替换、删除函数 | copy() transformk()replace()replace_if() remove() remove_if() |
排序算法 | 指可以对指定容器进行排序的算法 | sort()普通排序 make_heap()将一个区间转换成堆 sort_heap()对堆进行排序,排序后就不是堆了 |
四.迭代器
1.基本概念
- 用于指向容器内的一个元素,有const和非const两种
- 通过迭代器可以读取它指向的元素,通过非const迭代器还能修改其指向的元素。迭代器的用法和指针类似。
- 迭代器是容器和算法的桥梁,STL容器和算法是分离的,连接它们的是迭代器
2.使用方法
- 定义一个容器类为迭代器的方法
容器类名::iterator 变量名 ,如 vector;;iterator vit;
容器类名::const_itertor 变量名,如vector::const_iterator vit - 访问一个迭代器指向的元素
“* 迭代器变量名" - 不同容器上支持的迭代功能强弱有所不同,容器的迭代器的功能强弱决定了该容器是否支持STL中的某种算法
- 迭代器按功能由弱到强
编号 | 功能 | 说明 |
---|---|---|
1 | 输入 | Input iterators 提供对数据的只读访问 |
2 | 输出 | Output iterators 提供对数据的只写访问 |
3 | 正向 | Forward iterators 提供读写操作,并能向前推进迭代器 |
4 | 双向 | Bidirectional iterators 提供读写操作,并能向前和向后操作 |
5 | 随机 | Random access iterators 提供读写操作,并能在数据中随机移动 |
编号大的迭代器拥有编号小的迭代器的功能,能当编号小的迭代器使用
3.操作
所有迭代器: ++p,p++
输入迭代器 *p ,p=p1,p==p1,p!=p1
输出迭代器 *p ,p=p1
正向迭代器 上面全部
双向迭代器 上面全部–p,p–
随机访问迭代器:上面全部,以及下面
p+=i,p-=i
p+i
p-i
p[i]
p<p1,p<=p1,p>p1,p>=p1
4.类别
容器 | 迭代器类别 |
---|---|
vector | 随机 |
deque | 随机 |
list | 双向 |
set/multiset | 双向 |
map/multimap | 双向 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
priority_queue | 不支持迭代器 |
五.STL使用自定义对象
- 向vector,deque,list,stack,queue添加自定义对象,实际是将对象复制一份放到容器里,要调用对象的拷贝函数,定义了拷贝函数的调用定义的拷贝函数,没定义的调用默认的拷贝函数
- set和map容器添加自定义对象也是将对象复制一份放到容器了,不同的是,set和map容器实现比较器函数