C++ 迭代器Iterator 和指针类似,可以用来遍历容器, 例如:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// Declaring a vector
vector<int> v = { 1, 2, 3 };
// Declaring an iterator
vector<int>::iterator i;
// Accessing the elements using iterators
for (i = v.begin(); i != v.end(); ++i)
{
cout << *i << " ";
}
return 0;
}
迭代器按照功能可以分为五大类:
1. Input Iterators: 只读, 单向顺序
2. Output Iterators: 只写,单向顺序
3. Forward Iterators: 读写,单向顺序
4. Biddirectional Iterators: 读写,双向顺序
5. Randon-Access Iteraotr: 读写,双向随机
不同容器的迭代器的功能:
容器 | 迭代器功能 |
---|---|
vector | 随机访问 |
deque | 随机访问 |
list | 双向 |
map / multimap | 双向 |
迭代器的种类定义为std中五个空结构体, 分别为:
struct input_iterator_tag { };
struct output_iterator_tag { };
struct forward_iterator_tag : public input_iterator_tag { };
struct bidirectional_iterator_tag : public forward_iterator_tag { };
struct random_access_iterator_tag : public bidirectional_iterator_tag { };
NOTE: 它们之间还有继承关系,从继承关系来看,C++标准只要求forward_iterator_tag继承自input_iterator_tag, 理论上后面的迭代器都是只读,但实际情况确实大部分迭代器也可以写, 如vector中的iterator.
原话是 “All forward, bidirectional and random-access iterators that are not constant iterators are also valid output iterators.”
iterator_traits
可使用iterator_traits
获取迭代器的特质信息。 iterator_traits有很多成员,其中iterator_category
就是迭代器的种类。
如我们可以是迭代器向前进n步, 如果是Randon-Access Iteraotr, 可以直接前进n步, 如果是其他类的迭代器只能做n次++操作, 如:
#include <iterator>
template<typename IterT, typename DistT>
void advance( IterT& iter, DistT d )
{
if( typeid( typename std::iterator_traits<IterT>::iterator_category )
== typeid( std::random_access_iterator_tag ) ) {
iter += d;
}
else {
if( d > 0 ) {
while( d-- ) ++iter;
}
else {
while( d++ ) --iter;
}
}
REF:
https://www.geeksforgeeks.org/introduction-iterators-c/
https://en.cppreference.com/w/cpp/iterator/iterator_traits
《Effective C++》
https://stackoverflow.com/questions/14058642/are-forward-iterators-output-iterators