7 迭代器(下)
本項(xiàng)目GitHub: HuangCheng72/HCSTL: 我的STL實(shí)現(xiàn) (github.com): https://github.com/HuangCheng72/HCSTL
進(jìn)入正文。
在上一篇中,我們提到:
我們希望迭代器最好能像指針一樣,可以通過*來讀寫數(shù)據(jù),可以++,--,或者p += 3 ,p -= 4 之類的操作來移動,還可以通過兩個迭代器相減計(jì)算兩個迭代器之間的距離(最好同樣用指針相減的結(jié)果ptrdiff_t類型表示,當(dāng)然你非得用其他也行)等等。
這就需要運(yùn)用C++的重載機(jī)制,在迭代器中重載這些運(yùn)算符。
我們嘗試用結(jié)構(gòu)體封裝 list 的結(jié)點(diǎn),制作一個符合標(biāo)準(zhǔn)的迭代器。
list 的結(jié)點(diǎn)原型如下:
list 是雙向鏈表,所以迭代器應(yīng)該是雙向迭代器,因此 Category 應(yīng)為 bidirectional_iterator_tag 。
因此設(shè)計(jì)原型和具體實(shí)現(xiàn)有:
封裝之后嵌入到 list 具體實(shí)現(xiàn)中,在 list 的內(nèi)部實(shí)現(xiàn)中,凡是返回結(jié)點(diǎn)的,一律改為返回迭代器,如果不對外暴露,則保持以結(jié)點(diǎn)指針為基礎(chǔ)實(shí)現(xiàn)。(原則,對外部暴露迭代器,對內(nèi)部可以依然采用指針實(shí)現(xiàn))。
整理代碼如下:
main.cpp,簡單測試一下,能否使用迭代器取值。
順利運(yùn)行并輸出正確結(jié)果。
對于vector則不太一樣,因?yàn)関ector的迭代器就是其原生指針(沒有比原生指針更好用的迭代器了),所以直接指定原生指針為迭代器即可。
vector.h
我們建立一個新的 algorithm.h 頭文件,在其中實(shí)現(xiàn) for_each 算法:
在main.cpp中測試
可以看到均正常輸出,且輸出相同。
歡迎訪問本項(xiàng)目的GitHub倉庫,如果對您有幫助,麻煩給項(xiàng)目一個star,謝謝!
HuangCheng72/HCSTL: 我的STL實(shí)現(xiàn) (github.com): https://github.com/HuangCheng72/HCSTL