当前焦点!7 迭代器(下)

来源:哔哩哔哩 时间:2023-03-07 02:10:38

本项目GitHub:HuangCheng72/HCSTL: 我的STL实现 (github.com): https://github.com/HuangCheng72/HCSTL


(相关资料图)

进入正文。

在上一篇中,我们提到:

我们希望迭代器最好能像指针一样,可以通过*来读写数据,可以++,--,或者p += 3 ,p -= 4 之类的操作来移动,还可以通过两个迭代器相减计算两个迭代器之间的距离(最好同样用指针相减的结果ptrdiff_t类型表示,当然你非得用其他也行)等等。

这就需要运用C++的重载机制,在迭代器中重载这些运算符。

我们尝试用结构体封装 list 的结点,制作一个符合标准的迭代器。

list 的结点原型如下:

list 是双向链表,所以迭代器应该是双向迭代器,因此 Category 应为 bidirectional_iterator_tag 。

因此设计原型和具体实现有:

封装之后嵌入到 list 具体实现中,在 list 的内部实现中,凡是返回结点的,一律改为返回迭代器,如果不对外暴露,则保持以结点指针为基础实现。(原则,对外部暴露迭代器,对内部可以依然采用指针实现)。

整理代码如下:

main.cpp,简单测试一下,能否使用迭代器取值。

顺利运行并输出正确结果。

对于vector则不太一样,因为vector的迭代器就是其原生指针(没有比原生指针更好用的迭代器了),所以直接指定原生指针为迭代器即可。

vector.h

我们建立一个新的 algorithm.h 头文件,在其中实现 for_each 算法:

在main.cpp中测试

可以看到均正常输出,且输出相同。

欢迎访问本项目的GitHub仓库,如果对您有帮助,麻烦给项目一个star,谢谢!

HuangCheng72/HCSTL: 我的STL实现 (github.com): https://github.com/HuangCheng72/HCSTL

上一篇:

下一篇:

X 关闭

Copyright   2015-2022 欧洲净水网版权所有   备案号:沪ICP备2022005074号-23   联系邮箱: 58 55 97 3@qq.com