为什么STL中List的实现其迭代器iterator是类模板?

本文探讨了STL中list迭代器的设计原理,对比vector和string的迭代器实现,解释了为何list需要专门的迭代器类,并通过示例图帮助读者理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,我们确保自己基本熟悉了的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的作用。

小编做了个图,大家再理解一下吧。

ec5404be55744b54b3f8f8799acf8c61.png

 

 

有两种方法能写出没有错误的程序;但只有第三种好用。 ——Alan J. Perlis


如有错误,敬请斧正 

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就要 宅在家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值