我寫了一個大小為 N 的回圈緩沖區。我還寫了一個自定義迭代器。
我將它們用于這樣的邏輯:
auto iter = circular_buffer.begin();
while(iter != circular_buffer.end())
{
iter;
}
實施是為了end()什么?通常它應該指向最后一個元素 1,但如果緩沖區包含 N 個專案,最后一個元素 1 將是第一個元素,上面的代碼甚至不會回圈一次。我不能做:
do
{
iter;
} while(iter != circular_buffer.end());
因為如果緩沖區為空,它將執行一次。
有沒有辦法解決這個問題?
uj5u.com熱心網友回復:
注意:以下假設緩沖區的回圈性質是向用戶公開以供其使用的屬性,而不是系統的實作細節(如std::list實作的情況)。
給一個圓圈一個適當的“范圍”是一個問題,因為......它是一個圓圈。它在概念上既沒有開始也沒有結束。
做到這一點的一種方法是將“圓”變成螺旋線。每個迭代器都存盤它需要的任何正常資訊以及回圈計數。當迭代器遞增到串列的任意“開始”時,回圈計數就會遞增。如果迭代器遞減到串列開頭之前,則回圈計數遞減。兩個迭代器只有在它們的位置和回圈計數相等時才相等。
大多數由回圈串列創建的迭代器在構造時的回圈計數應該為零。迭代器的end回圈計數應為 1,同時在回圈中的位置與begin迭代器相同。
當然,也有一些實作上的問題。這樣做需要每個迭代器的遞增/遞減操作都知道圓的“起點”在哪里。所以他們都需要一個指向第一個元素或其他東西的指標。但是如果他們有這個,那么如果你修改串列,那么這些迭代器都會變得無效,因為這會改變“第一個元素”是什么。現在,在容器修改時使迭代器失效對于許多容器迭代器型別都是如此,所以這不是太大的問題。但這是你應該注意的事情。
這是嘗試使用具有本質上既沒有開始也沒有結束的概念的范圍的不可避免的缺點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515303.html
標籤:C c 20
