STL六大组件

一、STL介绍

1、STL(Standard Template Library),即标准模板库,是一个高效的C++程序库。

2、包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性

3、从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming)

在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形。

4、从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的

基于模板(template)

二、STL六大组件

1、容器(container)
(1)序列式容器

序列式容器的每个元素的位置取决于元素被插入时设置的位置,和元素值本身无关,即元素插入的位置与顺序是对应的。
序列式容器主要有以下:

vector
deque
list

(2)关联式容器

关联式容器的每个元素位置取决于特定的排序规则,和插入顺序无关,即元素会根据特定的排序规则对每个元素进行排序,与元素插入的顺序无关。
关联式容器有:

set
multiset
map
multimap

这些容器的底层结构和特点:
这里写图片描述
这里重点讲一下set/multiset、map/multimap的区别:

map:

(1)map内部元素是以键值对的方式存储的,键值对的第一元素被视为键值(key),第二元素被称为实值(value)
(2)map中不允许存放两个键值相同的元素
(3)map的底层是实现借助了红黑树,所以map中的元素会根据键值自动排好序
(4)当要生成一个键值对类型的变量时,我们可以使用make_pair(key,value)方法。
(5)关于重载的下标的使用:使用其键值查找它的实值返回第一个键值对应的实值的引用
(6)map的迭代器不是const类型的,所以允许修改其键值

set:

(1)set内部元素也是以键值对的方式存储的,只不过它的键值与实值相同
(2)set中不允许存放两个实值相同的元素
(3)set的底层实现也是借助了红黑树,所以map中所有的元素都会按照键值进行自动排序
(4)迭代器是被定义成const iterator的,说明set的键值是不允许更改的,并且不允许通过迭代器进行修改set里面的值

multimap:

(1)底层实现和map一样,都是采用了红黑树
(2)允许插入重复的键值,使用insert_equal机制

multiset:

(1)底层实现与set一样,也采用了红黑树
(2)允许插入重复的键值,使用insert_equal机制

hash_set/hash_map/hash_multiset/hash_multimap:

(1)hash_set/hash_map,两者的一切操作都是基于hashtable之上。
(2)不同的是,hash_set同set一样,同时拥有实值和键值,且实值就是键值,键值就是实值,而hash_map同map一样,每一个元素同时拥有一个实值(value)和一个键值(key),所以其使用方式,和上面的map基本相同。
(3)但由于hash_set/hash_map都是基于hashtable之上,所以不具备自动排序功能。为什么? 因为hashtable没有自动排序功能。
(4)至于hash_multiset/hash_multimap的特性与上面的multiset/multimap完全相同,唯一的差别就是它们hash_multiset/hash_multimap的底层实现机制是hashtable(而multiset/multimap,上面说了,底层实现机制是RB-tree),所以它们的元素都不会被自动排序,不过也都允许键值重复。

2、适配器(Adapters)
(1)适配器是一种接口类

为已有的类提供新的接口,目的是简化、约束、使之安全、隐藏或者改变被修改类提供的服务集合

(2)三种类型的适配器

容器适配器:用来扩展7种基本容器,它们和顺序容器相结合构成栈、队列和优先队列容器

迭代器适配器(反向迭代器、插入迭代器、IO流迭代器)

函数适配器(函数对象适配器、成员函数适配器、普通函数适配器)

3、迭代器(Iterator)

1、迭代器Iterator,用来在一个对象群集(collection of objects)的元素上进行遍历。这个对象群集或许是个容器,或许是容器的一部分。迭代器的主要好处是,为所有容器提供了一组很小的公共接口。迭代器以++进行累进,以*进行提领,因而它类似于指针,我们可以把它视为一种smart pointer
2、比如++操作可以遍历至群集内的下一个元素。至于如何做到,取决于容器内部的数据组织形式。
3、每种容器都提供了自己的迭代器,而这些迭代器能够了解容器内部的数据结构。

标准容器迭代器的运算符

(1)*iter 返回迭代器iter所指元素的引用
(2)iter->men 解引用iter并获得该元素的名为men的成员,相当于(*iter).men
(3)++iter 令iter指示容器的下一个元素
(4)–iter 令iter指示容器的上一个元素
(5)iter1==iter2 如果两个迭代器指示的是同一个元素或者它指向同一个容器的尾后迭代器,则相等.

4、算法(Algorithms)

(1)用来处理群集内的元素。它们可以出于不同的目的而搜寻、排序、修改、使用那些元素。通过迭代器的协助,我们可以只需编写一次算法,就可以将它应用于任意容器,这是因为所有的容器迭代器都提供一致的接口。
(2)常用的各种算法,如sort,find,copy,for_each等。从实现的角度看,STL算法是一种function template。

5、空间配置器(allocator)

STL的内存配置器在我们的实际应用中几乎不用涉及,但它却在STL的各种容器背后默默做了大量的工作,STL内存配置器为容器分配并管理内存。统一的内存管理使得STL库的可用性、可移植行、以及效率都有了很大的提升。

SGI-STL的空间配置器有2种

一级空间配置器:一种仅仅对c语言的malloc和free进行了简单的封装,;
第二级的配置器:而另一个设计到小块内存的管理等,运用了内存池技术等。在SGI-STL中默认的空间配置器是第二级的配置器。

6、仿函数(Function object)

就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。

STL仿函数中,按照操作数的个数划分,主要分为一元和二元仿函数;而按其功能划分,主要分为算法运算、关系运算,逻辑运算三大类。

为什么要使用仿函数呢?

  • 1).仿函数比一般的函数灵活。

  • 2).仿函数有类型识别,可以作为模板参数。

  • 3).执行速度上仿函数比函数和指针要更快的。

STL六大组件的关系
  • 容器通过空间配置器取得数据存储空间;

  • 算法利用迭代器向容器存取数据;

  • 仿函数协助算法完成不同的策略;

  • 适配器可以用来修改容器、迭代器或仿函数的接口;
    这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值