上次讲了常用的接口:今天就来进行模拟实现啦
基本结构:
ListNode
结构体: _prev
、后继指针 _next
和数据 _data
。ListIterator
结构体: _node
。*
、->
、++
、--
、!=
、==
,以便于对链表进行遍历和操作。list
类: iterator
和 const_iterator
,分别用于可修改的迭代和只读的迭代。使用new:动态开辟+调用默认构造函数了
这里为什么我们要把迭代器封装为一个类呢?明明之前模拟vector
和string
时,就直接typedef
了
之前模拟
vector
和string
时,二者底层都是连续的,想要到下一个可以直接++;想要得到里面的数据可以直接*
。 但是现在对于list
是不行的,我们就需要重载各种运算符,但是底层又是一个指针(内置类型)不能重载,现在就只能封装进一个类里,就能重载了
使用test1函数看功能是否正常
为什么使用模版: 因为可能使用其他类型的迭代器来进行初始化
注意这里的参数不是常量引用,而是按值传递的。这是因为在赋值操作符中我们会调用
swap
函数,按值传递可以保证传入的参数会被复制一份,避免对原对象的修改。在函数体内,我们调用了swap
函数,将当前对象和传入的对象进行内容交换,然后返回*this
,即当前对象的引用。
调用clear函数后,就只剩下头结点了
我们再次使用封装的思想,封装一个反向迭代器进去
此时那list类里就是这样:
好啦,list的内容也结束啦,下次就是Stack和Queue了。感谢大家支持!!!