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>

容器的具体使用:

除以上容器外,还有一个常用的模板类 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;

 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值