首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

STL 學習筆記 (二):vector 容器詳解與實戰技巧

     編輯:C++ 入門

vector 核心特性

  • **動態數組**:連續內存,隨機訪問 O(1),尾部增刪均攤 O(1),頭部/中間增刪 O(n)。
  • **自動擴容**:`push_back` 觸發擴容時,通常按 2 倍分配新內存,拷貝/移動元素,釋放舊內存。
  • **迭代器失效**:擴容、插入、刪除、擦除操作會使所有迭代器、指針、引用失效。

構造函數全景 (C++11 標準)

形式說明
`vector()`默認構造,空容器
`vector(n)`n 個值初始化元素 (0/null)
`vector(n, val)`n 個 `val` 副本
`vector(begin, end)`範圍構造
`vector(other)`拷貝構造
`vector(move(other))`移動構造 (C++11)
`vector(ilist)`初始化列表構造 (C++11)

常用成員函數實戰


vector v = {1,2,3,4,5};

// 訪問
v[2]; v.at(2); v.front(); v.back(); v.data();

// 修改器
v.push_back(6); v.pop_back();
v.insert(v.begin()+2, 99);           // 插入單個
v.insert(v.end(), {7,8,9});          // 插入列表
v.erase(v.begin()+1);                // 刪除單個
v.erase(v.begin(), v.begin()+2);     // 刪除區間
v.clear();                           // 清空

// 容量
v.size(); v.capacity(); v.empty(); v.reserve(100); v.shrink_to_fit(); // C++11

// 交換
v.swap(other); // O(1) 交換內部指針,不移動元素

// 反向迭代器
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) cout << *rit;

性能優化建議

  1. **預留空間**:`v.reserve(n)` 避免多次擴容拷貝。
  2. **優先 `emplace_back`**:原地構造避免臨時對象拷貝/移動。
  3. **批量操作**:用 `insert(pos, range)` 替換循環 `push_back`。
  4. **避免中間插刪**:若頻繁中間操作,考慮 `list` 或 `deque`。
  5. **`shrink_to_fit` 謹慎用**:非強制,可能不釋放內存。

迭代器失效規則速查

  • 擴容、插入、刪除、擦除、交換 → **所有**迭代器/指針/引用失效。
  • 單純 `push_back` 未觸發擴容 → 尾後迭代器失效,其餘有效。
  • C++11 移動語義下,移動構造/賦值後源容器處於有效但未指定狀態。

總結

`vector` 是 C++ 最常用容器。掌握其連續內存特性、擴容機制、迭代器失效規則、移動語義配合 `emplace_back`/`reserve`,能寫出高性能、安全的代碼。理解「為什麼失效」比死記規則更重要。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved