本项目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