Copyright@Augenstern
在第一周,我对标准模板库STL进行了学习,将各部分组件及其关系梳理成思维导图的形式,展示如下:
现将各组件作用,适用范围整理如下,便于理解记忆:
STL: 是泛型程序设计的代表作品。包含很多基本算法和数据结构,且将算法与数据结构完全分离。
容器(container): 是能够保存各种类型对象的类(我认为与模板类类似,,可以看作一个模板类的集合)。
顺序容器(sequence container): 对象的线性集合,所有对象都是同一类型。
向量(vector): 多功能的,能连续存放各种类型对象的类模板。
连续储存的元素,从后面插入删除元素,直接访问任何元素,支持[]
下标运算符访问操作。
- 列表(list): 由节点组成的双向链表,从任意位置插入删除。
没有重载[]
运算符,所以不支持随机存取。
双向队列(deque): 可以从双向进行操作的队列,从前面/后面插入/删除元素,直接访问任何元素。
关联容器(associative container): 关联容器内元素有序,在查找时具有良好的性能。关联容器包括集合,映射,多集合,多映射。
集合(set): 快速查找,无重复元素,元素有关键字和值两部分,元素顺序根据关键字确定,
set
中不可有关键字相同的元素,重载了[]
运算符。多集合(multiset): 快速查找,允许出现关键字相同的元素。
映射(map): 也称为字典或关联数组。由键值对组成的集合,无重复元素,基于键进行查找。要求键
key
在容器中是唯一的,对应的value
数据值可以重复。容器适配器(container adapter): 包括队列,栈,优先级队列。
队列(queue): 支持先进先出(FIFO)模式的数据存取。
栈(stack): 支持先进后出(FILO)模式的数据存取。
优先级队列(priority_queue): 每次从队列中取出的元素具有最高的优先级,优先级与元素的值相关联。具体例子如银行排队中,
VIP用户时间长>VIP用户时间短>普通用户时间长>普通用户时间短
。迭代器(iterator): 迭代器是指针的泛化,是一种检查容器内元素并遍历元素的数据类型。通过对一个迭代器的解引用操作(
*
),可以访问到容器内所包含的元素。输入迭代器: 提供读功能的向前移动迭代器,可进行增加,比较与解引用。
输出迭代器: 提供写功能的向前移动迭代器,可进行增加,比较与解引用。
前向迭代器: 同时具有输入迭代器和输出迭代器的功能,并可对迭代器的值进行储存。
双向迭代器: 同时提供读写功能,同forward迭代器,但可用来进行增加或减少操作。
随机迭代器: 提供随机读写功能,是功能最强大的迭代器,具有双向迭代器的全部功能,同时实现指针的算数与比较运算。
反向迭代器: 同随机迭代器或前向迭代器,但其移动是反向的。
不同容器支持的迭代器不同,常见容器支持的迭代器类型如下表:
容器 | 迭代器类别 |
---|---|
vector | 随机迭代器 |
deque | 随机迭代器 |
list | 双向迭代器 |
set / multiset | 双向迭代器 |
map / multimap | 双向迭代器 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
priority_queue | 不支持迭代器 |
算法:以迭代器类型为参数,和数据的具体实现分离。头文件:algorithm.h
学习成果:
- 使用vector及迭代器完成对一组数中出现次数大于2的数字进行输出:
运行截图:
实现难点:令出现多次的元素再后续遍历中不再重复输出。后采用返回首次出现的迭代器与现在所在的位置进行比较的方法解决。
- 使用map实现简单英汉词典
实现截图:
可改进:可以通过multimap实现一词多义,也可以通过读取文本文档的方式预先导入词库。
通过学习发现存在的一些问题:
绝大部分容器迭代器仅限于了解,并未真正进行尝试;
迭代器与容器元素混淆不清,常进行等价使用并因此报错;
对于算法的返回值理解不清,使用时常常出现问题,日后还需多加努力。