關於c++的迭代器

    最近在自學c++,試着寫一個圖的容器,支持常見的遍歷方式。爲了和stl的算法模版結合起來,決定自己寫一個通用的迭代器。

    寫迭代器的時候遇到了很多問題,其中一個就是迭代器必須持有一個容器本身的引用。這一點在java中並沒有什麼問題,不需要思考,但在c++中卻是一個大的問題。一開始想當然的認爲用shared_ptr可以解決問題,可問題是容器本身是頂級類,迭代器本身並不掌控容器類的創建,容器類本身怎麼創建的?智能指針如果選擇不拷貝容器,智能指針銷燬的時候容器本身會被析構嗎?這個我拿不準。因爲事實上我不希望容器被析構,因爲如果是這樣,容器創建事實上也被迫使用shared_ptr了, 而且還要考慮容器本身真的要被析構時,迭代器有沒有被全部析構的問題。一個頂層的東西被一個底層實現去改變行爲,這不符合模塊化的設計思想。 而如果選擇拷貝,那肯定是不可以的,即使不考慮拷貝的性能損失,對容器修改後的同步也是個巨大的問題,如果迭代器本身不修改容器,那倒是可以去考慮。

   這時我認爲需要的是一個clean 的指針,不掌控容器的任何行爲,但同時也要知道器的生存狀態。我想先看看STL的迭代器如何實現。一看才發現,他們用的是真正的指針,就是c語言裏的那種指針。然而真正的指針不能知道容器是否已經被銷燬。後來靈光一閃,想到了weak_ptr,這個應該可以滿足我的所有需求,可想想還有同樣的問題,weak_ptr指向的對象也必須是shared_ptr創建的,頭痛。

   也許需要一個更頂層的東西,迭代器和容器都在它的管理之下?還是要翻翻書。

   垃圾回收器確實改變了編程的思想,有垃圾回收器的情況下,對象的生命週期不再是需要特別考慮的問題。這方便了程序員,但程序員同時也失去了對對象生命週期的控制。


    後記:仔細研究了sgi stl的list代碼,發現迭代器設計真是一個深坑。自己的想法在高人面前簡直是too simple, sometimes naive。

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章