[英]Iterator category for circular buffer
我尝试实现以下类型的循环缓冲区。
为简单起见,我假设循环缓冲区只是具有RandomAccessIterator的容器的容器适配器(如std::stack
)。 容器以某种方式调整大小/填充值,然后放入适配器。 之后,底层容器的大小不应改变。
显然c.begin() == c.end()
用于循环缓冲区。 某些算法(例如,基于范围的 for 循环)对于循环缓冲区(而不是for (;;)
可以使用assert(!c.empty()); auto beg = std::begin(c), it = beg; do { f(it); } while (++it != beg);
无法按预期工作assert(!c.empty()); auto beg = std::begin(c), it = beg; do { f(it); } while (++it != beg);
遍历循环缓冲区)。
当我尝试使用std::sort
对循环缓冲区进行排序时,出现了主要问题。 从底层容器继承迭代器类别对于循环缓冲区迭代器是不公平的。 循环缓冲区的迭代器应该几乎是RandomAccessIterator ,但不是严格的全序( <
、 >
、 <=
、 >=
未定义)。 std::sort
实现可以在内部使用operator <
(并且确实如此)。
我无法定义自己的迭代器类别(例如ModularIterator )并将其插入到现有类别之间(例如std::is_base_of_v<std::bidirectional_iterator_tag, my_iterator_tag>
和std::is_base_of_v<my_iterator_tag, std::random_access_iterator_tag>
)。 算法也不是定制点。
我不想将iterator_category
设置为std::bidirectional_iterator_tag
,因为std::equal_range
在对数时间内不起作用。
RandomAccessIterator 的严格总排序是否真的需要在算法中的某个地方或可以避免?
有没有办法让<algorithm>
为循环缓冲区工作?
是否在标准中疏忽了没有适合无序迭代器的迭代器类别,可以为O(1)
任何步骤推进?
显然
c.begin() == c.end()
用于循环缓冲区。 某些算法(例如,基于范围的 for 循环)对于循环缓冲区无法按预期工作
更正:没有基于范围的算法(有意义)适用于这样的范围,因为开始和结束迭代器相同的范围是空的。 这就是空范围的定义。
您需要的是一个迭代器,它不仅知道它在缓冲区中的位置,还知道它处于哪个循环。 开始迭代器可能位于位置索引 0,循环 0,而结束迭代器位于位置索引 0,循环 1。这两个迭代器比较不会相等。 并且当您增加迭代器超过循环边界时,它会将循环计数增加 1。相反,越过循环边界递减。
本质上,循环缓冲区迭代器应该表示一个无限可遍历的值范围。
关于总订单的部分有点像红鲱鱼。 是的,随机访问迭代器需要一个全序,但是您希望开始和结束相等而不是空范围这一事实是您的迭代器的基本设计问题。 一旦你解决了这个问题,完全排序无限范围的能力自然就会消失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.