C++语言基础 —— STL —— 容器与迭代器
【概述】
STL 是指 C++ 标准模板库,是 C++ 语言标准中的重要组成部分,其以模板类和模版函数的形式提供了各种数据结构与算法的精巧实现,如果能充分使用 STL,可以在代码空间、执行时间、编码效率上得到极大的提高。
STL 大致可以分为三大类:容器(Container)、迭代器(iterator)、算法(algorithm)。
STL 容器是一些模板类,提供了多种组织数据的常用方法,例如:vector(向量)、list(列表)、deque(双向队列)、set(集合)、map(映象)、stack(栈)、queue(队列)、priority_queue(优先队列) 等,通过模版的参数可以指定容器中元素类型。
STL 算法是一些模板函数,提供了相当多的有用算法和操作,从简单如 for_each(遍历) 到复杂如 stable_sort(稳定排序)。
STL 迭代器是对 C 中的指针的一般化,用来将算法和容器联系起来,几乎所有的 STL 算法都是通过迭代器来存取元素序列进行工作的,而STL 中的每一个容器也都定义了其本身所专有的迭代器,用以存取容器中的元素。
【容器】
容器主要分为三类:序列式容器(vector、list、deque)、适配器容器(stack、queue、priority_queue)、关联式容器(set、multiset、map、multimap)
其特点如下:
- 向量(vector):连续存储的元素,位于 <vector>
- 列表(list):由节点组成的双向链表,每个结点包含着一个元素,位于 <list>
- 双端队列(deque):连续存储的指向不同元素的指针所组成的数组,位于 <deque>
- 栈(stack):后进先出的值的排列,位于 <stack>
- 队列(queue):先进先出的值的排列,位于 <queue>
- 优先队列(priority_queue):元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列,位于 <queue>
- 集合(set):由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序,位于 <set>
- 多重集合(multiset):允许存在两个次序相等的元素的集合,位于 <set>
- 映射(map):由键-值对组成的集合,以某种作用于键对上的谓词排列,位于 <map>
- 多重映射(multimap):允许键对有相等的次序的映射,位于 <map>
容器的具体使用:
- pair(元素对):点击这里
- vector(向量):点击这里
- list(列表)与 deque(双端队列):点击这里
- stack(栈)与 queue(队列):点击这里
- priority_queue(优先队列):点击这里
- set(集合)与 multiset(多重集合):点击这里
- map(映射)与 multimap(多重映射):点击这里
- heap(堆):点击这里
除以上容器外,还有一个常用的模板类 bitset,具体使用:点击这里
【迭代器的使用】
C++ 的 STL 为每一种容器都定义了一种迭代器类型,迭代器是一种检查容器内元素并遍历元素的数据类型,C++ 中,对容器的访问操作更趋向于是用迭代器而非下标操作,只有少数容器(如 vector)支持下标操作访问容器元素。
迭代器类型可以用 * 操作符来访问迭代器所指向的元素,以 *iter = 0 为例,假设 it 指向 vector 对象 v 的第一个元素,那么 *iter 与 v[0] 就是指向同一个元素,那么 *iter = 0 就是将这个元素赋值为 0,同数组类似,迭代器可以使用自增、自减操作符向前、向后移动迭代器指向容器中的下一个元素。
迭代器的常用操作:
- *iter:对 iter 进行解引用,返回迭代器 iter 指向的元素的引用
- iter->men:对 iter 进行解引用,获取指定元素中名为 men 的成员,等效于 (*iter).men
- ++iter、iter++:给 iter 加 1,使其指向容器的下一个元素
- --iter、iter--:给 iter 减 1,使其指向容器的前一个元素
- iter1==iter2:比较两个迭代器是否相等
- iter1!=iter2:比较两个迭代器是否不等
几乎每种容器都定义了一对 begin()、end() 函数,用于返回相应的迭代器,如果容器中有元素的话,由 begin() 返回的迭代器指向第一个元素,而由 end() 返回的迭代器指向容器中最后一个元素的下一个位置,其没有指向任何实际的元素,它只是起一个标志的作用,表示已处理完容器中的所有元素。由于 end() 返回的迭代器不指向任何元素,因此不能对它进行解引用(*)或自增(++)操作。
假设已经声明一个 vector<int> 的 ivec 容器,可以用迭代器来遍历 ivec 容器,把其每个元素重置为0:
vector<int> v;
vector<int>::iterator iter=ivec.begin();
for(;iter!=ivec.end();iter++)
*iter=0;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具