STL学习笔记1— —STL简述

来源:互联网 发布:php 中英文企业网站 编辑:程序博客网 时间:2024/06/06 01:33

STL(Standard Template Library)里有很多组成部分,但是主要有三个,容器、迭代器和算法
容器用来管理某个特定对象的集合。每一种容器都有自己的优点和缺点,在项目中根据不同的需求,使用不同的容器。容器可以是数组、链表或者类字典。
迭代器用于遍历对象集合的元素。这些集合可以是容器或容器的子集。每一个容器类都提供了它自己的迭代器类型。
算法用来处理的元素的集合。例如,可以进行搜索、排序等操作。
STL的数据和操作是分离的。数据存储在容器里,使用算法进行操作。迭代器是这两者之间的粘合剂,让算法与容器可以进行交互。
这里写图片描述
某种程度上,STL的概念与面向对象编程的原则相背,
STL数据和算法是分离的而不是结合。STL是泛型编程的一个很好的例子。容器和算法分别是任意类型和类的泛型。STL提供了更通用的组件。还可以通过使用适配器和仿函数来达到特殊要求。

容器

容器管理着一系列元素,为了满足不同的需求,STL提供了多种类型的容器,见下图。
这里写图片描述
主要可以分为三大类
序列容器是有序集合,其中的每个元素都有特定位置。这个位置取决于插入的时间和地点,但是它跟元素的值无关。STL包含5个预定义的序列容器类:array、vector、deque、list和forward_list。
关联容器是把元素的值按照某种规则排好顺序的集合。STL包含4个预定义的关联容器类:set、multiset、map和multimap。
无序(关联)容器是无序集合。主要关注一个元素是否在集合中。不论是插入的顺序还是插入元素的值对元素的位置都没有任何影响。STL包含4个预定义的无序容器类:unordered_set、unordered_multiset、unordered_map和unordered_multimap。

序列容器通常是数组或链表的实现
关联容器通常是二叉树的实现
无序容器通常是哈希表的实现

容器适配器

容器适配器提供顺序容器的特殊接口

stack 堆栈适配器(LIFO)
queue 改写容器来提供队列(FIFO数据结构)
priority_queue 改写容器来提供优先级队列

迭代器

根据迭代器所支持的操作,一般分为下面5种。
前向迭代器只能利用递增运算符进行前向迭代。像unordered_set、unordered_multiset、unordered_map和unordered_multimap这些容器都“至少”是用前向迭代器(某些情况下可以提供双向迭代器)。
双向迭代器是可以用递增运算符向前迭代,或者用递减运算符向后迭代。像list、set、multiset、map和multimap的迭代器都是双向迭代器。
随机访问迭代器具有双向迭代器的所有属性。此外,他们还可以进行随机访问。这种迭代器本身支持运算操作,可以改变偏移量,也可以利用关系运算符(< 和 >)比较迭代器。像vector、deque、array和string的迭代器都是这类迭代器。
输入迭代器能够在迭代时读取或处理一些值。如Input stream iterators。
输出迭代器能够在迭代时输出一些值。如Inserters、和output stream iterators。

算法

STL提供了一些标准算法来处理集合元素。这些算法一般提供最基本的功能,如搜索、排序、复制、修改和数值处理。

算法不是容器类的成员函数,而是全局函数。算法可以操作不同容器类型的元素,甚至可以操作用户自定义的容器类型。总之,既减少了代码量,又增强了性能。

迭代器适配器

任何操作起来像迭代器的东西都可以当作迭代器。所以可以写出像迭代器的一些类但又执行不一样的操作。C++标准库提供的一些预定义的特殊迭代器,即迭代器适配器。
一般分为四类:
Insert iterators也称为inserters,用来将“赋值新值”操作转换为“安插新值”操作。通过这种迭代器,算法可以执行安插(insert)行为而非覆盖(overwrite)行为。所有Insert迭代器都隶属于Output迭代器类型,所以它只提供赋值(assign)新值的能力。通常算法会将数值赋值给目的迭代器,如copy()算法
Stream iterators是一种迭代器配接器,可以把stream当成算法的原点和终点。更明确的说,一个istream迭代器可以用来从input stream中读元素,而一个ostream迭代器可以用来对output stream写入元素。Stream迭代器的一种特殊形式是所谓的stream缓冲区迭代器,用来对stream缓冲区进行直接读取和写入操作。
Reverse iterators重新定义递增运算和递减运算,使其行为正好倒置。
Move iterators很像一个底层迭代器(必须至少有一个InputIterator)。如果这个迭代器被当作输入迭代器来用,要注意的是,值的操作是移动而不是复制。

仿函数

算法函数的参数不一定非要是函数。可以是行为类似函数的对象,称为函数对象,或仿函数。

原创粉丝点击