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作為 臨時中轉站 初始化與否並無大影響。進行迴圈遍歷鍊錶各...