Vector & Deque
戴瑢溱
Index
STL
STL - What is stl?
-
STL 是 C++ 的內建函式庫,全名為標準模板庫(Standard Template Library)
── 薑餅人

容器 (Containers) 儲存數據的結構
演算法 (Algorithms) 操作數據的方法
迭代器 (Iterators) 存取容器元素的方式
例:vector, set, map
例:begin(), end()
例:sort(), find(), count()
STL - containers
容器 (Containers)
-
序列容器 ( vector, deque, list )
-
關聯容器 ( set, map )
-
無序容器 ( unordered_set, unordered_map )
STL - Sequence Containers
序列容器
最基礎也最常用的容器類型,元素依照線性順序排列,你將元素放在什麼位置,它就在什麼位置(除非你手動移動它)。
Vector
Deque
List
Vector
Deque
List
適合高效隨機存取的場景
一塊連續空間。就像一排相連的置物櫃,找第 n 個櫃子非常快,但要加新櫃子時,如果旁邊沒位置了,就得搬家。
適合從兩端插入/刪除的場景
一塊分段連續空間。透過一個中控表(Map)管理多個區塊,頭尾要加位子時,直接新開一個區塊就好,不用搬全家。
適合頻繁插入/刪除的場景
完全不連續。每個元素像是一個獨立的島,靠著指標(橋)連在一起。
STL - Sequence Containers
vector
vector - 簡介
Vector
一個可以改變陣列大小的序列容器,
能高效地對記憶體進行管理以及動態增長。
1
2
3
vector - 簡介
Vector
一個可以改變陣列大小的序列容器,
能高效地對記憶體進行管理以及動態增長。
1
2
3
4
vector - 簡介
Vector
一個可以改變陣列大小的序列容器,
能高效地對記憶體進行管理以及動態增長。
1
2
3
4
5
vector - 語法
引入 <vector>
vector<資料型態> 變數名稱;#include <vector>宣告 vector
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
}vector - 初始化
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v1; // 建立一個儲存 int 的空 vector
vector<int> v2(5); // 建立一個大小為 5 的 vector,預設值皆為 0
vector<int> v3(5, 100); // 建立一個大小為 5 的 vector,每個元素都是 100
vector<int> v4 = {1, 2, 3, 4, 5}; // 建立一個包含這 5 個數字的 vector
vector<int> v5(v4); // 把 v4 的內容完整複製一份給 v5
vector<int> v6 = v5; // 把 v5 的內容完整複製一份給 v6
}vector - 尾端新增元素
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3};
v.push_back(4);
cout << v[3]; //4
}v.push_back(val);0
1
2
3
4
5
1
2
3
4
vector - 尾端移除元素
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3};
v.pop_back();
//v = {1, 2}
}v.pop_back();0
1
2
1
2
3
vector - 尾端移除元素
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3};
v.pop_back();
//v = {1, 2}
}v.pop_back();0
1
2
1
2
0
1
2
1
2
vector - 雙端
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {10, 20, 30};
// --- front & back (存取值) ---
cout << v.front() << endl; // 輸出 10
cout << v.back() << endl; // 輸出 30
v.front() = 15; // v 變成 {15, 20, 30}
v.back() = 25; // v 變成 {15, 20, 25}
// --- begin & end (迭代器定位) ---
// v.begin() 指向 15 的位置
// v.end() 指向 25 後面的那個空位
}- front():回傳 vector 第一個位置的值
- begin():指向 vector 開頭的迭代器
- back():回傳 vector 最後一個位置的值
- end():指向 vector 尾端的迭代器 ( 末尾後方的虛擬指標 )
vector - 回傳/指向
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {10, 20, 30};
// --- front & back (存取值) ---
cout << v.front() << endl; // 輸出 10
cout << v.back() << endl; // 輸出 30
v.front() = 15; // v 變成 {15, 20, 30}
v.back() = 25; // v 變成 {15, 20, 25}
// --- begin & end (迭代器定位) ---
// v.begin() 指向 15 的位置
// v.end() 指向 25 後面的那個空位
}for (int i = v.begin(); i != v.end(); i++) {
// 當 i 走到 end() 的時候,代表已經把所有有效的元素都跑完了
}左閉右開
vector - 插入元素
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {10, 20, 30};
v.insert(v.begin(), 0);
//v = {0, 10, 20, 30}
v.insert(v.begin() + 1, 5);
//v = {0, 5, 10, 20, 30}
v.insert(v.begin() + 3, 15);
//v = {0, 5, 10, 15, 20, 30}
}v.insert(pos, val);vector - 刪除元素
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {0, 1, 2, 3, 4, 5};
v.erase(v.begin());
// v = {1, 2, 3, 4, 5};
v.erase(v.begin() + 1);
// v = {1, 3, 4, 5};
v.erase(v.end() - 1);
// v = {1, 3, 4};
v.erase(v.begin(), v.begin() + 2); // 刪除索引 0 到 1 (不含索引 2)
// v = {4} 左閉右開:包含左界,不含右界
}v.erase(pos);vector - 大小/容量
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {0, 0};
cout << "size=" << v.size() << ", capacity=" << v.capacity() << endl;
v.push_back(0);
cout << "size=" << v.size() << ", capacity=" << v.capacity() << endl;
v.push_back(0);
cout << "size=" << v.size() << ", capacity=" << v.capacity() << endl;
v.push_back(0);
cout << "size=" << v.size() << ", capacity=" << v.capacity() << endl;
}- size() : 容器內實際存放了幾個元素
- capacity() : 容器在不重新分配記憶體的情況下,總共能裝幾個元素

vector 分配新的空間時
容量會變為原有容量的 2 倍
vector - 大小/容量
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {0, 0};
cout << "size=" << v.size() << ", capacity=" << v.capacity() << endl;
v.push_back(0);
cout << "size=" << v.size() << ", capacity=" << v.capacity() << endl;
v.push_back(0);
cout << "size=" << v.size() << ", capacity=" << v.capacity() << endl;
v.push_back(0);
cout << "size=" << v.size() << ", capacity=" << v.capacity() << endl;
}vector - 清空元素
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {10, 20, 30, 40, 50};
// --- 清空前 ---
cout << v.size() << endl; // 5
cout << v.capacity() << endl; // 5
cout << v.empty() << endl; // 0
// 清空
v.clear(); // v 佔用的「記憶體空間」還留著
// --- 清空後 ---
cout << v.size() << endl; // 0
cout << v.capacity() << endl; // 5
cout << v.empty() << endl; // 1
}-
clear():清除 vector 中的元素
-
empty():vector 是否為空
deque
deque - 簡介
deque
一個加強版的 vector,
頭尾兩端的插入與刪除都非常快。
1
2
3
deque - 簡介
deque
一個加強版的 vector,
頭尾兩端的插入與刪除都非常快。
1
2
3
4
deque - 簡介
deque
一個加強版的 vector,
頭尾兩端的插入與刪除都非常快。
1
2
3
4
0
deque - 語法
引入 <deque>
deque<資料型態> 變數名稱;#include <deque>宣告 deque
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> dq;
}deque - 語法
與 Vector 用法相似
- 多了push_front 與 pop_front
- 沒有 capacity(),因為 deque 是分段的,不像 vector 有總容量的概念
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> dq = {1, 2, 3};
dq.push_front(0); // dq = {0, 1, 2, 3}
dq.pop_front(); // dq = {1, 2, 3}
}dq.push_front(val);dq.pop_front();deque - 小練習
#include <iostream>
#include <deque> // 引入 deque
using namespace std;
int main() {
deque<int> dq = {10, 20, 30};
dq.push_front(0); // dq = {0, 10, 20, 30}
dq.push_back(40); // dq = {0, 10, 20, 30, 40}
dq[2] = 25; // dq = {0, 10, 25, 30, 40}
dq.insert(dq.begin() + 1, 5); // dq = {0, 5, 10, 25, 30, 40}
dq.erase(dq.begin() + 3); // dq = {0, 5, 10, 30, 40}
dq.pop_front(); // dw = {5, 10, 30, 40}
dq.pop_back(); // dq = {5, 10, 30}
cout << dq.front() << endl; // 5
cout << dq.back() << endl; // 30
cout << dq.size() << endl; // 3
cout << dq.empty() << endl; // 0
dq.clear(); // dq = {}
cout << dq.empty() << endl; // 1
}kahoot !
Vector & Deque
By ariel tai
Vector & Deque
- 111