在學習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。對...