当前位置: 首页 > news >正文

【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等,而非其成员函数版本。

原著在线阅读地址

http://www.jsqmd.com/news/314169/

相关文章:

  • 更弱智的算法学习 day57
  • Excel ADDRESS函数深度解析:动态构建单元格地址的艺术
  • HTML中form表单标签中name和id属性的区别 正则表达式
  • 一文搞定Claude Code 服务器使用
  • 从pcap文件提取sip信令文本
  • C++算法算法训练第十一天
  • TCN-Transformer-LSTM组合模型回归+SHAP分析+新数据预测+多输出!深度学习可解释分析MATLAB代码
  • 数据清洗在大数据领域的发展趋势与展望
  • 芯片设计效率提升10倍!AI自动化方案全解析
  • 中国企业的品牌价值:无形资产评估的新思路
  • 【详解】使用java解决-有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
  • 大数据领域元数据管理的实践经验分享
  • 基于Thinkphp和Laravel的被裁人员就业求职招聘管理系统_w3209_
  • 基于Thinkphp和Laravel的高校电动车租赁系统_hb0fi_
  • Thinkphp和Laravel智慧社区医院医疗 挂号服务导诊平台_087z7 功能多_
  • 基于Thinkphp和Laravel的乡村政务举报投诉办公系统的设计与实现_
  • 基于Thinkphp和Laravel的公益活动报名志愿者服务平台的设计与实现_
  • 基于Thinkphp和Laravel的喀什旅游网站酒店机票美食_hw31x_
  • 基于Thinkphp和Laravel的大学生迎新新生入学报到系统ts0qp-_
  • 软工毕设容易的项目选题推荐
  • 如果有一天,Linus Torvalds 不再维护 Linux 内核了,会发生什么?
  • 单例模式 懒汉式(静态内部类)
  • Thinkphp和Laravel+vue服装定制晋祠宋明服饰文化体验平台_ye471 景区古典服装商城定制系统
  • 多线程锁基础
  • 9款AI写论文哪个好?实测后锁定宏智树AI:文献真实、数据可溯,毕业论文一键通关!官网www.hzsxueshu.com 微信公众号搜一搜宏智树AI
  • 5 款 AI 写论文哪个好?实测后发现,宏智树 AI 才是毕业论文兜底神器
  • 写论文软件哪个好?宏智树 AI 封神!从选题到答辩的全流程攻略
  • “AI+虚拟仿真”重塑环艺设计人才培养
  • 加油卡小程序核心玩法拆解与运营逻辑分析
  • 只有10%的人会相信网络广告