學習STL,實現乙個單鏈表的迭代器

2021-07-05 05:07:17 字數 2796 閱讀 8905

stl原始碼剖析中,空間配置器和迭代器屬於比較晦澀難懂的兩章,這裡學習了stl迭代器後也嘗試自己寫乙個迭代器,實現單鏈表的迭代器,實現不難,可以說是乙個玩具而已,但是能夠幫助我們理解stl迭代器的基本原理。

//宣告

templateclass listiterator;

templateclass linklist;

//鍊錶節點

templateclass node;

t data;

node* next;

};//帶頭結點的單鏈表

templateclass linklist;

節點的定義成上述形式,主要就是為了實現oo思想中的封裝。單鏈表的宣告中省去來了很多成員函式,因為這裡只是為了實現迭代器思想。

//鍊錶迭代器

templateclass listiterator;

//過載*

const t& operator*() const throw(std::out_of_range);

t& operator*() throw(std::out_of_range);

//過載->

const node* operator->()const throw(std::out_of_range);

node* operator->() throw(std::out_of_range);

//過載++

listiterator& operator++() throw(std::out_of_range);

listiterator& operator++(int) throw(std::out_of_range);

//過載=

listiterator& operator=(const linklist& list) throw (std::out_of_range);

bool isempty() const;

private:

const linklist& list;

node* currentnode;

};

實現的關鍵在於,*、++ 、=的運算子過載,將單鏈表指標作為自己的成員,來實現。

templatelinklist::linklist()

templatelinklist::~linklist()

}template void linklist::insert(const t &data, int index)

// 插入鍊錶

node*newnode = new node(data);

newnode->next = searchnode->next;

searchnode->next = newnode;

}//顯示鍊錶中的所有資料(測試用)

template ostream &operator<<(ostream &os, const linklist&list)

return os;

} //listiterator的實現

template const t& listiterator::operator*() const throw (std::out_of_range)

template t &listiterator::operator*() throw (std::out_of_range)

template const node*listiterator::operator->() const throw (std::out_of_range)

template node*listiterator::operator->() throw (std::out_of_range)

template listiterator& listiterator::operator++() throw (std::out_of_range)

template listiterator& listiterator::operator++(int) throw (std::out_of_range)

templatelistiterator& listiterator::operator=(const linklist& list) throw (std::out_of_range)

template bool listiterator::isempty() const

#include "link_list.h"

int _tmain(int argc, _tchar* argv)

cout << "iterator:";

for (listiteratoriter(imylist); !iter.isempty(); ++iter)

cout << endl;

cout << "iterator2:";

for (listiteratoriter2 = imylist; !iter2.isempty();++iter2)

cout << endl;

cout << "ostream:" << imylist << endl;

listiteratoriter(imylist);

cout << "first = " << *iter << endl;

system("pause");

return 0;

}

本示例直接貼上執行。

最後,雖然實現簡單,但是與stl中的迭代器是不能相提並論的,設計乙個良好的迭代器不是一件簡單的事情,從stl的迭代器的設計中就可以看出。

php實現乙個單鏈表

單鏈表,節點只有乙個指標域的鍊錶。節點包括資料域和指標域。鍊錶乙個很重要的特性,就是這個頭節點 head。它絕對不能少,每次遍歷都要從它開始,並且不能移動頭節點,應該用乙個變數去代替他移動。腦袋裡要有鍊錶的結構。這是關鍵。來一段 class node 鍊錶有幾個元素 function countno...

OC實現乙個簡單的單鏈表

好久之前學習資料結構的時候寫的,不是很完整,在這裡備份乙份筆記,有時間了繼續補全。import inte ce mmnode nsobject property nonatomic,assign int data 節點資料 property nonatomic,strong mmnode next ...

反轉乙個單鏈表

思路二 反轉乙個鍊錶 示例 結構體定義 先對原鍊錶做頭刪操作,再對新鍊錶做頭插定義乙個新head頭指標,標記為newhead,將它初始為null,並非指向null,最後我們選擇返回這個newhead指標作為新鍊錶的頭指標。定義乙個結點node作為 臨時中轉站 初始化與否並無大影響。進行迴圈遍歷鍊錶各...