这几天开始拜读《泛型编程和STL》,没想到一开始就遇到“老虎”-- Iterator,文章第二、三章均围绕其展开。平时在使用vector,map的迭代器的时候倒是没有注意到原来迭代器也如此美妙。随即百度之以便自行补脑,但发现不少都是基本的使用,对于我这样技术小白,自然很多不是完全顿悟。心想,算了,还是自己研究下Iterator吧。
按《泛型编程和STL》中介绍是这样,Iterator是指针的概括物:它们是用来指向其他对象的一种对象,这对于像find这样的泛型算法很重要,因为它们可以用来在对象区间内移动。Iterator对于泛型编程重要在于,它是算法与数据结构之间的接口。
Iterator模板类的定义在<xutility>中,而并不是在<iterator>。
// TEMPLATE CLASS iterator
template<class _Category,
class _Ty,
class _Diff = ptrdiff_t,
class _Pointer = _Ty *,
class _Reference = _Ty&>
struct iterator
{ // base type for all iterator classes
typedef _Category iterator_category;
typedef _Ty value_type;
typedef _Diff difference_type;
typedef _Diff distance_type; // retained
typedef _Pointer pointer;
typedef _Reference reference;
};
其中模板中各类型的含义是
Member | Describe |
_Category | Iterator 类型 |
_Ty | 所指向的对象元素类型 |
_Diff | 距类型以描述迭代器之间距离,默认ptrdiff_t |
_Pointer | 所指向对象元素指针 |
_Reference | 所指向对象元素引用 |
迭代器类型为常见的五种类型
Input Iterators
Output Iterators
Forward Iterators
Bidirectional Iterators
Random Access Iterators
主要差别与联系可见 http://www.cplusplus.com/reference/iterator/
为便于理解,转一个关于Iterator类的例子
// std::iterator example
#include <iostream> // std::cout
#include <iterator> // std::iterator, std::input_iterator_tag
class MyIterator : public std::iterator<std::input_iterator_tag, int>
{
int* p;
public:
MyIterator(int* x) :p(x) {}
MyIterator(const MyIterator& mit) : p(mit.p) {}
MyIterator& operator++() {++p;return *this;}
MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;}
bool operator==(const MyIterator& rhs) {return p==rhs.p;}
bool operator!=(const MyIterator& rhs) {return p!=rhs.p;}
int& operator*() {return *p;}
};
int main () {
int numbers[]={10,20,30,40,50};
MyIterator from(numbers);
MyIterator until(numbers+5);
for (MyIterator it=from; it!=until; it++)
std::cout << *it << ' ';
std::cout << '\n';
return 0;
}
如果错误还请轻拍。
文章参考:
【1】http://www.cplusplus.com/reference/iterator/
【2】http://http://msdn.microsoft.com/en-us/library/x9be4t1b.aspx