一、迭代器
常用的迭代器按功能强弱分为输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器 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 个元素。 -
vector
、array
、deque
均支持随机访问迭代器。
注意:容器适配器(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迭代器适配器完全攻略