STL算法可以与循环列表一起使用吗?
Can STL algorithms be used with circular lists?
为您的自定义列表创建一个兼容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。
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 与引用一起使用的列表,在用作成员时更改行为
- 与lambda一起使用虚拟继承在初始化列表中捕获此问题的GCC错误
- 将[]运算符与链接列表一起使用
- 当将 getline 与 int 一起使用时,如何修复"没有重载函数 'getline' 的实例与参数列表匹配"
- 如何将重新绑定与自定义分配器和自定义列表一起使用
- 如何将 2 个链表合并或合并在一起以创建新列表
- 常量变量初始化仅与成员初始化列表一起工作
- 将initalizer列表与从空基类继承的结构一起使用
- 具有与专用列表一起使用的参数列表的超类方法<superclass>
- 为什么 auto 关键字不能与指向函数的指针的初始化列表一起使用?
- 如何将列表语法与默认精神一起使用
- 使初始化列表与 C++ 中的继承一起使用
- 将 clang 3.1 与初始值设定项列表一起使用
- 将BOOST_FOREACH与恒定的侵入性列表一起使用
- 如何将 auto 与初始值设定项列表一起使用push_back
- 如何使用与成员初始化器列表一起使用的static_assert
- 为什么我们不能在函数参数列表中将相同的dataype参数组合在一起?
- 将 GetLine 与 ifstream 一起使用 - 没有与参数列表匹配的"getline"实例
- boost DFS不能与set垂直列表一起工作