什么是STL?
STL是标准模板库。STL是对常见数据结构的封装,以及通用的算法。算法可以操作任意类型的数据并且可以处理任意数据结构。
STL六大组件
容器:组织数据,对常见数据结构的封装。
序列式容器: 对线性数据结构的封装----顺序表&链表
序列式容器的接口分类:
构造与销毁
迭代器操作
容量操作
元素访问操作
修改操作
特殊操作
string类容器:管理字符串。
1.浅拷贝问题的解决办法。
vector类容器:动态类型的顺序表。
1.迭代器失效。
array类容器:静态类型的顺序表(C++11)(不常用)
list类容器:带头结点的双向循环链表
1.对原生态指针的封装
2.迭代器失效
forward_list:带头结点循环单链表(C++11)(不常用)
deque:双端队列,其底层类似于动态的二维数组
1.迭代器
关联式容器:
算法: STL常用算法—通用的算法(与数据类型无关,与数据结构无关)
1.find
2.swap
3.reverse
4.sort
5…
迭代器: 每个容器必须自己负责提供迭代器
迭代器的分类:
1.原生态的指针
2.对原生态指针的封装(例:list)
如何给一个类增加迭代器:
1.根据容器底层数据结构封装一个迭代器(实际是对指针的封装)
(1)如果容器中的迭代器是原生态指针,则不需要对指针进行重新封装(例如:vector,string)
(2)如果迭代器不是原生态指针,则需要对原生态指针进行适合类类型的封装。
封装步骤:
构造函数
迭代器的类对象要能够按照指针方式使用:* -> 前置++/-- 后置++/–
迭代器的类对象之间能够进行比较:= !=
2.在容器类中给迭代器类型取别名:typedef 迭代器类型 iterator
目的:为了方便统一。
3.给出begin()和end(),此处begin()和end()是左闭右开的区间。
**迭代器失效:**指针指向的内容不存在,成为野指针。
仿函数: 可以将一个类的对象按照函数的方式进行使用。
//模板
class N
{
public:
...operator()(...)
{}
};
//例子:
class Is_odd
{
public:
bool operator()(const int& a)
{
return (a%2)!=0;
}
};
作用: 让一个算法更加的灵活
适配器:
stack:底层是对deque的再次封装。
queue:底层是对deque的再次封装。
priority_queue:是堆,底层用是对vector的再次封装。
优先级队列,默认为大堆---->less,如果要其为小堆---->将less改为greater(注意:用less或greater时应有头文件 < functional>)
优先级队列中存储元素的类型:
1.内置类型,可以直接通过less和greater来形成大堆或者小堆。
2.自定义类型,可能需要重载(less)<或者(greater)>(例:存放的是Date类型的对象)
3.有些情况下需要通过仿函数进行定制(例子:存放的是Date*)