`
luotuoass
  • 浏览: 644156 次
文章分类
社区版块
存档分类
最新评论

如何定义自己的迭代器

 
阅读更多
基本上iterator必须做两件事情
1)
必须指向某物
2)
他必须能够遍历任何一个有效区间。一旦定义了operator* operator++通常剩下的行为就比较简单了。
必须确定iterator被正确的定义为constant或者mutable。这是常犯的错误之一。不过input iterator不在乎这一点,因为具有只读性。outputIterator具有只写性。
对于其他的类型的iterator就不一样了
定义自己的Iterator时,必须定义五个嵌套类型,iterator_categoryvalue_typedifference_typepointerreference
STL含有一个辅助类,base class iterator,
An empty base class that provides types and that may be used to ensure that a user-defines iterator class works properly with iterator_traits.
template<class Category, class Type, class Distance = ptrdiff_t
class Pointer = Type*, class Reference = Type&>
struct iterator {
typedef Category iterator_category;
typedef Type value_type;
typedef Distance difference_type;
typedef Pointer pointer;
typedef Reference reference;
};
Remarks
The template class serves as a base type for all iterators. It defines the member types
  • iterator_category (a synonym for the template parameter Category).
  • value_type (a synonym for the template parameter Type).
  • difference_type (a synonym for the template parameter Distance).
  • pointer (a synonym for the template parameter Pointer).
  • reference (a synonym for the template parameter Reference).
Note that value_type should not be a constant type even if pointer points at an object of const Type and reference designates an object of const Type.
下面是一个iterator的完整定义和使用
#include "stdafx.h"
#include <iterator>
using namespace std;
//下面函数主要来定义迭代器,一个专门针对还含有next的铁代器
template <typename Node, typename Reference = Node&, typename Pointer = Node*>
struct node_wrap_base_iterator:public iterator<forward_iterator_tag,Node,ptrdiff_t,Pointer,Reference>
{
typedef node_wrap_base_iterator<Node,Node&,Node*> iterator;
typedef node_wrap_base_iterator<Node,const Node&,const Node*> const_iterator;
Pointer ptr;
node_wrap_base_iterator(Pointer p = 0):ptr(p){}
node_wrap_base_iterator(const iterator& x):ptr(x.ptr){}
Reference operator*()const{return *ptr;}
Pointer operator->()const{return ptr;}
void incr(){ptr=ptr->next;}
node_wrap_base_iterator& operator++(){incr(); return *this;}
node_wrap_base_iterator operator++(int){node_wrap_base_iterator tmp=*this;incr();return tmp;}
bool operator==(const node_wrap_base_iterator& x) const {return ptr==x.ptr;}
bool operator!=(const node_wrap_base_iterator& x) const {return ptr!=x.ptr;}
};
测试:

typedef struct Node

{

int value;

Node* next;

}Node;

//重载<<

ostream& operator<<(ostream & out,Node node)

{

out<<node.value;

return out;

}

//使用迭代器

template<typename iterator>

void display(iterator begin,iterator end)

{

iterator tmp = begin;

while(tmp!=end&&tmp!=NULL)

{

cout<<*tmp<<" ";

tmp++;

}

cout<<endl;

}

template <typename Iterator>

//学习使用iterator_traits

typename iterator_traits<Iterator>::value_type test_traits(Iterator iter)

{

return *iter;

}

#define N 10

typedef node_wrap_base_iterator<Node>::iterator node_iterator;

int _tmain(int argc, _TCHAR* argv[])

{

Node node[N];

for(int i=0; i<N;i++)

{

node[i].value=i;

if(i < N-1)

node[i].next=&node[i+1];

else

node[i].next=NULL;

}

node_iterator beg(node);

node_iterator end(node+N);

display(beg,end);

Node test;

test.value=11;

test.next=NULL;

node_iterator iter(&test);

cout<<test_traits(iter);

cout<<endl;

return 0;

}

分享到:
评论

相关推荐

    C++学习篇——C++ STL中迭代器介绍

    迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值。例如,一个数组...

    C++_Iterator_迭代器_介绍

    迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值。例如,一个数组...

    迭代器实例

    c++ 迭代器 文本查询实例程序 c++ 迭代器 文本查询实例程序

    迭代器模式(Iterator Pattern)原理图

    迭代器(Iterator):定义一个访问聚合对象中元素的方法,并隐藏内部表示。 具体迭代器(Concrete Iterator):实现迭代器接口,对聚合对象进行遍历。 聚合对象(Aggregate):定义创建迭代器对象的接口。 具体聚合...

    关于List集合特有的迭代器的反向遍历

    Listiterator迭代器的方向遍历,在反向遍历时 源码中 index中的初值需要在定义的时候传入size集合长度 或者通过正向遍历,将nextIndex的值变为集合的长度 然后public boolean hasPrevious() { return nextIndex &gt; 0...

    C/C++迭代器使用具体解释

     每种容器类型都定义了自己的迭代器类型,如 vector:  vector&lt;int&gt;::iterator iter;  这符语句定义了一个名为 iter 的变量。它的数据类型是 vector&lt;int&gt; 定义的 iterator 类型。每一个标准库容器类型都定义了...

    wangwangla#qiuzhao#19.迭代器模式1

    迭代器模式提供一种可以遍历的聚合对象的方式聚合对象:存储数据迭代器:遍历数据代码实现定义迭代器定义聚合类private List list = new Arra

    详解Python3中的迭代器和生成器及其区别

    介绍 本篇将介绍Python3中的迭代器与生成器,描述可迭代与迭代器...2.迭代器定义: 迭代器:可迭代对象执行__iter__方法,得到的结果就是迭代器,迭代器对象有__next__方法 它是一个带状态的对象,他能在你调用next()方

    javascript设计模式之迭代器模式

    迭代器模式分为内部迭代器和外部迭代器,内部迭代器就是在函数内部定义好迭代的规则,它完全接手整个迭代的过程,外部只需一次初始调用。 内部迭代器 以下自行实现的类似jquery中$.each()的each()函数就是内部迭代...

    Python中的迭代器与迭代对象

    文章目录可迭代对象①可迭代对象定义②查看对象内部方法③总结迭代器①迭代器的定义②如何判断该对象是否是迭代器③可迭代对象如何转化成迭代器④迭代器取值⑤while模拟for的内部循环机制⑥小结可迭代对象与迭代器...

    设计模式中的迭代器模式在Cocoa Touch框架中的使用

    迭代器定义了一个用于访问集合元素并记录当前元素的接口。 不同的迭代器可以执行不同的迭代策略。 外部迭代器和内部迭代器: 外部迭代器 外部迭代器让客户端直接操作迭代过程,所以客户端需要知道

    Python迭代器定义与简单用法分析

    本文实例讲述了Python迭代器定义与简单用法。分享给大家供大家参考,具体如下: 一、什么是迭代器 迭代,顾名思义就是重复做一些事很多次(就现在循环中做的那样)。迭代器是实现了__next__()方法的对象(这个方法在...

    Python中生成器和迭代器的区别详解

    iter()函数会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素。next()也是python内置函数。在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句循环结束。 迭代器是用来帮助...

    Scala语法(iterator迭代器)

    iterator迭代器 scala针对每一类集合都提供了一个迭代器(iterator)用来迭代访问集合 使用迭代器遍历集合 使用iterator方法可以从集合获取一个迭代器 迭代器的两个基本操作 hasNext——查询容器中是否有下一个元素 ...

    Python迭代器和生成器定义与用法示例

    本文实例讲述了Python迭代器和生成器定义与用法。分享给大家供大家参考,具体如下: 迭代器 iter() 迭代器是访问集合中元素的一种方式,迭代器 object 从集合中的第一个元素开始访问,直到所有的元素被访问完成. 所以...

    JavaScript迭代器Iterall.zip

    Iterall是一个可以用在所有JavaScript环境中的迭代器(Iterators)。JavaScript Iterators for allIterall提供了一些重要的实用工具,用于在所有的Javascript环境中实现和使用迭代变量(Iterables)与类数组(Array-...

    c++设计模式-行为型模式-迭代器模式

    c++设计模式-行为型模式-迭代器模式;qt工程;c++简单源码;迭代器(Iterator)模式的定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

    Java-Edge#Java-Interview-Tutorial#Iterator迭代器到底是什么?1

    迭代器与枚举有两点不同:1. 迭代器允许调用者利用定义良好的语义在迭代期间,从迭代器所指向的 collection 移除元素2. 优化方法名其接口定义如下:Ob

    PHP设计模式之迭代器模式

    在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素而又不暴露该对象的内部表示,这就是PHP迭代器模式的定义。 适用场景: 访问一个聚合对象的内容而无需暴露它的内部表示 支持对聚合对象的多种遍历 为遍历...

Global site tag (gtag.js) - Google Analytics