什么是STL?
1.首先STL是C++中的标准模板库(standard template library)
2.STL实际上就是对常见的数据结构(线性表(顺序表、链表)、栈和队列、二叉树、哈希)以模板的方式进行封装,目的就是替用户组织数据,里面还增加了一些非常灵活的通用算法,主要是对数据进行操作的sort/reverse…
注意:灵活和通用
通用:1.与数据类型无关; 2.与数据结构无关,任意类型数据结构组织的数据都可以进行操作(迭代器)
//例:
template<class iterator,class T>
iterator find(iterator first,iterator last,const T&data)
{
while(first !=last)
{
if(*first == data) return first;
++first;
}
return last;
}
灵活:算法可以进行配置,有些算法只提供了一个框架,具体算法该做什么事情,需要用户在外部进行配置
sort(first,last) //[first,last)区间的元素进行排序,默认为升序
sort(first,last,cmp) //需要用户传递cmp(元素之间的比较方式)
//cmp:将元素按照小于方式比较,则是升序;将元素按照大于方式比较,则是降序
//cmp可以通过函数指针、仿函数、lambda进行传递
六大组件
容器、迭代器、算法、仿函数/函数对象、适配器、空间配置器(内存池)
1.容器:STL对常见数据结构的封装(模板类方式体现)
序列式容器(线性数据结构)
C++98 | string | 专门用来管理字符串动态类型的顺序表 |
---|---|---|
vector | 管理任意类型的动态类型数据表 | |
list | 带头结点循环双向链表 | |
deque | 双端队列,类似于动态的二维数组 | |
C++11 | array | 静态类型的顺序表 |
forward_list | 带节点循环单链表 |
关联式容器(k-V)
底层为红黑树结构 | 底层为哈希表结构 |
---|---|
map | unordered_map |
set | unordered_set |
multimap | unordered_multimap |
multiset | unordered_multiset |
2.迭代器:
概念:提供一个结构,可以依次遍历容器中的元素,而又无需暴露容器的底层实现原理;
作用:主要是给算法来应用的,让算法可以操作任意容器中的数据
本质:就是一个指针 || 对指针进行封装。
3.算法:解决问题的步骤
分类:a.与数据结构相关联的算法:就是容器中的成员函数;b.通用算法:sort/reverse…;
注意:算法要操作不同容器中的数据,必须要借助迭代器。
4.仿函数/函数对象
概念:可以像函数一样使用的对象;
实现:只需在类中将()重载即可(():是函数重载调用符);
作用:用来配置算法的功能,使算法更加的灵活。
5.适配器:一种设计模式
概念:将其他结构进行封装然后形成一种新的结构;
分类:
容器适配器:stack/queue/priority_queue;
迭代器适配器:反向迭代器,其内部就是对正向迭代器进行封装;
函数适配器:用来让一个函数对象表现出另外一种类型的函数对象的特征
6.空间配置器
高效为STL中各个容器申请和释放空间,以及对空间进行管理;