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

Can STL algorithms be used with circular lists?

本文关键字:一起 列表 循环 算法 STL      更新时间:2023-10-16

为您的自定义列表创建一个兼容STL的迭代器是相当平凡的。

然而,如果引用的列表是一个循环列表,这似乎是毫无意义的,因为所有的STL算法都在[first, last)范围和循环列表first = last中操作。

是否有一种标准/合理的方法来克服这个障碍并使STL算法在"自制"循环列表上运行?

我认为定义符合STL的迭代器是实现这一目标的第一步,但也可能有一个对范围进行操作的解决方案。


我需要为大量的"自制"结构实现这一点。我目前的解决方案是从boost::iterator_facade派生,然后创建自定义range类(如Rudolph的),并使用围绕基于范围的执行的任何算法。尽管如此,这还是有一些逻辑上的障碍,我们希望看到可行的替代方案和解决方案。

您将需要自定义迭代器,但解决方案仍然可以基于范围。一种可能性是begin()可以返回一个特殊标记的迭代器(标志initial=true),这样它就知道它还没有完成循环。end()将返回一个将该标志设置为false的迭代器。然后operator++将该标志设置为false,这样begin()将不等于end()。您也可以使用不同的标记方案。

我对STL及其迭代器的理解与您的主张不一致。c++标准库中的迭代器(如现在所知)具有指针的语义。它们不换行,end()不等于begin()

与指针类似,迭代器指向缓冲区中的一个位置。您不能期望一个没有经验的调用者在最后进行线性复制操作。这将适用于算法和其他库。在我看来,它们根本不会像预期的那样工作。

我看不出为什么你不应该使用STL集合和迭代器,但我不认为你应该期望(或强制)it++包装。我认为你需要清晰可见的成员函数来实现你所需要的额外功能。

例如,可以有一个incr()函数对迭代器进行自增,但如果它指向end(),则返回到开始。你可以有一个copy()函数,它知道如何在缓冲区中提取或插入数据块。

但是我不明白你的其他限制,所以这可能不适合你。

说,在许多算法(我不是在谈论STL,但在一般情况下)一个空叶(s)或空元素(s)插入到内部数据结构,以提高性能,我觉得保持一个空/null元素在你的循环列表可以使技巧。

  • null元素的位置显然不是固定的,它将根据您的数据流移动。
  • 同时,您将保持数据结构中最后N个样本(大小为N + 1的空元素)连续。
  • 这使得first != last的范围[first,last)成为可能。
  • null元素是最后一个指向的元素,它是下一次插入的位置。
  • 在每次插入时,一旦容器中有N个元素,first所指向的元素被"取消",first所指向的元素被加1。