[英]Difference between a vector and a dynamically allocated array
選擇使用std::vector
與動態分配數組的內部差異是什么? 我的意思是,不僅僅是這個匹配標題問題中的性能差異。
我的意思是,我嘗試設計一個圖書館。 所以我想在StackArray
上提供一個包裝器,它只是一個C-Style
數組,其中包含一些成員方法,其中包含作為成員T array[N]
。 沒有間接尋址並刪除了new
運算符以強制實現者將數組類型始終存儲在堆棧中。
現在,我想提供動態變體。 所以,稍加努力,我就可以聲明如下內容:
template <typename T>
class DynArray
{
T* array,
size_t size,
size_t capacity
};
但是......這似乎與C++ vector
的基本方法非常相似。
此外,可以通過將元素復制到新的內存位置來調整存儲在堆中的數組的大小(這是真的嗎?)。 例如,當push_back()
操作超出其分配的容量時,這與生成向量幾乎相同,對嗎?
如果存在一些顯着差異,我是否應該同時提供這兩種 API? 或者我把庫的設計過於復雜了,我可以只擁有我的StackArray
而Vector
應該只是動態分配數組的安全抽象嗎?
首先,在使用標准提供的現代工具和遺留工具之間存在一種心態(通常是有爭議的)。
您通常必須研究和詢問C++
現代功能,而不是將它們與舊功能進行比較。 但是,出於學習的目的,我不得不承認深入研究這個主題是非常有趣的。
考慮到這一點, std::vector
是一個集合,它只關心存儲在其中的字節。 有一個非常重要的約束,即數據must lie in contiguous memory
中,而std::vector
在其內部實現中確保了這一點。 此外,還有一個眾所周知的、經過良好測試的RAII
模式實現,正確使用new[]
和delete[]
運算符。 您可以以一種方便且高效的方式reserve
存儲和emplace_abck()
元素,這使得該集合真正獨一無二......確實有很多原因可以說明為什么std::vector
與動態分配的數組確實不同。
不僅要擔心手動 memory 管理,這在現代 C++ 中幾乎是一件不可取的事情(嵌入式系統或操作系統本身是討論最后一句話的好點)。 它即將擁有一個工具, std::vector<T>
讓您作為開發人員的生活更輕松,特別是在像C++
這樣容易出錯的語言中。
注意:我說error-prone
是因為它是一門非常難掌握的語言,需要大量的學習和訓練。 您幾乎可以制作世界上的所有東西,並且擁有大量對初學者不友好的功能。 此外,逆向兼容性約束使它變得更大,實際上有成千上萬個你必須關心的事情。 所以,能力越大,責任越大。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.