C++编程失乐园

致力于解决论坛的不足,探讨C++的原理

C++随笔 之 C++标准库5(原创)--STL

STL 是个部件库 (component library) ,其中的部件包括有容器 (container ,储存任意类型对象的对象 ) 和算法。只要用户对自己定义的部件做点小小的要求, STL 中的算法就可以工作在用户自定义的容器上,或者 STL 中的容器可以使用用户自定义的算法。
我们可以把软件部件想象成一个三位空间。第一维表示数据类型(int, double, char, …),第二维表示容器(array, linked-list, …)
,
第三维表示算法
(sort, merge, search, …)
。

STL 包含 5 个主要的部分,
·算法 (Algorithm) :能运行在不同容器 (container) 上的计算过程

·容器 (Container) :能够保留并管理对象的对象

·迭代器 (Iterator) :算法存取容器 (algorithm-access to containers) 的抽象,以便算法可以应用在不同的容器上

·函数对象 (Function Object) :定义了函数调用操作符 (operator()) 的类

·适应器 (Adaptor) :封装一个部件以提供另外的接口 ( 例如用 list 实现 stack)


正是因为有了Iterator,算法才和容器分开了.

容器
(Container) 是能够保存其他类型的对象的类。容器形成了 STL 的关键部件。当书写任何类型软件的时候,把特定类型的元素集聚起来都是很至关重要的任务。

       STL 中有顺序容器 (Sequence Container) 和关联容器 (Associative Container) 。

STL 中支持的容器总结如下:

顺序容器 (Sequence Container)

向量 (Vector)

 

双向队列 (Deque)

 

线性表 (List)

关联容器 (Associative Container)

集合 (Set)

 

多集合 (MultiSet)

 

映射 (Map)

 

多映射 (MultiSet)


迭代器
(Iterator) 是指针 (pointer) 的泛化,它允许程序员以相同的方式处理不同的数据结构 ( 容器 ) 。 STL 中有 5
中类型的迭代器,它们分别满足一定的要求。不同的迭代器要求定义的操作不一样。
输入和输出迭代器
向前迭代器
双向迭代器
任意存取迭代器

算法

STL 库中的算法都以迭代器类型为参数,这就和数据结果的具体实现分离开了。基于此,这些算法被称作基本算法 (generic algorithm) 。
如“寻找(Find)”、“邻居寻找(Adjacent find)”、“计数(Count)”、“不匹配(Mismatch)”、“相等(Equal)”、“搜索(Search)
”拷贝(Copy)”、“交换(Swap)”、“变换(Transform)”、“替换(Replace)”、“填充(Fill)”、“产生(Generate)”、“迁移(Remove)”、“唯一(Unique)”、“翻转(Reverse)”、“旋转(Rotate)”、“任意洗牌(Random shuffle)”、“分区(Partitions)”

适应器
(Adaptor) 是提供接口映射的模板类 (Adaptors are template classes that provide interface mappings)
。适应器基于其他类来实现新的功能,成员函数可以被添加、隐藏,也可合并以得到新的功能。

栈 (Stack)

       栈可以用向量 (vector) 、线性表 (list) 或双向队列 (deque) 来实现:

stack<vector<int>>       s1;

stack<list<int>       >     s2;

stack<deque<int>>s3;

队列 (Queue)

       队列可以用线性表 (list) 或双向队列 (deque) 来实现 ( 注意 vector container 不能用来实现 queue ,
因为
vector 没有成员函数 pop_front! ) :

queue<list<int>>    q1;

queue<deque<int>>       q2;

优先级队列 (Priority Queue)

       优先级队列可以用向量 (vector) 或双向队列 (deque) 来实现 ( 注意 list container 不能用来实现 queue ,
因为
list 的迭代器不是任意存取 iterator ,而 pop 中用到堆排序时是要求 random access iterator 的 ! ) :

priority_queue<vector<int>, less<int>>        pq1;        // 使用递增 less<int> 函数对象排序

priority_queue<deque<int>, greater<int>>    pq2;       // 使用递减 greater<int> 函数对象排序

迭代适应器

逆向迭代器 (Reverse Iterator)

       顾名思义,逆向迭代器的递增是朝反方向前进的。对于顺序容器 (vector, list 和 deque) ,其成员函数 rbegin() 和 rend() 都返回了相应的逆向迭代器:

list<int> l;

for (int i = 1; i < 5; i++)

       l.push_back(i);

copy(l.rbegin(), l.rend(), ostream_iterator<int> (cout, “ “));

输出结果是: 4 3 2 1

 

插入迭代器 (Insert Iterator)

       插入迭代器简化了向容器中插入元素的工作。插入迭代器指定了向容器中插入元素的位置。 STL 中有三种插入迭代器:

·向后插入 (back_insert_iterator) ,在容器尾部插入

·向前插入 (front_insert_iterator) ,在容器头部插入

·插入 (insert_iterator) ,在容器中任一位置

STL 中提供了三个函数分别构造相应的插入迭代器:

· back_inserter

· front_inserter

· inserter

 

原始存储迭代器 (Raw Storage Iterator)

       该迭代器允许算法将其结果保存进没有初始化的内存中。

函数适应器

否认者 (Negator)

       有两个否认者 not1 和 not2 分别是一元和二元函数,它们分别使用一元和二元的谓词 (Predicate) ,返回的是谓词的结果的取反。

 

包扎者 (Binder)

       STL 中有两个包扎者函数 bind1st 和 bind2nd ,可以将一些值限定在指定区间中。

 

函数指针的适应器 (Adaptors for pointers to function)

       STL 中的算法和容器一般都需要函数对象 (function object) 作为参数。如果想用到常用的 C++ 函数时,可以用 ptr_fun 把普通函数转换成函数对象。比如 ptr_fun(strcmp) 就把常用的串比较函数 strcmp 包装成一个函数对象,就可用在 STL 算法和容器中了。

posted on 2007-01-04 10:48 木木头 阅读(1609) 评论(2)  编辑 收藏 引用 所属分类: C++特性

评论

# re: C++随笔 之 C++标准库5(原创)--STL 2007-01-04 13:01 pengkuny

看来STL功能很强大,我得好好学一下  回复  更多评论   

# re: C++随笔 之 C++标准库5(原创)--STL 2007-10-11 21:24 ptrrrrr

文中的Stack,Queue和priority_queue举的例子,全都少了一个参数,而且书写有点问题

比如stack<vector<int>> s1;

应该是stack<int, vector<int> > s1;  回复  更多评论   

导航

<2007年12月>
日一二三四五六
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

常用链接

留言簿(3)

随笔分类(29)

搜索

最新随笔

最新评论