C++ STL

Standard Template Library

STL

Vector

動態陣列 (dynamic array)

vector 的大小可以在執行時 自動擴張或縮小

解決陣列只有固定大小的問題

Construct vector

vector<int> v;          // 空的 vector
vector<int> v2(10);     // 長度 10,元素皆為 0
vector<int> v3(5, 42);  // 長度 5,元素皆為 42

Access elements

v[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 保持不變

push_back, pop_back, size

v.push_back(10); 

在vector尾端新增元素

v.pop_back(); 

刪除vector尾端元素

cout << v.size(); 

查看vector大小

Vector iterator

iterator是一種「像指標的物件」

提供一個統一的方式來存取容器中的元素

兩種宣告方式

vector<int>::iterator it = v.begin();
vector<int>::iterator it2 = v.end();
  • begin() → 指向第一個元素

  • end() → 指向最後一個元素的下一個位置

Vector iterator(迭代器)

iterator操作方式

  • 跟指標一樣可以用+-來移動,用*來取出裡面的值
  • it1 - it2 → 得到兩(iterator)之間的距離

it += n

auto it = v.begin();
it += 2; //指到第三個元素
cout << *it <<"\n";
cout << *it <<"\n";

*it

Example

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

insert() 用來在 指定位置 插入元素或一整段元素

  • 插入點之後的元素會自動往後移。

  • 如果容量不足,vector 會重新配置記憶體並搬移舊元素

vector<int> v = {10, 20, 30, 40};
// 在第二個位置插入一個值
v.insert(v.begin() + 1, 15); 

需要用到iterator

erase

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) → 刪掉一段元素

erase example

for (auto it = v.begin(); it != v.end(); ) {
    if (*it % 2 == 0)   // 刪除偶數
        it = v.erase(it);  // 用回傳值更新迭代器
    else
        ++it;
}

clear

clear() 會 刪除 vector 中所有元素,讓它變成空容器

  • 呼叫後,size() = 0

  • 但是 capacity() 不會變,也就是說底層的記憶體仍保留,方便之後再放新元素時避免重新配置。

vector<int> v = {10, 20, 30, 40, 50};
v.clear();

range-based for loop

Syntax:
for (declaration : container)                 statement;

for (int x : v) 
    cout << x << " ";

依序取出 v 中的每個元素,存放到變數 x,然後輸出

傳統array也可以用

range-based for loop

Syntax:
for (declaration : container)                 statement;

vector<string> names = {"Tom", "Amy"
, "John"};
for (string& s : names) {   
    s += "!";
}

 用 & 可以直接修改元素

Sort

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

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); 

C++ STL

By ernestii26