STL学习笔记6 ——浅谈迭代器

一、迭代器

常用的迭代器按功能强弱分为输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器 5 种。
前向迭代器(forward iterator)

  • 假设 p 是一个前向迭代器,则 p 支持 ++p,p++,*p 操作,还可以被复制或赋值,可以用 == 和 != 运算符进行比较。此外,两个正向迭代器可以互相赋值。
  • 支持前向迭代器的容器有:forward_list / unordered_map / unordered_multimap / unordered_set / unordered_multiset
  • 支持前向迭代器的容器只包含begin()end() 函数成员,无 rbegin() 或 rend()

双向迭代器(bidirectional iterator)

  • 双向迭代器具有正向迭代器的全部功能,除此之外,假设 p 是一个双向迭代器,则还可以进行 --p 或者 p-- 操作(即一次向后移动一个位置)。
  • 支持双向迭代器的容器有:list / set / multiset / map / multimap (Associative containers)
  • 容器只包含begin()end()rbegin()rend() 4种函数成员

随机访问迭代器(random access iterator)

  • 随机访问迭代器具有双向迭代器的全部功能。除此之外,假设 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:
    p+=i / p+i:使得 p 往后移动 i 个元素;  p-=i / p-i:使得 p 往前移动 i 个元素。

  • vectorarraydeque均支持随机访问迭代器。

注意:容器适配器(stack、queue)不支持迭代器,因此只能通过top()、pop()函数来逐个访问元素。


二、迭代器的使用

迭代器的定义如下:

list<int>::iterator it;
list<int>::reverse_iterator rit;

也可以使用 auto 关键字:

auto it=mylist.begin();

举例:

#include <iostream>
#include <list>
#include <unordered_set>
using namespace std;

int main()
{
	list<int> mylist;
	mylist.push_back(5);
	mylist.push_back(6);
	mylist.push_back(5);
	mylist.push_back(4);
	mylist.push_back(10);
	
	list<int>::iterator it;
	list<int>::reverse_iterator rit; 
	
	for (auto it=mylist.begin(); it!=mylist.end(); it++){
		cout << *it << " ";
	}
	cout << endl;
	
	for (auto rit=mylist.rbegin(); rit!=mylist.rend(); rit++){
		cout << *rit << " ";
	}
	return 0;
}

输出结果为:

5 6 5 4 10
10 4 5 6 5

三、迭代器辅助函数

迭代器的辅助函数主要有以下几个:

辅助函数功能
advance(it, n)it 表示某个迭代器,n 为整数。该函数的功能是将 it 迭代器前进或后退 n 个位置。无返回值
distance(first, last)first 和 last 都是迭代器,该函数的功能是计算 first 和 last 之间的距离。
begin(cont)cont 表示某个容器,该函数可以返回一个指向 cont 容器中第一个元素的迭代器。
end(cont)cont 表示某个容器,该函数可以返回一个指向 cont 容器中最后一个元素之后位置的迭代器。
prev(it)it 为指定的迭代器,该函数默认可以返回一个指向上一个位置处的迭代器。注意,it 至少为双向迭代器。
next(it)it 为指定的迭代器,该函数默认可以返回一个指向下一个位置处的迭代器。注意,it 最少为前向迭代器。

advance() 用于将迭代器前进(或者后退)指定长度的距离,其语法格式如下:

template <class InputIterator, class Distance>
    void advance (InputIterator& it, Distance n);

distance() 函数用于计算两个迭代器表示的范围内包含元素的个数,其语法格式如下:

template<class InputIterator>
  typename iterator_traits<InputIterator>::difference_type distance (InputIterator first, InputIterator last);

begin()end()

  • 当将某个具体容器(比如 cont)作为参数分别传给 begin() 和 end() 函数时,其中 begin(cont) 底层会执行 cont.begin() 语句,而 end(cont) 底层会执行 cont.end() 语句,它们最终会将得到的迭代器作为函数的返回值反馈回来。
  • 当begin()和end()参数为数组时,将指定数组传给 begin() 函数,其会返回一个指向该数组首个元素的指针;将指定数组传给 end() 函数,其会返回一个指向数组中最后一个元素之后位置的指针。

next 功能和 prev() 函数类似,即用来获取一个距离指定迭代器 n 个元素的迭代器。next() 函数的语法格式如下:

template <class ForwardIterator>
    ForwardIterator next (ForwardIterator it, typename iterator_traits<ForwardIterator>::difference_type n = 1);

举个例子:

#include <iostream>
#include <list>
#include <unordered_set>
using namespace std;

int main()
{
	list<int> mylist;
	mylist.push_back(5);
	mylist.push_back(6);
	mylist.push_back(5);
	mylist.push_back(4);
	mylist.push_back(10);
	
	auto it = begin(mylist);	// *it=5
	cout << *it << endl;
	advance(it, 3);				// *it=4
	cout << *it << endl;
	it = prev(it, 2);			// *it=6
	cout << *it << endl;
	it = next(it, 3);			// *it=10
	cout << *it << endl;
	
	for (auto it=begin(mylist); it!=end(mylist); it=next(it, 1)){
		cout << *it << " ";
	}	
	return 0;
}

输出结果为:

5
4
6
10
5 6 5 4 10

参考内容:
C++ STL迭代器适配器完全攻略

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值