C++ 自定义容器的迭代器

乐哉悠哉 2011-11-15 10:31:09
C++是否提供可用于继承的标准迭代器类呢?
例如我自己定义了一个链表类:

//template <class T> class SNode;

template <class T>
class SList{
public:
class iterator;//这个iterator是否可以通过继承某个迭代器类而得来呢?像ios继承ios_base一样。
};

书上说对于一个比较完善的迭代器,需要提供其associated type,它给出这样的例子:

template<class T , class Ref , class Ptr >
class SList_Iterator
{
typedef SList_Iterator<T,T&,T*> iterator;
typedef SList_Iterator<T,const T&,const T*> const_iterator;
typedef SList_Iterator<T,Ref,Ptr> self;

typedef bidirectional_iterator_tag iterator_category; //这是SList_Iterator的成员变量吗?
typedef T value_type;
typedef Ptr pointer;
typedef Ref reference;
typedef SListNode<T> list_node;

//其它变量及操作定义
};

对于这样一个迭代器,它的value type为T,difference type为Ptr,reference为Ref,对吗?
那它的category又是怎样给定的?就是我如何判断它是bidirectional的?

太不理解了,求先闻道达人予以指点。任何有帮助的讨论也一并感激~
...全文
580 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-11-15
  • 打赏
  • 举报
回复
楼主还真够乱的,我都不明白你在一个Iterator里边写iterator和const_iterator的别名意义何在,你用vector的时候难道不是vector::interator 和vector::const_interator么? 难道你还用过vector::iterator::iterator这种东西么?

给你个简单例子,很简单很简单,我给vecotor重新做个迭代器,支持++操作,其他--,+n,-n就不写了。

owenliang@linux-7lsl:~/csdn/src> cat main.cpp
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;

template <class T>
class VecIterator
{
public:
typedef random_access_iterator_tag iterator_category;
typedef typename vector<T>::value_type value_type;
typedef typename vector<T>::difference_type difference_type;
typedef typename vector<T>::pointer pointer;
typedef typename vector<T>::reference reference;


VecIterator(vector<T> *v,int idx):vec(v),index(idx)
{
}

//VecInterator(const Vec....&) 不写了

VecIterator& operator = (const VecIterator &iter)
{
index=iter.index;
vec=iter.vec;
}

VecIterator& operator ++ ()
{
++index;
return *this;
}

T& operator * ()
{
return (*vec)[index];
}

private:
int index;
vector<T> *vec;
};

//配套萃取器,用于STL algorithm函数库,使用默认的即可

int main()
{
const int arr[]={1,2,3,4,5,6};
vector<int> vec(arr,arr+sizeof(arr)/sizeof(arr[0]));

VecIterator<int> iter(&vec,0);

//没法修改vector源码,所以没法用end(),暂且算了
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);++i,++iter)
{
cout<<*iter<<endl;
}

return 0;
}
owenliang@linux-7lsl:~/csdn/src>
乐哉悠哉 2011-11-15
  • 打赏
  • 举报
回复
那位大侠可以把我六楼所写的迭代器修改成利用了trait技术的iterator?只要声明就可以了。
ryfdizuo 2011-11-15
  • 打赏
  • 举报
回复
迭代器 使用了trait技术,名称萃取。
乐哉悠哉 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 akirya 的回复:]

看 侯捷的,《STL源码剖析》
[/Quote]
就是看源码剖析看糊涂了,本来我还觉得自己能写迭代器的,这是我以前写的一个:

template <class T>
class SList<T>::iterator{
public:
iterator();
bool operator ==(const iterator & rhs ) const;
bool operator !=(const iterator & rhs ) const;

T& operator *();//overload pointer operator
iterator &operator++();
iterator &operator++(int);
iterator &operator--();
iterator &operator--(int);
private:
SNode<T> *pnode;// point to the current node
iterator(SNode<T> *p);//assign p to pnode
};

我觉得它可以实现迭代器的功能,但是看源码剖析上,为了保证什么,迭代器要复杂的多,然后我就不明白要如何写了。
乐哉悠哉 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mougaidong 的回复:]

迭代器通常是要配套使用的,没见过通用的。你给的SList_Iterator中全是些类型定义
[/Quote]
因为迭代器有一些基本的东西不是?就是那些associated type,我看书上说自定义iterator最好继承这些基类,所以才疑惑它是否提供的有基类呢?
就因为那是些类型定义,所以我才疑惑如何得知迭代器的类型呢?
pengzhixi 2011-11-15
  • 打赏
  • 举报
回复
STL源码剖析 第2章,第3章。 第2章讨论迭代器,第3章讨论trait。
  • 打赏
  • 举报
回复
看 侯捷的,《STL源码剖析》
ryfdizuo 2011-11-15
  • 打赏
  • 举报
回复
bidirectional_iterator_tag 是单独的一个类,
http://www.sgi.com/tech/stl/bidirectional_iterator_tag.html
迭代器 一般没必要搞继承,迭代器跟一般跟容器是一起的。
turing-complete 2011-11-15
  • 打赏
  • 举报
回复
迭代器通常是要配套使用的,没见过通用的。你给的SList_Iterator中全是些类型定义
见莫过遇1 2011-11-15
  • 打赏
  • 举报
回复
看看,我也刚学这知识点,11楼讲的不错!
qq120848369 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 guankle 的回复:]

引用 9 楼 qq120848369 的回复:

楼主还真够乱的,我都不明白你在一个Iterator里边写iterator和const_iterator的别名意义何在,你用vector的时候难道不是vector::interator 和vector::const_interator么? 难道你还用过vector::iterator::iterator这种东西么?

给你个简单例子,很简单……
[/Quote]

这些代码是给iterator_traits用的。
qingcairousi 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 guankle 的回复:]

谢谢指点~我还是不明白:
typedef random_access_iterator_tag iterator_category;
typedef typename vector<T>::value_type value_type;
typedef typename vector<T>::difference_type difference_type;
typedef typename vector<T>::pointer pointer;
typedef typename vector<T>::reference reference;
这部分代码是做什么用的?在哪儿用?怎么用?
[/Quote]
这部分代码是给使用这个iterator的其他代码用的。
template的精髓是“看起来像什么就是什么”。
具体到你这个例子,其他代码认定了,一个可以被当成“Iterator”使用的类,应该提供这些typedef,所以你在实现这个能当成“Iterator”使用的类的时候,就要提供这些typedef。不然其他代码就不认为你这个类是个“Iterator”,即使你的类的名字叫Iterator。
乐哉悠哉 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qq120848369 的回复:]

楼主还真够乱的,我都不明白你在一个Iterator里边写iterator和const_iterator的别名意义何在,你用vector的时候难道不是vector::interator 和vector::const_interator么? 难道你还用过vector::iterator::iterator这种东西么?

给你个简单例子,很简单很简单,我给vecotor重新做个迭代器,支持++操作……
[/Quote]
谢谢指点~我还是不明白:
typedef random_access_iterator_tag iterator_category;
typedef typename vector<T>::value_type value_type;
typedef typename vector<T>::difference_type difference_type;
typedef typename vector<T>::pointer pointer;
typedef typename vector<T>::reference reference;
这部分代码是做什么用的?在哪儿用?怎么用?

64,677

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧