STL源码解析1—六大组件关系

来源:互联网 发布:80c51单片机引脚功能 编辑:程序博客网 时间:2024/05/21 11:35

一. STL六大组件介绍

 STL就是容器类+算法实现+迭代器+配接器+仿函数+配置器.容器通过配置器取得数据存储空间,算法通过迭代器存取容器内容,仿函数可以协助算法完成不同的策略变化,配接器可以修饰或套界仿函数


1. 容器

STL容器包含两种:序列式容器主要有vector、list、deque,以及关联式容器主要有set、map、multiset、multimap。

容器主要是用来存放数据的,从实现的角度来看容器是一种class template(类模板)。


2. 算法

STL包含算法主要有sort、search、copy、erase、find等,从实现的角度来说算法是一种function template(函数模板)

注意一个问题:任何的一个STL算法,都需要获得由一对迭代器所标示的区间,用来表示操作范围。这一对迭代器所标示的区间都是前闭后开区间,例如[first, last)。也就是说实际上,整个区间是从first开始到last-1,迭代器last指的是最后一个元素的下一个位置。在STL中所有区间都是采用前闭后开,这样可以带来很多方便。


3. 迭代器

STL中迭代器主要用来把容器和算法结合起来,扮演容器与算法之间的胶合剂,是所谓的“泛型指针”。从实现的角度看迭代器是一种将operator*、operator->、operator++、operator--等指针操作重载的class template(类模板)。所有的STL容器都有自己的迭代器,只有容器本身才知道如何遍历自身的元素。

迭代器有五种型别:Input、Output、Forward、Bidirectional和Random Iterator。


4. 仿函数

仿函数是一种行为类似函数,但是实际是重载了operator()的class或class template(类模板),一般函数指针可视为狭义的仿函数。

下面是一个重载函数的例子:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. #include<algorithm>  
  3. using namespace std;  
  4.   
  5. class A{  
  6. public:  
  7.       int operator()(int x, int y){  
  8.           return x+y;  
  9.       }  
  10. };  
  11.    
  12. int main(){   
  13.     A *a = new A();  
  14.     cout<<(*a)(3,4)<<endl;  
  15.       
  16.     getchar();  
  17.     return 0;  
  18. }  
  19. /* 
  20. 输出 
  21.  
  22. */  

5. 适配器

适配器主要用来修饰容器接口、迭代器接口或仿函数接口的东西;STL提供了stack、queue两种容器适配器,stack和queue的底层完全是由deque来实现的。

改变容器接口的称为容器适配器、改变迭代器接口的称为迭代器适配器、改变仿函数接口的称为仿函数适配器。

容器配接器(container adapter):改变容器接口。

迭代器配接器(iterator adapter):改变迭代器接口。

仿函数配接器(function adapter):改变仿函数接口。


6. 空间配置器

STL的空间配置器主要用来给容器进行空间的配置与管理,从实现的角度来说空间配置器是实现了一个动态分配空间、空间管理、空间释放的class template(类模板)。

(1)容器缺省的配置器为alloc,而非allocator。(两者区别,之后介绍)

(2)stl 将内存空间的配置/释放和对象内容的构造/析构分开,由不同操作负责。

内存配置操作由alloc:;alllocate()负责,内存释放由alloc::deallocate()负责;

对象构造由::construct()负责,对象析构由::destroy()负责。

(3)内存空间采用双层级配置器。第一级使用malloc()和free(),第二级则视不同的情况采取不同的策略,当配置区域块超过128bytes时,调用第一级配置器;当配置区域小于128byte时,采用memory pool整理方式。因为在小额区太多时,配置时负担也重,所以在小区域时用的策略也多。

(4)二级配置器,主动将小额区块的内存需求上调至8的倍数,并维护16个freelists,各自管理大小分别为8、16、24、32…128bytes的小额区块。



二. STL六大组件的交互关系



 容器通过空间配置器取得数据存储空间;算法利用迭代器向容器存取数据;仿函数协助算法完成不同的策略;适配器可以用来修改容器、迭代器或仿函数的接口;


写这几种关系的时候自己也还是有很多不懂得地方,但是之后会对这几部分做分别介绍,一定得了解了,才能更好地使用!

0 0
原创粉丝点击