簡體   English   中英

圓形數組的矢量實現

[英]Vector implementation with circular array

我很困惑。 我在讀關於使用數組實現向量的文章,而在進行簡單的動態數組實現時,一切都很好。

fashion and that that will make the addition and removal of elements (for first and last) run in constant time. 提到可以通過以方式使用數組來實現向量,這將使元素的添加和刪除(對於第一個和最后一個)在恆定時間內運行。 這不是鏈接列表應該做什么嗎?

我想知道它是如何工作的,但是我找不到真正的實現或正確的解釋。 歡迎提供有關什么是總體思想以及如何實現的任何信息。

編輯:我的猜測是新數據應該寫在“最舊的”數據上,並且數組具有固定的大小,並且您必須具有存儲最后使用位置的變量。

您正在談論循環緩沖區

不幸的是,您不能使用它實現vector,因為您將無法在中間插入或從中間刪除等。

由於C ++ 03 vector保證了連續存儲,也就是說,對於每個0 <= n < vec.size()

&vec[n] == &vec[0] + n

這意味着您不能使用循環緩沖區來實現vector 從緩沖區的末尾到起點“回繞”時,您違反了此限制。

如果您認為operator[]可以返回滿足此要求的帶有重載的operator&某些代理-不,不能,它需要返回T&

除了此要求外,我認為標准中沒有任何東西可以阻止使用循環緩沖區實現vector 在緩沖區已滿的情況下,您將執行vector實際所做的相同操作-重新分配給更大的緩沖區。 行為上的唯一區別將是在開始時擦除或插入時會發生什么。 使用圓形緩沖區時,所有其他元素將在保持足夠空間的情況下保持靜止,而通常它們都會移動。 但是該標准並未明確要求它們移動,並且由於在開始插入或擦除操作時對所有元素的迭代器和引用無效,因此程序無法合法地依賴它們以任何特定方式移動。

的確, std::list可以在開始和結束時以固定時間插入和刪除。 所以std::deque也可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM