作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
简介
STL(Standard Template Library,标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。
C++ 标准模板库的核心包括以下三个组件:
组件 | 描述 |
---|---|
容器(Containers) | 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。 |
算法(Algorithms) | 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。 |
迭代器(iterators) | 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。 |
容器
STL中的容器有队列容器和关联容器,容器适配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。
- 序列式容器(Sequence containers)
每个元素都有固定位置,取决于插入时机和地点,和元素值无关。
- 向量 vector:连续存储的元素。将元素置于一个动态数组中加以管理,可以随机存取元素(用索引直接存取),数组尾部添加或移除元素非常快速,但是在中部或头部安插元素比较费时;
- 双队列 deque:连续存储的指向不同元素的指针所组成的数组。是“double-ended queue”的缩写,可以随机存取元素(用索引直接存取),数组头部和尾部添加或移除元素都非常快速,但是在中部安插元素比较费时;
- 列表 list:由节点组成的双向链表,每个结点包含着一个元素。不提供随机存取(按顺序走到需存取的元素),在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针;
- 关联式容器(Associated containers)
元素位置取决于特定的排序准则,和插入顺序无关。
- 集合 set:由节点组成的红黑树,每个节点都包含着一个元素,内部的元素依据其值自动排序。Set内的相同数值的元素只能出现一次;
- 多重集合 multiset:允许存在多个数值相同的元素的集合。内部由二叉树实现,便于查找;
- 映射 map:由{键,值}对组成的集合,内部的元素依据其值自动排序。Map内的相同数值的元素只能出现一次;
- 多重映射 multimap:允许存在多个数值相同的元素的映射。M内部由二叉树实现,便于查找;
算法
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。
算法部分主要由头文件 <algorithm>,<numeric> 和 <functional> 组成。
- <algorithm> 是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
- <numeric> 体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
- <functional> 中则定义了一些模板类,用以声明函数对象。
迭代器
Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。
迭代器的作用:能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来,重载了 *,++,==,!=,= 运算符。
用以操作复杂的数据结构,容器提供迭代器,算法使用迭代器;常见的一些迭代器类型:iterator、const_iterator、reverse_iterator和const_reverse_iterator。