[英]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.