STL 容器 (二) - Iterator


layout: post title: '[C++] STL 容器 (二) - Iterator' keywords: C++, STL, Standard Template Library, Container, 標準模版函式庫, 容器

published: true

這篇是 STL 容器介紹的第二篇
還沒看過第一篇的可以先看這裡


這篇要介紹的主要是 iterator
iterator 像是一個比較聰明的 pointer
可以指到容器內任何一個位置
然後操作那個位置的資料


要印出整個陣列有兩個方法 :

// 假如有一個陣列長這樣
// len = 5
int arr[] = {1, 2, 3, 4, 5};
int len = sizeof(arr) / sizeof(int);


/*========== 用 index 印出整個陣列 ==========*/

// 很簡單,應該也是大家最常用的方法
for(int i=0 ; i<len ; i++){
    cout << arr[i] << endl;
}


/*========== 用 pointer 印出整個陣列 ==========*/

// begin 指向的是 1 那個位置
// end 指向的是 5 後面沒有東西的那個位置
int *begin = arr + 0;
int *end = arr + len;

int *ptr;
for(ptr=begin ; ptr!=end ; ptr++){
    cout << *ptr << endl;   // 1, 2, 3, 4, 5
}

同樣要印出整個 Vector 也有兩個方法 :

int arr[] = {1, 2, 3, 4, 5};
vector<int> vec(arr, arr+5);    // vec = [1, 2, 3, 4, 5]
int len = vec.size();           // len = 5


/*========== 用 index 印出整個 Vector ==========*/

// 很簡單跟陣列一樣
for(int i=0 ; i<len ; i++){
    cout << vec[i] << endl;
}


/*========== 用 iterator 印出整個 Vector ==========*/


// begin 指向的是 1 那個位置
// end 指向的是 5 後面沒有東西的那個位置
vector<int>::iterator begin = vec.begin();
vector<int>::iterator end = vec.end();

vector<int>::iterator it;
for(it=begin ; it!=end ; it++){
    cout << *it << endl;
}

// 跟上面的指標比較一下
// 真的很像吧~
/*
    用 vector<int>::iterator 宣告出來的是 vector<int> 的 iterator
    就像用 int* 宣告出來的是一個指向 int 的指標
    雖然 iterator 的宣告比較麻煩
    但概念 iterator 上跟 pointer 是很接近的
*/

如果只是要印出 vector 用 vec[index] 就可以了
但不是每個 STL Container 都像 vector
可以用 vec[index] 取得任意位置的值
而且還有很多操作也會需要 iterator

Vector 的 insert 跟 erase :

int arr[] = {1, 2, 3, 4, 5};
vector<int> vec(arr, arr+5);    // vec = [1, 2, 3, 4, 5]


// 把 0 放在 vec.begin() 的位置 -> [0, 1, 2, 3, 4, 5]
vec.insert(vec.begin(), 0);


// 在尾巴加三個 100 -> [0, 1, 2, 3, 4, 5, 100, 100, 100]
vec.insert(vec.end(), 3, 100);


// 移除第 0 個元素 -> [1, 2, 3, 4, 5, 100, 100, 100]
vec.erase(vec.begin());


// 移除最後一個元素 -> [1, 2, 3, 4, 5, 100, 100]
vec.erase(vec.end() - 1);


// 移除前五個元素 -> [100, 100]
vec.erase(vec.begin(), vec.begin() + 5);

cout << vec.size() << endl;     // size = 2

Algorithm 內的一些功能

#include<algorithm>

int main(){
    int arr[] = {3, 1, 4, 2, 5};
    vector<int> vec(arr, arr+5);    // vec = [3, 1, 4, 2, 5]


    // 排序前三個 -> [1, 3, 4, 2, 5]
    sort(vec.begin(), vec.begin() + 3);


    // 全部排序 -> [1, 2, 3, 4, 5]
    sort(vec.begin(), vec.end());


    // 反轉 -> [5, 4, 3, 2, 1]
    reverse(vec.begin(), vec.end());


    // 找找看 3 有沒有在裡面
    // 找不到就會回傳 vec.end()
    vector<int>::iterator it;
    it = find(vec.begin(), vec.end(), 3);

    if(it != vec.end()){
        cout << "3 在裡面" << endl;
    } else {
        cout << "3 不在裡面" << endl;
    }
}

第二篇就到這裡結束
希望大家看完這篇能稍微瞭解什麼是 iterator
還有怎麼用它
之後應該會再繼續寫下一篇
感覺要講的東西還有好多
只能說 C++ 真是博大精深阿~~