STL算法可以与循环列表一起使用吗?

时间:2014-06-02 10:17:00

标签: c++ algorithm stl

为自定义列表创建符合STL的迭代器是非常平凡的。

然而,如果参考列表是循环列表,那么它似乎毫无意义,因为所有STL算法都在[first, last)范围和循环列表first = last上运行。

是否有标准/ consice方法来克服这一障碍并且STL算法在"自制"圆形清单?

我认为定义符合STL标准的迭代器是实现这一目标的第一步,但也可以采用可在范围内运行的解决方案。


我需要为过多的"自制的"结构。我目前的解决方案是从boost::iterator_facade派生,然后创建一个自定义range类(如Rudolph's)并使用围绕基于范围的执行的任何算法。这仍有一些逻辑障碍,并希望看到有效的替代方案和解决方案。

3 个答案:

答案 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元素可以成功。

  • 显然,null元素没有固定在位,它将根据您的数据流移动。
  • 同时,您将保留数据结构中的最后N个样本(大小为N + 1个空元素)连续。
  • 这使得范围[first,last)可行first != last
  • null元素是last指向的元素,它是下一次插入的位置。
  • 每次插入时,一旦N个元素在容器中,first指向的元素“无效”,first递增。

希望这可能会有所帮助。