C++ 迭代器模式实现

STL模板库中有大量迭代器实现,这些迭代器隔离了算法实现与访问接口,我们也可以编写属于自己的迭代器。STL中的迭代器均继承至一个通用迭代器接口:

template <class _Category, class _Tp, class _Distance = ptrdiff_t,
          class _Pointer = _Tp*, class _Reference = _Tp&>
struct iterator {
  typedef _Category  iterator_category; //迭代器类型
  typedef _Tp        value_type;
  typedef _Distance  difference_type;
  typedef _Pointer   pointer;
  typedef _Reference reference;
};

迭代器类型用于指明实例化迭代器的标签,如:输入迭代器(写)、输出迭代器(读)、随机访问迭代器等,算法可通过不同迭代器种类来实现各版本。

__distance算法就针对不同迭代器不同的实现:

template <class _InputIterator, class _Distance>
inline void __distance(_InputIterator __first, _InputIterator __last,
                       _Distance& __n, input_iterator_tag)
{
  while (__first != __last) { ++__first; ++__n; }
}

template <class _RandomAccessIterator, class _Distance>
inline void __distance(_RandomAccessIterator __first,
                       _RandomAccessIterator __last,
                       _Distance& __n, random_access_iterator_tag)
{
  __STL_REQUIRES(_RandomAccessIterator, _RandomAccessIterator);
  __n += __last - __first;
}

所有的迭代器种类声明如下:

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 {};

 迭代器的重要方法如下:

T& operator*() const
T* operator->() const
bool operator==(const iterator & __x) const
bool operator!=(const iterator & __x) const
iterator& operator++()
iterator operator++(int)

 这样就可以实现自己的迭代器了:

#include <iostream>
#include <iterator>

using namespace std;

template <typename T>
struct _A_node {
	_A_node *next;
	_A_node *prev;
	T data;
};

template <typename T>
class A_Iterator:public iterator<forward_iterator_tag,T>
{
private:
	typedef A_Iterator<T> self;

	_A_node<T> *_node;
	void incr()
	{
		_node = _node->next;
	}

	void decr()
	{
		_node = (_A_node<T>*)_node->prev;
	}

public:
	A_Iterator():_node(0) {}
	A_Iterator(_A_node<T> *x):_node(x) {}
	~A_Iterator() {}

	T& operator*() const { return _node->data;}
	T* operator->() const {return &(operator*());}

	bool operator==(const self& __x) const {
		return _node == __x._node;
	}

	bool operator!=(const self& __x) const {
		return _node != __x._node;
	}

	self& operator++() { incr(); return *this;}
	self operator++(int) { self __tmp = *this; incr(); return __tmp;}

	self& operator--() {decr();return *this;}
	self operator--(int) {self __tmp = *this; decr();return __tmp;}

};

template <typename T>
class A {
private:
	typedef T Node;
	_A_node<T> *pNode;
public:
	typedef A_Iterator<T> iterator;
	typedef _A_node<T> _Node;

	A() {
		pNode = new _A_node<T>;
		pNode->next = pNode;
		pNode->prev = pNode;
	}
	~A() {
		//add delete node function here
		delete pNode;
	}

	iterator begin() {return (_Node *)(pNode->next);}
	iterator end() {return pNode;}	

	///////////////// method /////////////////////
	void push(T value)
	{
		_A_node<T> *v = new _A_node<T>;
		v->data = value;

		v->next = pNode->next;
		pNode->next->prev = v;

		pNode->next = v;
		v->prev = pNode;

	}

	T pop()
	{
		T value;

		_Node *next = pNode->next;
		pNode->next = next->next;
		next->prev = pNode;

		next->prev = next;
		next->next = next;

		value =  next->data;
		delete next;

		return value;
	}
};

int main(int argc, char *argv[])
{
	A<int> a;
	a.push(1);
	a.push(2);
	a.pop();
	for(A<int>::iterator iter = a.begin();iter != a.end();iter++) {
			*iter = 3;
			std::cout << "value:" << *iter << std::endl;
	}

	int b = a.pop();

	std::cout << (a.begin() == a.end()) << ",b:" << b << std::endl;
	return 0;
}

  

时间: 2024-07-29 02:37:22

C++ 迭代器模式实现的相关文章

JavaScript设计模式 - 迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素 许多浏览器都支持 Javascript 的 Array.prototype.forEach 迭代器可以分为 内部迭代器 和 外部迭代器 一.jQuery 中的迭代器 1 $.each( [1,2,3,4], function (i, n) { 2 console.log( "当

设计模式之迭代器模式

介绍 迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 迭代器的几个特点是: 访问一个聚合对象的内容而无需暴露它的内部表示. 为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作. 遍历的同时更改迭代器所在的集合结构可能会导致问题(比如 C# 的 foreach 里不允许修改 item). 正文 一般的迭代,我们至少要有 2 个方法,hasNext()和 Next(),这样才做做到遍历所有对象,我们先给出一个例子:

设计模式之三:迭代器模式(IteratorPattern)

迭代器(Iterator)模式,又叫游标(Cursor)模式.其定义为:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节.迭代器模式是和容器相关的,对容器对象的访问设计到遍历算法. 迭代器模式由以下角色组成: 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口. 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并记录遍历中的当前位置. 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口. 具体容器

JavaScript设计模式与开发实践 迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示.迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素. 一.内部迭代器和外部迭代器 1. 内部迭代器 内部迭代器函数的内部已经定义好了迭代规则,它完全接手整个迭代过程,外部只需要一次初始调用. 内部迭代器在调用的时候非常方便,外界不用关心迭代器内部的实现,跟迭代器的交互也仅仅是一次初始调用,但这也刚好是内部迭代器的缺点. var e

javascript设计模式学习之七——迭代器模式

一.迭代器模式定义 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,并且不需要暴露该对象的内部表示. 在当前大部分语言中,都已经内置了迭代器模式.迭代器有内部迭代器和外部迭代器之分,一般现有语言中实现的大多是内部迭代器. 二.jquery中的each实现 //类似jquery中的each迭代器 $.each=function(obj,callback){ var value, i=0, isArray=isArrayLike(obj), length=obj.length; if(isA

【设计模式】迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为型模式. 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示. 主要解决:不同的方式来遍历整个整合对象. 何时使用:遍历一个聚合对象. 如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象. 关键代码:定义接口:hasNext, next. 应用实例:JAVA 中的

行为型模式之迭代器模式

概述 在软件开发中,我们经常需要使用聚合对象来存储一系列数据.聚合对象拥有两个职责:一是存储数据:二是遍历数据.从依赖性来看,前者是聚合对象的基本职责:而后者既是可变化的,又是可分离的.因此,可以将遍历数据的行为从聚合对象中分离出来,封装在一个被称之为“迭代器”的对象中,由迭代器来提供遍历聚合对象内部数据的行为,这将简化聚合对象的设计,更符合“单一职责原则”的要求. 定义 迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cu

Java设计模式系列之迭代器模式

迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()),移出当前对象的方法remove(), (2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代. (3)容器角色(Aggregate): 

js迭代器模式

在迭代器模式中,通常有一个包含某种数据的集合的对象.该数据可能储存在一个复杂数据结构内部,而要提供一种简单 的方法能够访问数据结构中的每个元素. 实现如下: //迭代器模式 var agg = (function(){ var index = 0, data = [1,2,3,4,5], length = data.length; return{ next:function(){ var element; if(!this.hasNext()){ return null; } element =

PHP设计模式——迭代器模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 迭代器模式:迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该集合序列底层的结构. UML类图: 角色: Iterator(迭代器):迭代器定义访问和遍历元素的接口 ConcreteIterator(具体迭代器):具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置 Aggregate (聚合):聚合定义创建相应迭代器对象的接口(可选)