理解迭代器

2022-06-05 04:06:14 字數 1759 閱讀 1441

在學習c++ stl的時候,整天碰到迭代器,也整天用,但是,到底它是個什麼東西,很多人沒有乙個認識。這裡我通過幾個小的demo,來看看迭代器。首先我實現了乙個十分簡陋的vector類:

[cpp]

template 

class vector 

t* begin() 

void insert(t d)

typedef t* iterator; //vector的迭代器就是基礎指標型別}; 

我們知道,vector是陣列實現的,也就是說,只要知道陣列的首位址,就能知道後面每個元素的位置,所以,訪問vector的迭代器,其實就是乙個基礎的指標型別,我們可以通過++,--等操作,來遍歷訪問該vector。

[cpp]

//測試vector

vectora;

a.insert(1);

a.insert(2);

vector::iterator itra;

itra = a.begin();

printf("%d/n", *itra);

itra++;

printf("%d/n", *itra);

itra--; //基礎指標型別都支援++,--,+,-等操作符

printf("%d/n", *itra);

哇~~,原來vector的迭代器那麼簡單,那麼,我們來考慮一下list,這是鍊錶,我們知道,鍊錶每個元素都儲存在不同的位置,我們一般通過指 向下乙個元素的next指標來找到下乙個元素。那麼,我們怎麼樣來設計乙個迭代器,然後可以直接對這個迭代器進行++,--等操作二遍歷訪問整個鍊錶呢:

[cpp]

template 

class list;

node* pbegin; //表頭

class list_iterator

void operator ++ () 

// ...還可以過載-- + -等操作符

t operator * ()

};public :

list() 

node* begin() 

void insert(t d) 

typedef list_iterator iterator; //list的迭代器是乙個類}; 

為list設計的迭代器是乙個類,這個類支援++操作來向後移動遍歷鍊錶:

[cpp]

/測試list

listb;

b.insert(1);

b.insert(2);

list::iterator itrb;

itrb = b.begin();

printf("%d/n", *itrb);

itrb++; // 該迭代器只支援++

printf("%d/n", *itrb);

通過這兩個例子,可以看出,迭代器是跟容器緊密結合的,不同的容器,它的迭代器不同,但是,他們有共同的目標,就是可以通過該迭代器,來遍歷訪問這 個容器裡面的元素。這樣帶來的好處是在stl設計演算法時,可以脫離容器而設計更加通用的演算法。比如,在容器中查詢乙個元素。查詢,這個操作一般來說就是遍 歷整個集合,然後找到那個要找的元素,但是,如果沒有迭代器,我們需要為vector和list設計兩個查詢演算法,因為找下乙個元素在vector和 list中的操作不同。同樣的思想卻要兩套**,顯然這是不優秀的。

有了模板,我們可以將演算法和特定的資料分離開來,而有了迭代器,我們可以將演算法和特定的容器分離開來。

python迭代器簡單理解

1 凡是可應用於for迴圈的物件都是可迭代 可迴圈 iterable 物件,例如字串 列表 元組 字典 集合等 2 凡是可應用於next 方法的物件都是迭代器 iterator 物件,迭代器 iterator 是乙個惰性計算的過程,只有在需要返回下乙個數值的時候才會被計算 這一過程跟生成器很像,都是...

簡單理解Python迭代器

在使用列表時,直接將資料存入列表將會佔據大量空間,且復用率較低,為解決這個問題,這裡了解一下迭代器,從而建立一種資料產生的方式,以此來節省空間。注意,這裡需要使用到內建函式 iter 簡單理解為,使用了 iter 才會是乙個可迭代物件,關於這部分,我們可以對一些物件做一些判斷,從而清楚是不是可迭代物...

理解Python的迭代器

首先,廖雪峰老師的教程中解釋了迭代器和生成器,這篇文章只是補充和我個人的總結。可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 可以被next 函式呼叫並不斷返回下乙個值的物件稱為迭代器 iterator 所有的iterable均可以通過內建函式iter 來轉變為iterator。對...