C++ STL初探
什么是STL
全称 Standard Template Library,即标准模板库。现在STL已成为C++的一部分,构建于C++编译系统中。地位相当于.Net Framework提供的大量泛型集合类。
STL的组成部分
容器(containers)
数据结构的容器,提供类模板适配器(adapters)
以序列式容器为基础,提供的栈,队列和优先级队列迭代器(iterators)
类似指针,用于迭代容器内元素算法(algorithm)
包含一系列常见算法空间配置器(allocator)
负责对象的创建和销毁,与内存的申请和释放仿函数(functor)
即函数对象,是重载了()操作符的struct
容器
容器主要分为序列式容器和关联式容器
- 序列式容器
通过元素在容器中的位置顺序存储和访问的容器。所谓序列式容器,其中的元素都可序(ordered),但未必有序(sorted),即元素集合呈线性关系排列,但未必是有序的。C++本身提供了array(数组),STL主要提供了vector, list, deque几种序列式容器,底层数据结构为数组或链表 。
- vector(容器)
相当于动态数组,相当于C#中的List。 array是静态空间,一旦配置了就不能改变;vector是动态空间,随着元素的增多或减少,其配置空间的大小可以动态改变。 - list(链表)
相当于双向链表,相当于C#中的LinkedList。 每次插入或删除一个元素,就分配或释放一个元素的空间;所以list对空间的控制十分精确,而且任何位置的插入或删除需要的时间都是常数。 - deque(双端队列)
相当于双端队列(double-ended queue), 与vector同样是基于动态数组 实现,申请内存时是一段一段申请的,是一种双向开口的连续线性空间。可以在常数时间内在头尾分别做元素的的插入和删除操作。deque没有所谓容量的概念,因为它是以分段的连续空间组合而成,随时可以增加一段空间拼接起来。
- vector(容器)
- 关联式容器
通过键(key)存储和读取元素的容器。STL主要提供了set,map,multiset,multimap这几种关联式容器,底层数据结构为二叉树或哈希表 。
- set(集合)
相当于没有Value的红黑树 ,相当于C#中的SortedSet。 内部元素依据其值自动排序,set内相同的数值元素只能出现一次。 - map(映射)
相当于有Value的红黑树,相当于C#中的SortedDictionary。内部元素依据Key(键)自动排序,map内相同的key只能出现一次。 - unordered_set(无序集合)
相当于没有Value的哈希表,相当于C#中的Set。内部元素是无序的,通过哈希函数直接获取元素。 - unordered_map(无序映射)
相当于没有Value的哈希表,相当于C#中的Dictionary。内部元素无序的,通过哈希函数直接通过键获取键值。 - multiset(多重集合)
允许重复元素的set - multimap(多重映射)
允许重复元素的map
- set(集合)
适配器
适配器并不是第一类容器,因为它们并没有提供与元素的保存形式有关的真正数据结构实现,它们仅仅基于某种顺序容器来实现栈/队列的工作方式,并且适配器不支持迭代器,STL中各种排序, 查找, 变序等算法也都不适合容器适配器。
stl提供了三种适配器:
stack
:栈,后进先出
queue
:队列,先进先出
priority_queue
:优先队列,最高优先级先出
适配器均支持如下三个成员函数
push
:添加一个元素
pop
:(从栈顶或队列头)删除一个元素
top
:(从栈顶或队列头)返回一个元素
迭代器
mmp有些看不懂了,还是补补C++的基础回来再写,机制看起来比较复杂,人生苦短,我用C#