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