前往
大廳
主題

資料結構筆記:C++中的迭代器 iterator

huninm | 2023-10-27 23:55:04 | 巴幣 0 | 人氣 361

首先是迭代器的原理:

迭代器是以類似指標的原理進行容器中的數值操作,begin() end() rend() rbegin()都是容器上的記憶體位置

vector<int>::iterator i = v.begin()就相當於創建一個迭代器指向vector v容器的第一個元素的位置
而i++ i-- i+=2 i+3等都是移動迭代器的位置,透過移動迭代器可以達到讀取元素和進行修改的目的
在迴圈中使用i != v.end()和i < v.end()就是讓迭代器指到最後一個元素也就是v.end()-1時停止的條件

由下面的程式與輸出結果可以發現,迭代器在進行操作時,即使改變指向的元素也不會改變迭代器的記憶體位置,這是因為在進行操作時是改變迭代器指向的位置而非迭代器本身。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> v;
    for (int n = 0; n < 10; ++n)
    {
        v.push_back(n);
    }
    vector<int>::iterator i;
    i = v.begin();
    cout << *i << " ";
    cout << &i << endl;
    i = v.end() - 1;
    cout << *i << " ";
    cout << &i << endl;

    return 0;
}
輸出結果:
0 0x61fefc
9 0x61fefc

根據C語言中文網的整理,C++中不同的容器會對應到不同的迭代器,而迭代器中有四種不同的定義方式





首先是在Vector中應用迭代器進行遍歷操作,在學會使用迭代器之前都是用for (int i = 0; i < v.size(); ++i)之類的操作來遍歷Vector中的內容,如果使用迭代器進行操作的話即使是不支援索引操作的容器如list也能進行遍歷操作,還有迭代器具有反向迭代器能在進行從結尾往開頭遍歷時能夠使用。

而迭代器的使用方法就如上方截圖一樣是
(使用容器的類別 如Vector)::(迭代器類型) 迭代器的名字
下方是使用迭代器進行遍歷操作的程式
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> v;
    for (int n = 0; n < 10; ++n)
    {
        v.push_back(n);
    }
    cout<<"Type1:"<<endl;
    //在for迴圈中宣告迭代器並以迭代器進行遍歷操作
    for (vector<int>::iterator i = v.begin(); i != v.end(); i++)
    {
        cout << *i << " ";
    }
    cout << endl;
    cout<<"Type2:"<<endl;
    //讓迭代器以每次移動兩個元素的方式輸出內容
    for (vector<int>::iterator i = v.begin(); i < v.end(); i += 2)
    {
        cout << *i << " ";
    }
    cout << endl;
    cout<<"Type3:"<<endl;
    // 用反向迭代器遍历容器
    for (vector<int>::reverse_iterator r = v.rbegin(); r != v.rend(); r++){
        cout << *r << " ";
    }
    return 0;
}

輸出結果:


常量迭代器無法對容器中的元素進行修改的操作:


最後是用迭代器遍歷list的操作
不能使用index索引來操作的list可以透過迭代器來進行元素的操作

#include <list>
#include <iostream>

using namespace std;
int main()
{
    list<int> l = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    for (list<int>::iterator i = l.begin(); i != l.end(); i++)
    {
        *i = *i * 2;
        cout << *i << ", ";
    }
    cout << endl;
    for (list<int>::reverse_iterator r = l.rbegin(); r != l.rend(); r++)
    {
        *r = *r / 2;
        cout << *r << ", ";
    }
    return 0;
}

但是要注意的是list的迭代器類型是雙向迭代器,並不支援i+=2這種一次移動兩格元素的操作,也不支援使用<符號來作為迴圈結束條件的判定

創作回應

更多創作