C++ STL: std::vector與std::array的深入對比
2024-08-01科技
std::vector 和 std::array 都是 C++ 標準樣版庫 (STL) 中用於儲存數據的容器,但它們在設計目的、記憶體管理、效能特征等方面存在顯著差異。
動態與靜態大小
std::vector:是一個動態陣列,它的大小可以在執行時改變。當你添加或刪除元素時,std::vector 會自動調整其內部容量,必要時重新分配記憶體。
std::array:是一個固定大小的陣列,必須在編譯時確定其大小。一旦建立,std::array 的大小就不能改變。
記憶體管理
std::vector:使用動態記憶體分配
,這意味著它可以自由地增長和收縮。當 std::vector 的容量不足時,它會重新分配更大的記憶體塊,將原有數據復制過去,並釋放舊記憶體。這個過程可能會導致效能開銷,尤其是在頻繁添加元素時。
上面的程式碼,我們沒有指定vector的大小,而是透過push_back方法添加元素。
std::array:使用靜態記憶體分配
,元素儲存在棧上或作為物件的成員時直接分配在物件內。這種記憶體管理方式提供了更好的效能和確定性,因為沒有動態記憶體分配帶來的開銷和潛在的碎片問題。
上面的程式碼,指定大小為3,如果初始化給4個值會報錯。
效能:
std::vector:對於隨機存取和叠代操作,std::vector 提供了很好的效能,因為元素連續儲存在記憶體中。但是,插入和刪除操作(尤其是中間位置的操作)可能很慢,因為它可能需要移動大量元素。
std::array:同樣支持快速的隨機存取,但由於其大小固定,插入和刪除操作通常不適用,除非整個陣列被重新建立。
使用場景:
std::vector:
適合於大小未知或可能變化的場景
,如讀取檔內容、儲存動態生成的數據等。
std::array:
適合於大小已知且固定不變的場景
,如緩存固定數量的最近事件、實作固定大小的環形緩沖區等。
介面和使用方法:
std::vector介面
array介面
總結:
std::vector 和 std::array 提供了類似但不完全相同的介面。std::vector 更側重於動態陣列的功能,提供了更多的方法來調整容器的大小和容量,而 std::array 專註於固定大小陣列的操作,沒有提供改變大小的方法,但提供了更快的存取速度和更少的執行時開銷。在選擇使用哪個容器時,應根據具體的需求和場景來決定。