【发布时间】: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