首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游标与迭代器模式

游标与迭代器模式
EN

Stack Overflow用户
提问于 2011-07-13 23:18:18
回答 4查看 5.4K关注 0票数 4

在许多文本中,我已经看到术语游标与术语迭代器互换使用。然而,将它们视为同一件事似乎并不正确。

对我来说,迭代器允许在不了解容器本身的情况下对容器进行迭代。另一方面,游标也允许容器的迭代,但具有特定于容器类型的实现细节,因此它确实保留了对容器的引用。此外,游标的界面反映了容器的界面,有点像外观模式。

下面是一个我认为是游标的例子:

代码语言:javascript
复制
class Book {};

class Library
{
    std::vector<Book> books;

    bool IsBookHardCover( int bookIndex );
    bool IsBookSoftCover( int bookIndex );

    BookCursor GetFirstBook();
};

class BookCursor
{
    std::vector<Book>& books;
    int currentBook;

    bool IsHardCover();
    bool IsSoftCover();

    void Next();
};

因此,基本上我根据迭代器和游标之间的依赖关系或它们所迭代的容器的知识来区分它们。这是一个适当的区别吗?如果没有,您会考虑我在上面的代码示例中概述的设计模式吗?

请注意,我上面的代码示例应该被视为伪代码,因为我没有编译它,而且它也缺少所需的构造函数。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-14 00:04:01

您描述的游标模式是两种模式的组合: Proxy和Iterator。标准库之所以不同,是为了避免不必要地耦合这两种行为。

票数 6
EN

Stack Overflow用户

发布于 2011-07-13 23:26:27

维基百科将光标模式重定向到Iterator Pattern的页面。考虑到这一点,我想说你是在吹毛求疵。如果我们可以认为维基百科是一个明确的参考,这两个术语可以互换使用。

票数 1
EN

Stack Overflow用户

发布于 2011-07-13 23:37:57

迭代器(至少在C++标准中定义的方式)不允许您访问底层容器的属性,但是您可以通过不同的迭代器类别(可以通过iterator_tags访问)来访问这些细节。

我也认为你的例子是有缺陷的。当我可以访问包含的值并查询自身的属性时,为什么数据集合要镜像数据的接口(例如IsHardCover())?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6681255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档