首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ vector<T>[MAX] vs 二維陣列:效能、執行緒安全與適用場景深度對比

     編輯:程式設計綜合問答

定義差異

特性vector<T> arr[MAX]T arr[MAX][MAX2]
記憶體分佈每個 vector 獨立配置堆疊記憶體,元素在堆上連續塊狀記憶體(堆疊或靜態區)
大小彈性每行可動態增減(push_back/resize)編譯期固定,不可變
執行緒安全非執行緒安全(標準 vector 無鎖)非執行緒安全(需外部同步)
存取速度雙重間接存取(指標→堆),稍慢單一計算位移,最快
記憶體碎片頻繁擴容易產生碎片無碎片

關鍵澄清

原回答稱「vector 是執行緒安全」錯誤。C++ 標準容器(含 vector、map 等)均不保證執行緒安全,僅保證「不同容器實例可並發讀寫、同一實例並發讀安全」。寫入操作需外部加鎖(mutex、shared_mutex)或使用 TBB/Intel oneAPI 等並發容器。

選型建議

  • 固定大小、極致效能、連續記憶體需求(如圖像處理、矩陣運算、嵌入式):T arr[R][C] 或 std::array<std::array<T, C>, R>。
  • 行長度不一、需動態增刪、開發效率優先:vector<vector<T>> 或 vector<T> arr[MAX](外層固定、內層動態)。
  • 高併發讀寫:加 std::shared_mutex 保護 vector,或改用 tbb::concurrent_vector。
  • ACM/ICPC 競程:靜態二維陣列 int a[505][505] 最快、最省記憶體、無配置開銷。

程式碼範例:正確使用 vector 陣列

const int MAX_N = 1000;
vector graph[MAX_N]; // 圖的鄰接表,每點度數不同

void addEdge(int u, int v) {
    graph[u].push_back(v);
    graph[v].push_back(u); // 無向圖
}

// 遍歷
for (int v : graph[u]) { /* ... */ }
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved