首先,我们确保自己基本熟悉了的STL中list的源代码框架,ok那么开始回答问题:
在vector、string中,iterator本质上就是参数的指针。即T*;
不需要额外创建iterator类是因为它们空间本质上是连续的。
当进行++操作时,指针++即可得到下一片正确的空间。
但是,list空间是不连续的。它由一个个list_node类(节点)组成。这就造成了如果我们继续定义一个指针作为迭代器指向参数,++后的值并非我们想要的。
这里要注意,迭代器所代指的并不是list_node类。
试想一下,你是使用者,创建的iterator一定想当然的认为是代指自己的list参数。再清晰一些,for(auto)时,本质使用的是迭代器,你的auto对象是不是代指节点的参数?——对吧。
因此,当我们进行++操作时,是对list_node里的参数进行++,这显然不是我们要的下一个参数值。我们想要的应该是通过next指针所指向的下一个list_node所包含的参数值。
因此我们就会发现,单纯的T* iterator已经满足不了我们的需求了——我们无法重载++。
当然--同理。
由此,我们需要创建一个类模板来作为迭代器,其要包含整个节点,让++/--能够重载,发挥node = node->next/prev的作用。
小编做了个图,大家再理解一下吧。
有两种方法能写出没有错误的程序;但只有第三种好用。 ——Alan J. Perlis
如有错误,敬请斧正