1.什么是迭代器。
STL迭代器中的迭代器其实没什么大不了的,就是如同下面一个CLASS而已。
class Int_terator{
public:
Int_terator(T* p, int c): data(p), len(c){}
int valid() const { return len > 0; };
int next() {
--len;
return *data++;
}
};
利用上面的 Int_terator,我们可以写出如下函数:
int sum(Int_terator ir)
{
int result = 0;
while (ir.valid()){
result += ir.next();
return result;
}
}
任何 int 数组都可以使用。如 int x[10]; 可以sum( Int_terator(x, 10) );
但是如果类型不是int呢,如何写迭代器;简单用 template就可以了;如下:
template<class T>
class Iterator{
public:
Iterator(T* p, int c): data(p), len(c){}
T valid() const { return len > 0; };
T next() {
--len;
return *data++;
}
private:
T* data;
int len;
};
可以是上面的template 有指针,只能如此构造:int x[10]; sum( Iterator<int>(x, 10) );
如果想更加通用:list<T> coll; sum( coll::Iterator); 请仔细思考,下面是一个clue,不一定正确。
template<class T>
class Iterator{
public:
virtual int valid() const = 0;
virtual T next() = 0;
virtual ~Iterator(){}
};
2.迭代器的分类 http://blog.csdn.net/lsm307742191/article/details/3638661。
1、输入迭代器:类似键盘 只读
为输入迭代器预定义实现只有istream_iterator和istreambuf_iterator,用于从一个输入流istream中读取。一个输入迭代器仅能对它所选择的每个元素进行一次解析,它们只能向前移动。一个专门的构造函数定义了超越末尾的值。输入迭代器需要定义 *iter, ++iter,interA != interB.其中 *iter只读。
2、输出迭代器:类似屏幕只写
为输出迭代器的预定义实现只有ostream_iterator和ostreambuf_iterator,用于向一个输出流ostream写数据,还有一个一般较少使用的raw_storage_iterator。他们只能对每个写出的值进行一次解析,并且只能向前移动。对于输出迭代器来说,没有使用超越末尾的值来结束的概念。输出迭代器需要定义 *iter, ++iter,interA != interB.其中 *iter只写。
3、前向迭代器:多次读/写
前向迭代器包含了输入和输出迭代器两者的功能,加上还可以多次解析一个迭代器指定的位置,因此可以对一个值进行多次读/写。顾名思义,前向迭代器只能向前移动。没有为前向迭代器预定义迭代器。
4、双向迭代器:operator--
双向迭代器具有前向迭代器的全部功能。另外它还可以利用自减操作符operator--向后一次移动一个位置。由list容器中返回的迭代器都是双向的。
5、随机访问迭代器:类似于一个指针
随机访问迭代器具有双向迭代器的所有功能,再加上一个指针所有的功能(一个指针就是一个随机访问迭代器),除了没有一种“空(null)”迭代器和空指针对应。基本上可以这样说,一个随机访问迭代器就像一个指针那样可以进行任何操作,包括使用操作符operator[]进行索引,加某个数值到一个指针就可以向前或者向后移动若干个位置,或者使用比较运算符在迭代器之间进行比较。随机迭代器把+,-, +=, 和 []增加到双向迭代器操作中。