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

C++ STL vector 完全指南:從基礎操作到多維動態數組實戰

     編輯:關於C語言

一、vector 核心特性

  • 動態陣列,自動管理記憶體,支援隨機存取(O(1))。
  • 尾部插入/刪除攤還 O(1),中間插入/刪除 O(n)。
  • 迭代器支援 STL 算法(sort、find、accumulate 等)。

二、基本操作速查表

操作代碼範例說明
構造vector<int> v; / vector<int> v(10, 0);默認空 / 10 個 0
尾部插入v.push_back(42);攤還常數時間
尾部刪除v.pop_back();不返回值
隨機存取v[i] / v.at(i)at 會邊界檢查
大小/容量v.size() / v.capacity()元素數 / 已分配空間
清空v.clear();釋放元素,保留容量
預留空間v.reserve(1000);避免頻繁擴容
迭代器遍歷for (auto it=v.begin(); it!=v.end(); ++it)支援範圍 for:for (auto& x : v)

三、完整代碼範例:一維 vector 存取與遍歷

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v;
    for (int i = 0; i < 10; ++i) v.push_back(i * 2);

    // 方式 1:下標
    for (size_t i = 0; i < v.size(); ++i)
        cout << v[i] << ' ';
    cout << '\n';

    // 方式 2:迭代器
    for (auto it = v.begin(); it != v.end(); ++it)
        cout << *it << ' ';
    cout << '\n';

    // 方式 3:範圍 for (C++11)
    for (auto& val : v) val *= 2; // 修改元素
    for (auto val : v) cout << val << ' ';
    cout << '\n';

    return 0;
}

四、二維 vector(動態矩陣)三種定義方式

1. 固定行數,每行長度可變

// 10 行,每行初始為空 vector
vector< vector<int> > matrix(10, vector<int>());

for (int r = 0; r < 10; ++r) {
    for (int c = 0; c < 9; ++c)
        matrix[r].push_back(c * r); // 每行長度可不同
}

2. 固定行列(矩形矩陣)

int rows = 10, cols = 9;
vector< vector<int> > matrix(rows, vector<int>(cols, 0)); // 全 0 初始化

for (int r = 0; r < rows; ++r)
    for (int c = 0; c < cols; ++c)
        matrix[r][c] = r * c;

3. 完全動態:行數與列數均在運行時決定

vector< vector<int> > matrix;
vector<int> row;

for (int r = 0; r < 10; ++r) {
    matrix.push_back(row); // 先推入空行
    for (int c = 0; c < 9; ++c)
        matrix[r].push_back(c); // 再填充該行
}

五、二維 vector 遍歷與輸出

for (size_t r = 0; r < matrix.size(); ++r) {
    for (size_t c = 0; c < matrix[r].size(); ++c)
        cout << matrix[r][c] << ' ';
    cout << '\n';
}

// 或範圍 for (C++11)
for (auto& row : matrix) {
    for (auto val : row) cout << val << ' ';
    cout << '\n';
}

六、進階技巧與避坑指南

  1. 記憶體連續性:vector 保證單行連續,但不同行之間不連續。需傳給 C API 時,逐行 &row[0] 處理。
  2. 避免頻繁 push_back 導致重新分配:預估大小用 reserve 或構造函數指定初始大小。
  3. 迭代器失效:插入/刪除/擴容後,所有迭代器、指針、引用失效,需重新獲取。
  4. 交換技巧釋放記憶體:vector<int>().swap(v); 可真正歸還記憶體給 OS(C++11 後 shrink_to_fit() 同效)。
  5. 二維 vector 傳參:優先用 const vector<vector<T>>& 避免拷貝。

七、性能對比建議

  • 小型、固定大小矩陣:考慮 std::array 或原生陣列。
  • 大型、頻繁增減行:vector<vector<T>> 靈活但記憶體碎片化。
  • 高性能數值計算:推薦 Eigen、Blaze 或單維 vector 手動計算索引(idx = r * cols + c),緩存友好。

熟練掌握 vector 及其多維變體,是 C++ 開發處理動態集合、矩陣運算、圖算法等場景的基石。善用 C++11/14/17 新特性(範圍 for、結構化綁定、emplace_back)可大幅提升代碼可讀性與性能。

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