游标vs迭代器模式
Cursor vs Iterator pattern
在许多文本中,我看到术语游标与术语迭代器交替使用。然而,把它们当作同样的东西来对待似乎是不对的。
对我来说,迭代器允许在不知道容器本身的情况下迭代容器。另一方面,游标也允许容器的迭代,但具有特定于容器类型的实现细节,因此它保留了对容器的引用。此外,游标的接口反映了容器的接口,有点像facade模式。
这里有一个我认为是游标的例子:
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();
};
所以基本上我区分迭代器和游标是基于它们对迭代容器的依赖或了解。这是一个恰当的区分吗?如果没有,您会考虑我在上面的代码示例中概述的设计模式吗?
请注意,我上面的代码示例应该被视为伪代码,因为我没有编译它,而且它也缺乏所需的构造函数。
您描述的游标模式是两个模式的组合:Proxy和Iterator。标准库不同的原因是为了避免不必要地耦合这两种行为。
Wikipedia将Cursor Pattern重定向到Iterator Pattern页面。考虑到这一点,我觉得你是在小题大做。如果我们认为维基百科是一个权威的参考,这两个术语可以互换使用。
在使用设计模式这个术语之前的很长一段时间里,由于允许更大的扩展来修改底层数据结构,所以光标比迭代器更强大。如insertBefore(), insertAfter()或insertAt()等。一些实现允许多个指针在同一个容器上操作,并且它们相互通知操作(它们在我们的时代被称为稳定迭代器,或稳定数据结构)
迭代器(至少c++标准中定义的方式)不允许访问底层容器的属性,但可以通过不同的迭代器类别(可以通过iterator_tags
访问)访问这些细节。
我也认为你的例子有缺陷。当我可以访问包含的值并查询其属性时,为什么数据集合会镜像数据的接口(例如IsHardCover()
) ?
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- 多方面迭代器的良好设计模式?
- 如何使用迭代器设计模式为 C++ 中的包装容器类提供多个迭代器?
- 迭代器模式示例在 C++ 中给出错误
- 寻找Boost转换迭代器的复合特征模式
- 可能返回值也可能不返回值的函数的迭代器缩减器模式
- 哪些因素使迭代器在调试模式下如此缓慢 (VC++ 2012)
- 未能在复合/迭代器设计模式中看到真正的价值
- 在Release模式(c++)下对迭代器进行绑定检查
- 如何在使用装饰器和迭代器设计模式时声明友类
- 并行libstdc++模式,不使用迭代器的并行for_each算法
- 游标vs迭代器模式
- Visual C++,使用相同迭代器名称的多个for循环,在调试模式下在范围外可见