在 C/C++ 中手動管理動態陣列(new[]/delete[]、realloc)既繁瑣又易出錯:需自行追蹤容量、擴容時複製資料、釋放舊記憶體。C++ 標準庫 std::vector 內建分配器,自動處理記憶體增長、複製與釋放,提供強烈的例外安全保證。本文以 ISBN 讀取為例,對比手動實作與 vector 方案,並示範容量預留優化技巧。
int size = 2;
int* p = new int[size];
int isbn, n = 0;
while (cin >> isbn, isbn != 0) {
if (n == size) { // 容量不足
reallocate(p, size); // 自寫擴容函數:new 更大、copy、delete 舊、重設指標
}
p[n++] = isbn;
}
delete[] p; // 必須記得釋放
reallocate 需處理型別通用性(模板化)、例外安全(new 失敗不洩漏)、複製語意等細節,極易寫錯。
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> vi; // 預設初始容量(實作定義,通常 0~256)
int isbn;
while (cin >> isbn, isbn != 0) {
vi.push_back(isbn); // 自動擴容、複製、銷毀舊空間
}
for (size_t i = 0; i < vi.size(); ++i)
cout << "ISBN: " << vi[i] << endl;
}
push_back 平均攤還常數時間,擴容策略通常為 2 倍增長。operator[] 或 at()(含邊界檢查)。若預估資料筆數(如至少 2000 筆),可在建構或執行期預留:
vector<int> vi(2000); // 建構時指定大小(元素值初始化為 0)
// 或
vector<int> vi;
vi.reserve(2000); // 僅預留容量,不改變 size()
reserve 避免中間多次重新分配與複製,顯著提升大量資料插入效能。注意 resize 會改變 size() 並預設構造元素,reserve 僅影響 capacity()。
shrink_to_fit() 釋放多餘容量。emplace_back 就地構造,避免暫時物件複製/移動。std::allocator)可控制記憶體來源(共享記憶體、記憶體池等)。結論:除非極度受限環境(嵌入式無標準庫),優先使用 std::vector,將精力集中在業務邏輯而非記憶體簿記上。