STL学习笔记(一)---概述

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。
交互关系:容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。

一、版本

HP STL
        HP版本是所有STL实现版本的始祖。HP STL是Alexandar Stepanov在惠普Palo Alto实验室工作时,与Meng Lee合作完成的,是C++ STL的第一个实现版本,而且是开放源码。其它版本的C++ STL一般是以HP STL为蓝本实现出来的。
P.J.Plauger实现版本 
        P.J.Plauger版本由P.J.Plauger开发,继承HP版本并不属于open source范畴。此版本被用于Microsoft的Visual C++中,可读性极低。

Rouge Wave实现版本 
        Rouge Wave版本是由Rouge Wave公司开发,它继承HP版本,并不属于open source范畴。Rouge Wave版本被C++Builder采用。

STLport实现版本 
        为了使SGI STL的基本代码都适用于VC++和C++ Builder等多种编译器,俄国人Boris Fomitchev建立了一个free项目来开发STLport,此版本STL是开放源码的。(似乎是不再更新,并不支持C++11)
SGI STL实现版本        
         SGI版本由Silicon Graphics Computer System, Inc公司发展,继承HP版本。所以它的每一个头文件也都有HP的版本声明。此外还加上SGI的公司版权声明。主要设计者仍然是STL之父Alexandar Stepanov,被Linux的C++编译器GCC所采用。SGI STL是开源软件,源码可读性非常高。

二、容器

        根据“数据在容器中的排列”特性,容器可概分为序列式(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:底层一般用deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时
5.queue:底层一般用deque实现,封闭头部即可,不用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。这个名字其实更具描述性,因为它暗示了该类元素的无序性。

三、用法

STL常用用法汇总_vjhghjghj的博客-CSDN博客

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值