为自定义列表创建符合STL的迭代器是非常平凡的。
然而,如果参考列表是循环列表,那么它似乎毫无意义,因为所有STL算法都在[first, last)
范围和循环列表first = last
上运行。
是否有标准/ consice方法来克服这一障碍并且STL算法在"自制"圆形清单?
我认为定义符合STL标准的迭代器是实现这一目标的第一步,但也可以采用可在范围内运行的解决方案。
我需要为过多的"自制的"结构。我目前的解决方案是从boost::iterator_facade
派生,然后创建一个自定义range
类(如Rudolph's)并使用围绕基于范围的执行的任何算法。这仍有一些逻辑障碍,并希望看到有效的替代方案和解决方案。
答案 0 :(得分:4)
您将需要自定义迭代器,但解决方案仍然可以基于范围。
一种可能性是begin()
可以返回一个特殊标记的迭代器(标记initial=true
),以便它知道它还没有进行回合。 end()
将返回一个迭代器,该标志设置为false。然后operator++
会将标记设置为false,以便begin()
不等于end()
。您也可以使用不同的标记方案。
答案 1 :(得分:1)
我对STL及其迭代器的理解与你的命题不一致。 C ++标准库中的迭代器(现在已知)具有指针的语义。它们不会换行,end()
不等于begin()
。
作为指针类似物,迭代器指向缓冲区中的位置。您不能指望天真调用者的线性复制操作会在最后回绕。这将适用于算法和其他库。就我所见,它们根本无法按预期工作。
我认为你没有理由不使用STL集合和迭代器,但我认为你不应该期望(或强制)it++
包装。我认为您需要清晰可见的成员函数来实现您需要的其他功能。
例如,您可以使用incr()
函数来递增迭代器,但如果它指向end()
包装到开头。您可以使用copy()
函数来了解如何在包装的缓冲区中提取或插入数据块。
但是我不明白你的其他限制,所以这可能不适合你。我认为这对我有用。
答案 2 :(得分:0)
说在许多算法中(我不是在讨论STL,但一般而言)在内部数据结构中插入了一个或多个null-leaf或null元素以提高性能,我觉得在循环列表中保留一个空/ null元素可以成功。
[first,last)
可行first != last
。first
指向的元素“无效”,first
递增。希望这可能会有所帮助。