【问题标题】:C++: iterator adaptor bounding the iterator within a range of iterators?C ++:迭代器适配器将迭代器限制在迭代器范围内?
【发布时间】:2014-10-14 02:13:47
【问题描述】:

假设我有两个迭代器,它们跨越整个类似 stl 的容器或其连续部分,从而定义了一个范围。这对迭代器将是不可变的。然后我想要第三个可变迭代器,它将指向范围内的任何元素。 这导致我有一个适配器,例如(元代码):

Adaptor<Iterator>:
==================
   + Iterator: begin
   + Iterator: end
   + Iterator: current

如果current==begin 那么std::prev(adaptor) 不会改变current 并且仍然等于begin 如果current==end 那么std::next(adaptor) 不会改变current 并且它仍然等于end

我试图在 STL 和 Boost 中找到现成的解决方案,但到目前为止(可能是我的词汇/行话限制)我找不到任何解决方案。 我应该自己从头开始实现这样的适配器,还是我错过了一些 stl/boost 好东西? 谢谢。

【问题讨论】:

  • 这样的迭代器会违反大多数人对迭代器应该如何表现的假设。例如it+1-1 == it 应该在两边都被定义时保持。
  • @n.m.当容器上的迭代器等于end 时,这是否成立?我希望它是 UB。
  • @MarkRansom ...只要定义了双方,我就说过。这种尝试类似于扩展除法以定义除以零。这样的尝试是没有用的,因为得到的结构不能遵守算术定律。
  • 我想知道这种迭代器的用例是什么......你能给我们举个例子吗?
  • 我很想将迭代器绑定在它运行的范围内。好的 - 这种邪恶的算术对适配器没有多大意义,但是某种可以保存有效数据范围信息的包装器对象就足够了。现在,我正在使用的代码将迭代器本身以及分别对应于开始/结束的两个迭代器传递给某些函数有点尴尬。将这三个结合在一起似乎是一个明显的改进。 Boost 有 iterator_range 但有了它我只完成了一半。

标签: c++ boost stl iterator adaptor


【解决方案1】:

不可能将其实现为迭代器。要让std::prev/next 处理它,它必须是一个“双向迭代器”(在满足“双向迭代器”模型的所有要求的意义上)。其中一项要求是“--r == --s 暗示 r == s”。但是,当然,如果一个在begin 之后,另一个在begin 之后,那么两个这样的迭代器就不会是这样。

【讨论】:

    猜你喜欢
    • 2012-02-03
    • 2017-11-11
    • 1970-01-01
    • 2010-10-03
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2011-03-24
    相关资源
    最近更新 更多