分類: c/c++
2010-05-07 16:06
1877人閱讀收藏
舉報iterator
vector
list
演算法insert
class
在學習c++ stl的時候,整天碰到迭代器,也整天用,但是,到底它是個什麼東西,很多人沒有乙個認識。這裡我通過幾個小的demo,來看看迭代器。首先我實現了乙個十分簡陋的vector類:
[cpp]view plain
copy
template
<
class
t>
class
vector
t* begin()
void
insert(t d)
typedef
t* iterator;
//vector的迭代器就是基礎指標型別
};
我們知道,vector是陣列實現的,也就是說,只要知道陣列的首位址,就能知道後面每個元素的位置,所以,訪問vector的迭代器,其實就是乙個基礎的指標型別,我們可以通過++,--等操作,來遍歷訪問該vector。
[cpp]view plain
copy
//測試vector
vector> a;
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]view plain
copy
template
<
class
t>
class
list;
node* pbegin; //表頭
class
list_iterator
void
operator ++ ()
// ...還可以過載-- + -等操作符
t operator * ()
};
public
: list()
node* begin()
void
insert(t d)
typedef
list_iterator iterator;
//list的迭代器是乙個類 用typedef有利於程式的移植性
};
為list設計的迭代器是乙個類,這個類支援++操作來向後移動遍歷鍊錶:
[cpp]view plain
copy
/測試list
list> b;
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中的操作不同。同樣的思想卻要兩套**,顯然這是不優秀的。
有了模板,我們可以將演算法和特定的資料分離開來,而有了迭代器,我們可以將演算法和特定的容器分離開來。
迭代器是什麼
在學習c stl的時候,整天碰到迭代器,也整天用,但是,到底它是個什麼東西,很多人沒有乙個認識。這裡我通過幾個小的demo,來看看迭代器。首先我實現了乙個十分簡陋的vector類 view plain template class t class vector t begin void insert...
迭代器是什麼
在學習c stl的時候,整天碰到迭代器,也整天用,但是,到底它是個什麼東西,很多人沒有乙個認識。這裡我通過幾個小的demo,來看看迭代器。首先我實現了乙個十分簡陋的vector類 template class t class vector t begin void insert t d typede...
C 程式設計中迭代器是什麼
c 中迭代器 iterator 是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的位址。迭代器修改了常規指標的介面,所謂迭代器是一種概念上的抽象 那些行為上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用演算法有機的統一起來...