读书人

关于迭代器类型一直困扰着小弟我

发布时间: 2012-02-26 20:19:45 作者: rapoo

关于迭代器类型,一直困扰着我。

迭代器类型分为输入、读出、双向、随机等。但是stl代码里没有任何代码表面输入迭代器是单向迭代器,而双向迭代器表现得“双向”,他们在函数里仅是重载,只是区分而已。究竟什么使他们变得单向、双向、随机?



[解决办法]
去看 <iterator> 的代码就知道了
主要是Traits的概念问题
[解决办法]
各个容器的iterator都是各自定义的,但会符合一种特定的trait

[解决办法]
不明白你想问什么?跌代器的“双向”表现在它对++和--运算符的重载上;而“单向”只重载了++;“逆向”跌代器将原本应该--的操作重载成++。
[解决办法]
> > 但是stl代码里没有任何代码表面输入迭代器是单向迭代器

怎么没有嘛. iterator_category就表示了迭代器的类型
[解决办法]
不用着急下结论,
trait本身是个很不错的理论或者说技术
建议你去看看理论化的STL描述,比如可以参考 《泛型编程与STL》

iterator_category确实通常都只实现为空类,本身足够简单,
但如果放到具体的运用时,就可以出神入化了

比如在 <algorithm> 中的好些算法,以及很多容器的实现,就依赖于
trait作很多效率上的优化,并达到一种强类型的安全性

在C++0x中,标准委员会还准备在语言的层面直接支持trait,这足可
反映这项技术的重要性

[解决办法]
> > 我发觉它只是用几个空类来以示区别。

类空不空没关系..类是用来表示概念的..这种类型的概念空类就够了
[解决办法]
迭代器的出现就是为了我们更方便的访问容器的成员设立的。
为我让我们访问容器的内容有一个统一的概念,即要访问容器的内容就用迭代器就一概念。
那为什么迭代器不作为一个外部类而是作为了每一个容器的内部类呢。
1,不同容器的内部实现是不同的,那么访问规则又不一样,如果作为外部类的话,那么每一个容器就要一个外部迭代器,如一个vector就会有一个vector_iterator,list就有一个list_iterator这就不会形成一个统一个概念。
2.容器的实现者才知道如何更高效的防问容器的内容,而且作为内部类,迭代器就可以有统一的名称,都是iterator,这就有一个统一了,外表的统一。
至于各种迭代器,就根据容器的实现而来的。
vector的迭代器就可以随机地访问容器的内容。
双向链表的迭代器就可以双向的访问容器的内容。
单向链表的失代器就只能单向的访问容器的内容。
[解决办法]
《泛型编程与STL》是你最需要的书。Enjoy it!
[解决办法]
看《STL源码剖析》
[解决办法]
迭代器的代码根据容器的不同而不同。如果你的类实现了普通指针所能进行的一些运算符,那么你就实现了一个你自己的迭代器。list的迭代器实现了==、!=、&、-> 、++、--这几个运算符,所以它的迭代器属于双向迭代器(比普通指针差了+、-、+=、-=操作,即不能实现随机寻址),只能一步一步往前或往后走,部分代码如下:

// 运算符
bool operator==(const iterator& x) const { return node == x.node; }
bool operator!=(const iterator& x) const { return node != x.node; }
T& operator*() const { return node-> data; }
T* operator-> () const { return &node-> data; }
iterator& operator++() { node = node-> next; return *this; }
iterator operator++(int) { iterator tmp = *this; ++*this; return tmp; }
iterator& operator--() { node = node-> prev; return *this; }
iterator operator--(int) { iterator tmp = *this; --*this; return tmp; }

而vector的迭代器代码就很简单了:

template <class T, class Alloc = alloc>
class vector
{
public:
typedef T* iterator;
......
};

就是容器元素的普通指针。因为vector的元素在内存中连续存放,就好像数组一样,所以可以直接使用指针。
[解决办法]
《泛型编程与STL》第一章就有。

读书人网 >C++

热点推荐