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