【发布时间】:2014-06-02 10:17:00
【问题描述】:
为您的自定义列表创建一个符合 STL 的迭代器非常简单。
然而,如果引用列表是一个循环列表,这似乎毫无意义,因为所有 STL 算法都在[first, last) 范围和循环列表first = last 中运行。
是否有标准/一致的方法来克服这个障碍,并让 STL 算法在“自制”循环列表上运行?
我认为定义符合 STL 的迭代器是实现这一目标的第一步,但也可能有一个可以在范围内操作的解决方案。
我需要为大量的“自制”结构实现这一点。我目前的解决方案是从boost::iterator_facade 派生,然后创建一个自定义range 类(如Rudolph's)并使用围绕基于范围的执行的任何算法。这仍然存在一些逻辑障碍,并且希望看到可行的替代方案和/或解决方案。
【问题讨论】:
-
这仅在您在循环列表中定义
end()时有效。如果你能够做到这一点,并且从begin()迭代可以让你到达那里,我认为没有任何问题。 -
你可以有两种不同类型的迭代器,一种实现环绕,另一种实现通常的语义。
-
您会发现这样做的一个主要障碍是循环列表对“第一个”和“最后一个”是什么具有上下文相关的想法。从列表中的两个不同位置作为“第一个”开始将使用两个不同的“最后一个”概念。这听起来微不足道,但实际上它很快就会变得一团糟。
-
看看
boost::circular_buffer(boost.org/doc/libs/1_55_0/doc/html/circular_buffer.html)。