关于c++的迭代器

来源:互联网 发布:阿里云ip段 编辑:程序博客网 时间:2024/06/10 21:31

    最近在自学c++,试着写一个图的容器,支持常见的遍历方式。为了和stl的算法模版结合起来,决定自己写一个通用的迭代器。

    写迭代器的时候遇到了很多问题,其中一个就是迭代器必须持有一个容器本身的引用。这一点在java中并没有什么问题,不需要思考,但在c++中却是一个大的问题。一开始想当然的认为用shared_ptr可以解决问题,可问题是容器本身是顶级类,迭代器本身并不掌控容器类的创建,容器类本身怎么创建的?智能指针如果选择不拷贝容器,智能指针销毁的时候容器本身会被析构吗?这个我拿不准。因为事实上我不希望容器被析构,因为如果是这样,容器创建事实上也被迫使用shared_ptr了, 而且还要考虑容器本身真的要被析构时,迭代器有没有被全部析构的问题。一个顶层的东西被一个底层实现去改变行为,这不符合模块化的设计思想。 而如果选择拷贝,那肯定是不可以的,即使不考虑拷贝的性能损失,对容器修改后的同步也是个巨大的问题,如果迭代器本身不修改容器,那倒是可以去考虑。

   这时我认为需要的是一个clean 的指针,不掌控容器的任何行为,但同时也要知道器的生存状态。我想先看看STL的迭代器如何实现。一看才发现,他们用的是真正的指针,就是c语言里的那种指针。然而真正的指针不能知道容器是否已经被销毁。后来灵光一闪,想到了weak_ptr,这个应该可以满足我的所有需求,可想想还有同样的问题,weak_ptr指向的对象也必须是shared_ptr创建的,头痛。

   也许需要一个更顶层的东西,迭代器和容器都在它的管理之下?还是要翻翻书。

   垃圾回收器确实改变了编程的思想,有垃圾回收器的情况下,对象的生命周期不再是需要特别考虑的问题。这方便了程序员,但程序员同时也失去了对对象生命周期的控制。


    后记:仔细研究了sgi stl的list代码,发现迭代器设计真是一个深坑。自己的想法在高人面前简直是too simple, sometimes naive。

    

0 0
原创粉丝点击