您的位置:首页 > 编程语言 > C语言/C++

C/C++ STL 之 Iterator 基本元素

2014-08-03 00:00 471 查看
摘要: 粗浅介绍下C++STL库中Iterator类

这几天开始拜读《泛型编程和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;
};


其中模板中各类型的含义是

MemberDescribe
_CategoryIterator 类型
_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C/C++ STL Iterator