std::vector 是 C++ 標準程式庫中最常用的序列容器,提供動態陣列功能,支援快速隨機存取、尾端高效增刪,並自動管理記憶體。本文系統整理其建構函式、運算子、核心成員函數與迭代器用法,並附上可編譯範例,助你快速掌握實戰技巧。
vector 提供多種建構方式:
vector():建立空容器vector(size_type n, const T& val):建立含 n 個 val 的容器vector(const vector& other):拷貝建構vector(InputIt first, InputIt last):以迭代器區間 [first, last) 初始化std::vector<int> v1(5, 42); // 5 個 42
支援 == != < > <= >=,比較規則為字典序:先比對元素,再比大小。
v[pos] 不檢查邊界,效能高;v.at(pos) 會拋出 std::out_of_range 異常,較安全。
std::vector<int> v(5, 1);
for (int i = 0; i < 10; ++i) {
// v[i] 若越界行為未定義
std::cout << v.at(i) << '\n'; // 安全:越界拋出異常
}
分別回傳首尾元素的引用,容器不可為空。
std::vector<int> v = {0,1,2,3,4};
std::cout << v.front() << ' ' << v.back(); // 0 4
begin() / end():正向迭代器,end() 指向尾後位置rbegin() / rend():反向迭代器for (auto it = v.begin(); it != v.end(); ++it)
std::cout << *it << ' ';
| 函數 | 說明 |
|---|---|
size() | 目前元素數量 |
capacity() | 不重新配置記憶體可容納的元素數 |
reserve(n) | 預留至少 n 個元素空間,避免頻繁擴容 |
resize(n, val) | 調整大小為 n,新元素填 val |
empty() | 判斷是否為空 |
max_size() | 理論最大容量 |
v.assign(3, 10); // 3 個 10
v.assign(arr, arr + 5); // 從陣列複製
尾端插入/刪除,攤還 O(1)。
v.insert(pos, val); // 單一元素
v.insert(pos, 3, val); // 3 個 val
v.insert(pos, first, last); // 區間插入
v.erase(pos); // 刪除單一元素
v.erase(first, last); // 刪除區間,回傳下一有效迭代器
clear() 清空容器;swap(other) 常數時間交換內容。
get_allocator() 回傳關聯的配置器,進階用途較少見。
#include <vector>
#include <string>
#include <iostream>
struct Student {
std::string name;
int age;
int c_score;
int en_score;
int total() const { return c_score + en_score; }
};
int main() {
std::vector<Student> stu;
int n; std::cin >> n;
for (int i = 0; i < n; ++i) {
Student s;
std::cout << "Name: "; std::cin >> s.name;
std::cout << "Age: "; std::cin >> s.age;
std::cout << "C: "; std::cin >> s.c_score;
std::cout << "English: "; std::cin >> s.en_score;
stu.push_back(s);
}
std::cout << "--------------------------\n\n";
for (const auto& s : stu) {
std::cout << "Name: " << s.name << '\n'
<< "Age: " << s.age << '\n'
<< "C: " << s.c_score << '\n'
<< "English: " << s.en_score << '\n'
<< "Total: " << s.total() << "\n\n";
}
return 0;
}
reserve() 減少重新配置push_back / emplace_back,避免中間插刪std::list 或 std::deque