【发布时间】:2011-12-16 14:45:01
【问题描述】:
我有一个自定义数据结构,可以通过多种方式访问它。我想尽量保持这个数据结构尽可能地符合 STL 标准。所以我已经有很多类型定义,它们为模板参数提供 STL 名称。现在对我来说一切照旧。
但是我不太确定如何正确地将迭代器添加到我的数据结构中。我面临的主要问题是,数据结构上会有多个迭代策略。最简单的用例是迭代所有元素,这将由符合 STL 的迭代器在数据结构上很好地处理。然而,人们可能还想访问在某种程度上类似于给定键的元素。我还想以一种可以与 STL 交互的方式迭代所有这些相似的元素。
这些是我目前想到的想法:
- 只提供一种类型的迭代器:
这基本上是std::map 所做的。子范围的开始和结束迭代器由std::map::lower_bound() 和std::map::upper_bound() 提供。
但是这很好用,因为begin()、end()、lower_bound() 和upper_bound() 返回的迭代器是兼容的,即operator==() 可以被赋予非常明确的含义。就我而言,这很难做到正确,甚至可能无法给出明确的语义。例如,我可能会遇到it1==it2 但++it1!=++it2 的情况。我不确定 STL 是否允许这样做。
- 提供多种类型的迭代器:
更容易提供干净的operator==() 语义。另一方面很讨厌,因为它增加了类型的数量。
- 提供一种迭代器并使用 stl::algorithms 进行专门访问
我不确定这是否可能。迭代器应该以某种方式(直接或在备忘录中)保持迭代状态。使用这种方法意味着专门化所有 stl::algorithms 并在专门化中直接访问谓词。很可能是不可能的,如果可能的话,这是一个非常糟糕的主意。
现在我主要选择版本 1,即只提供一种类型的迭代器。但是由于我不清楚如何清理语义,所以我还没有决定。
你会怎么处理?
【问题讨论】:
标签: c++ data-structures stl iterator