关于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。
- c++:关于迭代器的一些认识
- 关于C的变量
- 关于C的讨论
- 关于C的思考
- 关于C的思考
- 关于C的指针
- 关于C的学习
- 关于C的思考
- 关于C的学习
- 关于c的随机数
- 关于C的缓冲区
- 关于C的思考
- 关于C的复习
- 关于c的烫烫烫烫烫烫
- 关于C/C++/Java的比喻
- 关于C/C ++ 编译器的问题
- 【c/c++】关于数组名的讨论
- C++/C 关于指针的基本用法
- iOS——代码自动布局
- arm概念区分
- 实现quartz定时器及quartz定时器原理介绍
- linux下mysql的操作
- 互斥与同步
- 关于c++的迭代器
- linux /dev/console、/dev/tty和/dev/null的区别
- 从7个方面简单学习shell的正则表达式
- 第七周算法分析与设计:ZigZag Conversion
- vue中改变选中当前项的显示隐藏或者状态的方法
- 设置vim >> 移动4个空格
- 二叉树的各种遍历实现伪代码
- Java反射机制详解
- 一些关于操作excel的 library