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;
}
若需增加const_iterator则需要进行重写另一个iterator,也可以通过修改iterator模板声明格式进行修改,满足其iterator格式,最终版本如下:
#include <iostream>
#include <iterator> using namespace std; template <typename T>
struct _A_node {
_A_node *next;
_A_node *prev;
T data;
}; template <class T,class Ref,class Ptr>
class A_Iterator:public iterator<forward_iterator_tag,T>
{
public:
typedef A_Iterator<T,T&,T*> iterator;
typedef A_Iterator<T,const T&,const T*> const_iterator;
private:
typedef A_Iterator<T,Ref,Ptr> 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() {} Ref operator*() const { return _node->data;}
Ptr 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;}
}; template <typename T>
class A {
private:
typedef T Node;
_A_node<T> *pNode;
public:
typedef typename A_Iterator<T,T&,T*>::iterator iterator;
typedef typename A_Iterator<T,const T&,const T*>::const_iterator const_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;} const_iterator const_begin() const {return (_Node *)(pNode->next);}
const_iterator const_end() const {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;
}
*/
//A<int>::const_iterator iter = a.const_begin(); for(A<int>::const_iterator iter = a.const_begin();iter != a.const_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;
}
C++ 迭代器模式实现的更多相关文章
- C#设计模式-迭代器模式
一. 迭代器(Iterator)模式 迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的 ...
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...
- 迭代器模式/iterator模式/对象行为型模式
意图 又名:游标(Cursor): 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 动机 一个聚合对象,提供访问元素的方法,而有不暴露它的内部结构.如list,将对列表的访问 ...
- C#设计模式系列:迭代器模式(Iterator)
迭代器模式把对象的职责分离,职责分离可以最大限度减少彼此之间的耦合程度,从而建立一个松耦合的对象.职责分离的要点是对被分离的职责进行封装,并以抽象的方式建立彼此之间的关系. 1.迭代器模式简介 1.1 ...
- php实现设计模式之 迭代器模式
<?php /*迭代器模式: 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.(行为模式) * 1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的 ...
- Java源代码-迭代器模式
Java无疑是最成功的项目之一了,而在其中学习设计模式和架构设计,无疑是最好不过了. 概念: 提供一种方法访问容器中的各个元素,而又不暴露该对象的内部细节. 使用场景: 和容器经常在一起,我们定义了一 ...
- PHP设计模式 迭代器模式
迭代器模式,在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素.相比于传统的编程模式,迭代器模式可以隐藏遍历元素所需要的操作. AllHacl.php <?php namespace Ba ...
- [Head First设计模式]生活中学设计模式——迭代器模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- js设计模式总结-迭代器模式
迭代器模式 要解决的问题 迭代器要解决的问题很简单很单纯,就是进行遍历操作. 实现原理 基本所有语言都实现了迭代器,javascript也不例外,如Array.prototype.forEach,fo ...
- 迭代器模式(Iterator Pattern)
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式(Iterator)就是分离了聚合对象的遍历行为,抽象出一个迭代器来负责这样既可以 ...
随机推荐
- Masonry+拖动
最近遇到一个问题,用Masonry写的布局: 拖动其中某个view,拖动方法按传统的写成如下形式.如果view中的label更改text值,拖动之后的view就会回到最初被设定的位置. - (void ...
- 关于js touch事件 的引用设置
一开始做前端页面的时候,接触的也是js,但是随后便被简单高效的jquery吸引过去,并一直使用至今. 而js,则被我主观的认为底层技术而抛弃. 直到这几天工作需要,研究移动端页面的触屏滑动事件,搜索j ...
- jquery截图插件的使用
首先感谢http://www.htmleaf.com/Demo/201504211717.html这款插件. 使用之初,对于插件的结构很是糊涂,首先文件的核心是cropper.js,其次才是mian. ...
- keyup与setInterval
<html><body> <input type="text" id="clock" size="35" /& ...
- mysql中Timestamp,time,datetime 区别
一.TIMESTAMP[(M)] 时间戳.范围是’1970-01-01 00:00:00’到2037年. TIMESTAMP列用于INSERT或UPDATE操作时记录日期和时间. 如果你不分配一个值, ...
- angular directive scope
angular directive scope 1.当directive 中不指定scope属性,则该directive 直接使用 app 的scope: 2.当directive 中指定scope属 ...
- Objective-C( protocol协议)
protocol 协议 protocol:用来声明方法 1.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 2.如何遵守协议 1> ...
- sonar-gerrit-plugin-2.2.0 安装
这是一个很新的插件国内使用的用户还是很少的,公司有需要才花了一段时间去研究. 作用:在 code review的时候可以将sonar的检测结果直接集成返回.帮助po对code 进行review. 请严 ...
- Gridview布局界面练习Base Adapter
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZcAAAJVCAIAAACdzC94AAAgAElEQVR4nOy953Ij2bGuLTVJmFrelf
- Redis应用场景(转)
(来源:http://www.cnblogs.com/shanyou/archive/2012/09/04/2670972.html) Redis常用数据类型 Redis最为常用的数据类型主要有以下五 ...