9-4 常用成員函數
其他常用成員函數
1. front() 與 back()
vector<int> v = {10, 20, 30, 40, 50};
cout << v.front(); // 10:第一個元素
cout << v.back(); // 50:最後一個元素
v.front() = 99; // 可以修改
v.back() = 1;
// v 現在是 {99, 20, 30, 40, 1}
2. insert():在指定位置插入
vector<int> v = {1, 2, 3, 4, 5};
// insert(位置迭代器, 值)
auto it = v.begin() + 2; // 指向索引 2(值為 3)
v.insert(it, 99);
// v 現在是 {1, 2, 99, 3, 4, 5}
圖解:
插入前:
┌───┬───┬───┬───┬───┐
│ 1 │ 2 │ 3 │ 4 │ 5 │
└───┴───┴───┴───┴───┘
↑
it(索引 2)
插入後(後面的元素全部後移):
┌───┬───┬────┬───┬───┬───┐
│ 1 │ 2 │ 99 │ 3 │ 4 │ 5 │
└───┴───┴────┴───┴───┴───┘
insert() 後,原本的迭代器可能**失效**,請重新取得。
3. erase():移除指定位置的元素
vector<int> v = {1, 2, 99, 3, 4, 5};
// 移除單一元素
v.erase(v.begin() + 2); // 移除索引 2(值 99)
// v 現在是 {1, 2, 3, 4, 5}
// 移除一個範圍 [begin+1, begin+3)(左閉右開)
v.erase(v.begin() + 1, v.begin() + 3);
// 移除索引 1 和 2(值 2 和 3)
// v 現在是 {1, 4, 5}
4. resize() 與 reserve()
這兩個函數常被搞混,用下圖區分:
resize(n):改變 size(元素個數)
vector<int> v = {1, 2, 3}; size=3, capacity=3
v.resize(5);
→ {1, 2, 3, 0, 0} size=5, capacity=5(新元素填 0)
v.resize(2);
→ {1, 2} size=2, capacity=5(縮小 size,不影響 capacity)
reserve(n):改變 capacity(預留記憶體)
vector<int> v = {1, 2, 3}; size=3, capacity=3
v.reserve(10);
→ {1, 2, 3} size=3, capacity=10(只預留空間,不新增元素)
何時用 reserve?
當你事先知道大概會新增多少元素時,使用 reserve 可以避免多次重新分配記憶體,提升效能:
vector<int> v;
v.reserve(1000); // 預先分配 1000 個空間
for (int i = 0; i < 1000; i++) {
v.push_back(i); // 不會觸發記憶體重新分配
}
5. capacity():查詢已分配空間
vector<int> v;
cout << v.size() << endl; // 0
cout << v.capacity() << endl; // 0(或平台相關的初始值)
v.push_back(1);
cout << v.capacity() << endl; // 1(或更大,依平台)
v.push_back(2);
cout << v.capacity() << endl; // 2(擴張)
v.push_back(3);
cout << v.capacity() << endl; // 4(擴張為倍數)
6. 二維 vector
vector 可以嵌套,用來表示矩陣或表格:
// 宣告 3x4 的二維 vector,初始值全為 0
vector<vector<int>> matrix(3, vector<int>(4, 0));
圖解:
matrix:
[0] [1] [2] [3]
[0] ──► ┌────┬────┬────┬────┐
│ 0 │ 0 │ 0 │ 0 │
└────┴────┴────┴────┘
[1] ──► ┌────┬────┬────┬────┐
│ 0 │ 0 │ 0 │ 0 │
└────┴────┴────┴────┘
[2] ──► ┌────┬────┬────┬────┐
│ 0 │ 0 │ 0 │ 0 │
└────┴────┴────┴────┘
// 存取與修改
matrix[1][2] = 99;
// 走訪二維 vector
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[i].size(); j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
// 使用 range-based for
for (auto& row : matrix) {
for (int val : row) {
cout << val << " ";
}
cout << endl;
}
注意:二維 vector 的每一列長度可以不同(鋸齒狀陣列),這與傳統二維陣列不同。