- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于迭代器详细说明
关于迭代器的详细说明
迭代器是什么?
我们先从一个例子说起:
int a[10], *p;
for (p = a[0]; p != a[10], ++p) std::cout *p std::endl;
在上述for语句构成的迭代操作中,指针p首先指向了数组a的首元素,然后通过++运算和!=运算来完成迭代。这里,指针p“知道”它指向了一片连续的存储区,所以++运算就有意义了。
这里,指针p可以视为一个最为简单的迭代器。程序员可以通过该“迭代器”方便灵活地访问容器(即a数组)。
当然,这里所说的容器(a数组)过于简单。对于更复杂的情况,迭代器被定义为一个某种容器类的伴随类,一般定义在容器类的内部,具有public属性,是其包围容器类的友元。它可以在容器类的外部使用。
在多数情况下,迭代器内部有一个内部普通指针,它可以指向容器类的内部存储机构。而迭代器类本身模拟了一个指针的行为,为此它重载了用于指针操作的三个关键运算符:
!=
++
*
为了使用迭代器,其包围容器类提供了两个public成员:
begin(),它返回一个迭代器对象,并使该对象的内部指针指向了容器对象的存储结构的首元素;
end(),它返回一个“空”迭代器对象,该对象的内部指针指往往是个nullptr。而在一般情况下,容器对象的内部存储结构都用nullptr标识存储的结尾,所以可以说,空迭代器对象的内部指针指向了存储结构中最后一个元素的“后”一个元素。这个迭代器对象往往称为“哨兵”。注意:空迭代器仅仅参与了比较运算(及两个迭代器内部指针的比较运算),而没有引用该迭代器对象“指向的对象”,因此在使用上是安全的。
为什么需要迭代器
对于内部结构相对复杂的容器,我们不能使用指针直接指向其内部存储结构去访问它,因为这样直接破坏了数据封装的原则。
因此,一个折中的方法是为容器类设计一个遍历成员traverse(),它带有一个谓词函数作为参数去访问每一个容器元素。
然而,这虽然实现了数据封装,却是遍历这类的迭代操作变得很不灵活,因为程序员可能不得不编写多种谓词函数去处理不同的情况。
迭代器的引入可以彻底解决上述种种不便。迭代器模拟了一个指针的行为,配合容器提供的begin()和end(),程序员可以像使用指针那样去使用迭代器,
而不需要直到容器的内部结构,也不需要编写太多的谓词函数,从而起到两全其美的效果。
如何定义迭代器
例如,对于教材上使用链式存储的容器类List,其迭代器的定义如下:
class list
{
public:
typedef int _elemType; //元素的类型
private:
struct _NODE_ //链表的节点。这个用于存储的类型定义在private段中,因为类的外部无法获悉其存储结构的详情
{
_elemType data;
_NODE_* next;
} _head;
typedef _NODE_* _NODEPTR_;
public:
typedef _NODEPTR_ _range; //_range是_NODE_*的别名
//省略了其它容器成员
friend class iterator; //因为该迭代器类要访问List类的私有类型_NODE和其内部数据
class iterator
{
private:
_range _p; //迭代器的内部指针
public:
iterator(range = nullptr) : _p(range) {}
iterator operator++()
{
_p = _p-next; //内部指针指向下一个节点。根据容器类存储结构的不同,该语句也不尽相同
return *this;
}
bool operator!=(const iterator i)
{
return _p != i._p; //两个指针的比较,判断两个指针是否指向了同一个节点
}
_elemType operator*()
{
return _p-data;
}
iterator operator=(const iterator i)
{
_p = i._p;
return *this;
}
};
iterat
文档评论(0)