當前位置: 華文世界 > 科技

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 專註於固定大小陣列的操作,沒有提供改變大小的方法,但提供了更快的存取速度和更少的執行時開銷。在選擇使用哪個容器時,應根據具體的需求和場景來決定。