写一个符合标准容器要求的自定义迭代器,关键不是“能遍历”,而是让 operator*、operator->、operator++、operator!=(或 operator==)等行为与 STL 算法和范围 for 兼容,并正确声明类型别名(如 value_type、iterator_category 等)。否则即使能用,也会在 std::sort、std::distance 或 for (auto& x : container) 中出错。
标准要求迭代器至少提供以下 5 个嵌套类型(C++17 起部分可由 std::iterator_traits 推导,但显式定义更稳妥、更清晰):
T)std::ptrdiff_t)T*)T& 或 const T&)std::random_access_iterator_tag),决定支持哪些操作类别决定你能用哪些算法,也决定你要实现多少操作。常见场景:
++it、*it、it != other,不可保存副本多次使用it++(后置)、可拷贝保存。需额外实现 operator==
--it 和 it--。比如链表节点迭代器it + n、it[n]
、it1 - it2、it1 。底层是连续内存(如 vector)时应实现它
注意:operator- 和 operator+ 不是必须重载的成员函数,但若声明为 random_access_iterator_tag,就必须能让 std::distance、std::advance 正常工作——通常靠提供 operator- 成员或非成员函数实现。
假设你有一个固定大小的 T* 数组,想封装成安全易用的迭代器:
templateclass const_span_iterator { public: using value_type = T; using difference_type = std::ptrdiff_t; using pointer = const T*; using reference = const T&; using iterator_category = std::random_access_iterator_tag; const_span_iterator(const T* ptr = nullptr) : ptr_(ptr) {} reference operator*() const { return *ptr_; } pointer operator->() const { return ptr_; } const_span_iterator& operator++() { ++ptr_; return *this; } const_span_iterator operator++(int) { auto tmp = *this; ++ptr_; return tmp; } const_span_iterator& operator--() { --ptr_; return *this; } const_span_iterator operator--(int) { auto tmp = *this; --ptr_; return tmp; } const_span_iterator& operator+=(difference_type n) { ptr_ += n; return *this; } const_span_iterator& operator-=(difference_type n) { ptr_ -= n; return *this; } const_span_iterator operator+(difference_type n) const { return const_span_iterator(ptr_ + n); } const_span_iterator operator-(difference_type n) const { return const_span_iterator(ptr_ - n); } reference operator[](difference_type n) const { return *(ptr_ + n); } friend difference_type operator-(const const_span_iterator& a, const const_span_iterator& b) { return a.ptr_ - b.ptr_; } friend bool operator==(const const_span_iterator& a, const const_span_iterator& b) { return a.ptr_ == b.ptr_; } friend bool operator!=(const const_span_iterator& a, const const_span_iterator& b) { return !(a == b); } friend bool operator<(const const_span_iterator& a, const const_span_iterator& b) { return a.ptr_ < b.ptr_; } // 其他比较运算符(>, <=, >=)可依需补充private: const T* ptr_; };
这个迭代器可直接用于
std::sort(first, last, comp)(只读)、std::lower_bound、范围 for(配合begin()/end()),也满足std::is_random_access_iterator_v<...>。进阶提示:避免常见坑
- 不要把
iterator和const_iterator实现成同一类型——它们的reference和pointer必须不同(一个是T&,一个是const T&),否则无法支持container.begin()和container.cbegin()的语义分离- 迭代器必须是 可平凡复制(trivially copyable) 和 可默认构造 的;析构函数不应有副作用
- 如果容器可能被移动(move),确保迭代器不持有 dangling 指针——可考虑用索引代替裸指针,或绑定容器生命周期(如
span类型)- C++20 起推荐继承
std::iterator(已弃用)或直接用概念约束(std::random_access_iterator),但手动定义仍是理解本质的最佳方式
# go
# access
# ai
# c++
# typedef
# sort
# for
# 封装
# 成员函数
# 析构函数
# const
# auto
# 指针
# 继承
# 接口
# 引用类型
# 指针类型
# 整数类型
# private
# operator
# pointer
# 算法
# 迭代
# 遍历
# 自定义
# 成安
# 五类
# 进阶
# 你要
# 只需
# 会在
# 你有
相关文章:
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Android使用GridView实现日历的简单功能
建站主机选择指南:服务器配置与SEO优化实战技巧
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何通过WDCP绑定主域名及创建子域名站点?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
建站之星如何保障用户数据免受黑客入侵?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
如何用y主机助手快速搭建网站?
实例解析angularjs的filter过滤器
一键网站制作软件,义乌购一件代发流程?
建站之星客服服务时间及联系方式如何?
在线制作视频的网站有哪些,电脑如何制作视频短片?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
如何将凡科建站内容保存为本地文件?
浅谈Javascript中的Label语句
如何确保西部建站助手FTP传输的安全性?
全景视频制作网站有哪些,全景图怎么做成网页?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
网站设计制作企业有哪些,抖音官网主页怎么设置?
设计网站制作公司有哪些,制作网页教程?
如何注册花生壳免费域名并搭建个人网站?
如何在万网自助建站中设置域名及备案?
建站之星logo尺寸如何设置最合适?
如何在IIS管理器中快速创建并配置网站?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
如何在IIS中新建站点并配置端口与IP地址?
想学网站制作怎么学,建立一个网站要花费多少?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
临沂网站制作公司有哪些,临沂第四中学官网?
宝塔新建站点为何无法访问?如何排查?
如何快速选择适合个人网站的云服务器配置?
建站之星后台管理如何实现高效配置?
微信h5制作网站有哪些,免费微信H5页面制作工具?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
做企业网站制作流程,企业网站制作基本流程有哪些?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何解决VPS建站LNMP环境配置常见问题?
如何在阿里云部署织梦网站?
建站之星收费标准详解:套餐费用及年费价格表一览
活动邀请函制作网站有哪些,活动邀请函文案?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
济南网站制作的价格,历城一职专官方网站?
模具网站制作流程,如何找模具客户?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
安徽网站建设与外贸建站服务专业定制方案
公众号网站制作网页,微信公众号怎么制作?
*请认真填写需求信息,我们会在24小时内与您取得联系。