news 2026/5/11 6:38:26

【Effective Modern C++】第三章 转向现代C++:13. 优先选用const_iterator,而非iterator

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Effective Modern C++】第三章 转向现代C++:13. 优先选用const_iterator,而非iterator

STL 的const_iterator等价于 “指向常量的指针(pointer-to-const)”,指向的值不可修改,符合 “能加const就加” 的通用编程准则 —— 只要无需修改迭代器指向的值,就应优先使用const_iterator;但该迭代器的实用性随 C++ 版本迭代大幅提升,C++11 是关键转折点,同时通用代码中需优先使用非成员函数版本的begin/end/cbegin等。

各 C++ 版本对 const_iterator 的支持差异

1. C++98:支持残缺,实用性差

const_iterator理论上符合规范,但实际使用存在两大痛点:

  • 创建麻烦:非const容器无法直接获取const_iterator,需强制类型转换(或绑定到const引用)才能得到;

  • 使用受限insert/erase等容器操作仅接受iterator,且const_iterator无法可移植转换为iterator(即使reinterpret_cast也不行);

    最终导致开发者被迫放弃使用,违背 “能constconst” 的准则。

typedef std::vector<int>::iterator IterT; typedef std::vector<int>::const_iterator ConstIterT; std::vector<int> values; … // 非const容器需强制转换才能获取const_iterator ConstIterT ci = std::find(static_cast<ConstIterT>(values.begin()), static_cast<ConstIterT>(values.end()), 1983); // insert不接受const_iterator,转换iterator也无可靠方法(编译失败) values.insert(static_cast<IterT>(ci), 1998);

C++11:支持完善,易用性大幅提升

解决了 C++98 的核心痛点,让const_iterator真正实用:

  • 容器新增cbegin/cend成员函数,非const容器也能直接获取const_iterator

  • insert/erase等操作支持接收const_iterator,无需转换即可使用;

    示例:无需修改迭代器指向值的查找 + 插入场景,可直接用cbegin/cend获取const_iterator,代码简洁且符合规范。

std::vector<int> values; … // 直接用cbegin/cend获取const_iterator,insert原生支持 auto it = std::find(values.cbegin(), values.cend(), 1983); values.insert(it, 1998);

C++11 的小缺陷与 C++14 的补全

  • C++11 仅新增非成员函数begin/end,缺失cbegin/cend/rbegin/rend等;
  • C++14 补全了这些非成员函数,满足 “最大程度通用的库代码” 需求(适配原生数组、仅提供自由函数接口的第三方库等)。

通用代码的适配方案(C++11 兼容)

若 C++11 环境下 STL 未提供非成员cbegin等函数,可自行实现(兼容普通容器和原生数组):

  • 核心逻辑:通过const引用接收容器 / 数组,调用 C++11 提供的非成员begin—— 对const容器 / 数组,begin会自动返回const_iterator(数组场景下等价于指向const的指针);
  • 无需依赖容器的cbegin成员函数,适配性更强。

总结

  • 优先选用const_iterator,而非iterator
  • 在最通用的代码中,优先选用非成员函数版本的beginendrbegin等,而非其成员函数版本。

原著在线阅读地址

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 11:55:16

基于SpringBoot+Vue的垃圾分类回收网站(源码+lw+部署文档+讲解等)

课题介绍 本课题旨在设计实现基于SpringBootVue的垃圾分类回收网站&#xff0c;聚焦居民、回收服务商、环保监管部门的垃圾分类查询、回收预约、数据统计及政策科普核心需求&#xff0c;破解传统垃圾分类指导不足、回收渠道分散、资源利用率低、监管数据滞后等痛点&#xff0c;…

作者头像 李华
网站建设 2026/5/10 8:19:28

基于Thinkphp和Laravel的大学生迎新新生入学报到系统ts0qp-_

目录 系统概述技术架构核心功能安全与扩展性部署与维护 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 系统概述 ThinkPHP与Laravel框架结合开发的大学生迎新报到系统&#xff08;ts0qp-_&#xff09;旨在简化新生入学流程&#xff0c;实现数字…

作者头像 李华
网站建设 2026/5/9 20:48:08

RKNN Toolkit lite2工具详解与工程应用

一、RKNN Toolkit lite2介绍 在之前的博客中&#xff0c;有对rknn-toolkit lite2工具进行简要介绍&#xff0c;rknn-toolkit lite2在嵌入式平台上进行模型推理&#xff0c;它主要用来部署已经转换好的rknn模型。使用python接口对模型进行调用&#xff0c;实现模型推理&#xff…

作者头像 李华
网站建设 2026/5/9 14:28:43

如果有一天,Linus Torvalds 不再维护 Linux 内核了,会发生什么?

作为一名在生产环境里和 Linux 打了十几年交道的运维工程师,我们大多数人每天都在用 Linux,却很少真正思考一个问题: 如果有一天,Linus Torvalds 不再维护 Linux 内核了,会发生什么? 这个问题,在过去很长一段时间里,既“显而易见”又“讳莫如深”。 显而易见,是因为 L…

作者头像 李华
网站建设 2026/5/10 1:39:00

USB2.0端口ESD管单颗能护双路数据传输?

USB2.0接口的D与D-差分对需要协同防护&#xff0c;单颗集成双通道的ESD保护器件在硬件层面具备同时保护两路信号的能力&#xff0c;且有利于保持差分对的电气参数对称性。本文从单颗器件的硬件架构、USB2.0信号适配性、工程设计要点与选型实践四个维度&#xff0c;解析单颗ESD管…

作者头像 李华
网站建设 2026/5/9 12:08:34

高清DP接口ESD管防护会让8K信号断连?

DisplayPort 1.4/2.0接口在传输8K60Hz超高清视频时&#xff0c;信号速率高达8.1Gbps每通道&#xff08;HBR3&#xff09;或更高&#xff0c;对ESD保护器件的结电容提出严苛要求。结电容超标的ESD管会导致插入损耗剧增、眼图闭合与链路协商失败&#xff0c;触发显示器黑屏或分辨…

作者头像 李华