STL提供了六大组件,彼此之间可以用组合套用,分别是容器、算法、迭代器、适配器与空间配置器。 容器:各种数据结构,如vector、 list、 deque、 set、 map等,用来存放数据,从实现角度来看,STL容器是一种class template。 算法:各种常用的算法,如sort、 find、 copy、 for_ each,从实现的角度来看,STL算法是一种function template。 迭代器:扮演了容器与算法之间的胶合剂,是所谓的“泛型指针”,共有五种类型,从实现角度来看,迭代器是一种operator*, operator->, operator++, operator--?等指针相关操作予以重载的class template,所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针也是一种迭代器。是设计模式的一种。 仿函数:仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。从实现角度来看,仿函数是一种重载了operator()的class或者class template。 适配器: 一种用来修饰容器或者仿函数或迭代器接口的东西。对于实现而言,配接器是使用已经实现好的容器去提供新的接口,比如stl中的栈的实现,根本就是个接口转发。配接器提供接口更加灵活,比如queue和stack,看着像容器,其实就是deque包了一层皮。 空间配置器:负责空间的配置与管理,从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class template。 交互关系:容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。
一、容器
????????根据“数据在容器中的排列”特性,容器可概分为序列式(sequence) 和关联式(associative)两种。 ????????标准的STL关联式容器分为set (集合)和map (映射表)两大类,以及这两大类的衍生体multiset (多键集合)和multimap (多键映射表) .这些容器的底层机制均以RB-tree (红黑树)完成. RB-tree也是一-个独立容器,但并不开放给外界使用。 ????????此外,SGI STL还提供了一个不在标准规格之列的关联式容器: hash table(散列表) ,以及以此hashtable为底层机制而完成的hash_ set (散列集合)、hash_ map ( 散列映射表)、hash. multiset ( 散列多键集合)、hash. multimap(散列多键映射表) 。 ????????所谓关联式容器,观念上类似关联式数据库(实际上则简单许多):每笔数据(每个元素)都有一个键值(key) 和一个实值(value) 。当元索被插人到关联式容器中时,容器内部结构(可能是RB- tree,也可能是hash-table)便依照其键值大小,以某种特定规则将这个元素放置于适当位置.关联式容器没有所谓头尾(只有最大元素和最小元素),所以不会有所谓push_ back().、push_ front()、 pop_ back().、pop_ front().、begin()、end() 这样的操作行为.? ????????一般而言, 关联式容器的内部结构是一个balanced binary tree(平衡二叉树),以便获得良好的搜寻效率。balanced binary tree有许多种类型,包括AVL-tree、RB-tree、?AA-tree,其中最被广泛运用于STL的是RB-tree (红黑树)。
1.vector:底层数据结构为数组 ,支持快速随机访问。 2.list:底层数据结构为双向链表,支持快速增删。 3.deque:底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问。 4.stack:底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时 5.queue:底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时(stack和queue其实是适配器,而不叫容器,因为是对容器的再封装) 6.priority_queue:的底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现 7.set:底层数据结构为红黑树,有序,不重复。 8.multiset:底层数据结构为红黑树,有序,可重复。? 9.map:底层数据结构为红黑树,有序,不重复。 10.multimap:底层数据结构为红黑树,有序,可重复。 11.hash_set:底层数据结构为hash表,无序,不重复。 12.hash_multiset:底层数据结构为hash表,无序,可重复 。 13.hash_map :底层数据结构为hash表,无序,不重复。 14.hash_multimap:底层数据结构为hash表,无序,可重复。? 15.unordered_set:底层数据结构为hash表,无序,不重复。 16.unordered_multiset:底层数据结构为hash表,无序,可重复 。 17.unordered_map :底层数据结构为hash表,无序,不重复。 18.unordered_multimap:底层数据结构为hash表,无序,可重复。?
?unorderd_系列是约等于hash_系列的,最初的 C++ 标准库中没有类似 hash_map 的实现,但不同实现者自己提供了非标准的 hash_map。 因为这些实现不是遵循标准编写的,所以它们在功能和性能保证方面都有细微差别。从 C++ 11 开始,hash_map 实现已被添加到标准库中。但为了防止与已开发的代码存在冲突,决定使用替代名称 unordered_map。这个名字其实更具描述性,因为它暗示了该类元素的无序性。
|