動態陣列 (dynamic array)
vector 的大小可以在執行時 自動擴張或縮小
解決陣列只有固定大小的問題
vector<int> v; // 空的 vector
vector<int> v2(10); // 長度 10,元素皆為 0
vector<int> v3(5, 42); // 長度 5,元素皆為 42v[0] = 5;vector<int> v;
v = {7,8,9};
vector<int> a = {1,2,3};
vector<int> b;
b = a; b 會把a的元素複製過去
變成 {1,2,3},a 保持不變
v.push_back(10); 在vector尾端新增元素
v.pop_back(); 刪除vector尾端元素
cout << v.size(); 查看vector大小
iterator是一種「像指標的物件」
提供一個統一的方式來存取容器中的元素
兩種宣告方式
vector<int>::iterator it = v.begin();
vector<int>::iterator it2 = v.end();begin() → 指向第一個元素
end() → 指向最後一個元素的下一個位置
iterator操作方式
it1 - it2 → 得到兩(iterator)之間的距離it += n
auto it = v.begin();
it += 2; //指到第三個元素
cout << *it <<"\n";cout << *it <<"\n";*it
int main() {
vector<int> v = {1, 2, 3, 4, 5};
for (auto it = v.begin(); it != v.end(); it++)
{
cout << *it << " "; // 1 2 3 4 5
}
}
如何透過iterator拿到最後一個元素?
insert() 用來在 指定位置 插入元素或一整段元素
插入點之後的元素會自動往後移。
如果容量不足,vector 會重新配置記憶體並搬移舊元素
vector<int> v = {10, 20, 30, 40};
// 在第二個位置插入一個值
v.insert(v.begin() + 1, 15); 需要用到iterator
erase() 用來在 指定位置 刪除元素或一整段元素
移除後,後面的元素會往前搬移,保持元素連續性
回傳一個 迭代器,指向被刪掉元素後面的第一個位置
vector<int> v = {10, 20, 30, 40, 50};
v.erase(v.begin() + 2);
// {10, 20, 40, 50};
v,erase(v.begin()+ 1, v.begin() + 2);erase(pos) → 刪掉單一元素
erase(first, last) → 刪掉一段元素
for (auto it = v.begin(); it != v.end(); ) {
if (*it % 2 == 0) // 刪除偶數
it = v.erase(it); // 用回傳值更新迭代器
else
++it;
}clear() 會 刪除 vector 中所有元素,讓它變成空容器
呼叫後,size() = 0
但是 capacity() 不會變,也就是說底層的記憶體仍保留,方便之後再放新元素時避免重新配置。
vector<int> v = {10, 20, 30, 40, 50};
v.clear();Syntax:
for (declaration : container) statement;
for (int x : v)
cout << x << " ";依序取出 v 中的每個元素,存放到變數 x,然後輸出
傳統array也可以用
Syntax:
for (declaration : container) statement;
vector<string> names = {"Tom", "Amy"
, "John"};
for (string& s : names) {
s += "!";
}用 & 可以直接修改元素
sort(v.begin(), v.end());
sort(v.begin(), v.end(), cmp);
vector<int> v = {4, 2, 5, 1, 3};
sort(v.begin(), v.end()); upper_bound(first, last, value)
找到第一個 大於 value 的元素位置
Remark: 一定要先排序好
int main() {
vector<int> v = {1, 2, 4, 4, 5, 7};
auto ub = upper_bound(v.begin(), v.end(), 4);
cout << (ub - v.begin()) << endl; // 4
cout << *ub << "\n"; //5
}lower_bound ?
vector<int> v(5, 42), v2 = {1, 2, 3};
//v = {42, 42, 42, 42, 42};
v.push_back(5);
v.pop_back();
int v_size = v.size();
sort(v.begin(), v.end());
auto ub = upper_bound(v.begin(), v.end(), 4);
//*ub > 4
auto lb = lower_bound(v.begin(), v.end(), 4);
//*ub >=4
v.clear();
int n = 3;
v.insert(v.begin() + n, 15);
v.erase(v.begin() + 2);