STL
STL:(Standard Template Library)标准模板库,是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架
通俗的说,STL是对常见数据结构的封装,和一些通用的算法,即可以操作任意类型数据和任意数据结构的算法
具体来说,STL中包含了六大组件,即容器、迭代器、算法、仿函数、空间配置器、配接器,下面是对六大容器的介绍
容器
容器:容器是管理数据的地方,它是STL的重要组成部分。
容器包含了序列式容器和关联式容器
序列式容器
1、string:字符串类型
2、vector:动态类型的顺序表
3、array:静态类型的顺序表(C++11)
4、list:带头结点的双向循环链表
5、forward_list:带头节点的单向循环链表(C++11)
6、deque:动态的二维数组
关联式容器
1、set:不重复元素的集合
2、multiset:类似set,但允许元素重复
3、map:关联数组,每个元素有两个数据项,map将一个数据项映射到另一个数据项中
4、multimap:类似map,但允许键值重复
5、unordered_set、unordered_multiset、unordered_map、unordered_multimap:分别类似集合、多重集合、映射、多重映射,但是用哈希表实现
其他类型容器
1、bitset
2、valarray
迭代器
迭代器是泛化的指针,通过迭代器,编程人员可以无需关心关心其内部结构而进行操作数据。根据它们操作方式的不同,可分为以下几种:
1、输入迭代器
2、输出迭代器
3、随机访问迭代器
4、前向迭代器
5、双向迭代器
算法
STL提供了一些通用类型的常见的算法,这些算法与数据类型和数据结构无关。例如排序和搜索算法,等等
仿函数
也称为函数对象。将一个类的对象按照函数的方式进行使用,它可以定制函数功能,使之更加灵活。例如greater、less,等等
配置器
也称为容器适配器。它是一种设计模式(设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结),该中模式是将一个类的接口转换为客户希望的另一个接口
常用的配置器有stack、queue、priority_queue(因为每个容器在底层都有自己的实现方式,但是这三个在底层只是将其他容器进行了封装),等等
空间配置器
空间配置器是STL中提供的申请释放以及管理空间的组件,最具代表的空间配置器是allocator
STL的缺陷
1、STL库更新慢
2、没有支持线程安全,并发环境下需要自己加锁,且锁的粒度是比较大的
3、STL极度的追求效率,导致内部比较复杂
4、在极端情况下,STL会导致内存膨胀的问题
5、深拷贝问题,极端情况下,如果是百万级的数据,那么一次深拷贝就产生了几百万次的构造和析构