新闻中心

c++中的范围for循环(range-based for)原理_c++自定义迭代器支持【C++11】

2025-12-12
浏览次数:
返回列表
范围for循环本质是编译器对传统for+迭代器代码的自动展开,只需类型提供符合要求的begin()和end()函数及支持operator*、operator++、operator!=的迭代器。

c++中的范围for循环(range-based for)原理_c++自定义迭代器支持【c++11】

范围for循环(range-based for)本质是编译器对一段等价的传统for+迭代器代码的自动展开,它不依赖容器是否继承自标准库,只要类型提供符合要求的 begin()end() 成员函数(或非成员函数),并返回可解引用、可递增、可比较相等的迭代器类型,就能用。

range-for 的底层展开规则

对于语句:

for (auto& x : container) { ... }

编译器会按如下顺序查找并调用:

  • 先尝试 container.begin()container.end()(成员函数)
  • 若失败,再查找同作用域内(含 ADL)的非成员 begin(container)end(container)
  • 要求两个函数返回同一类型(或满足可比较、可递增等语义)的迭代器
  • 每次循环:用 != 判断是否结束;用 *it 获取元素;用 ++it 推进

自定义类支持 range-for 的最小接口

只需实现 begin() / end() 及对应的迭代器类型。迭代器不必继承 std::iterator,也不必完整实现所有 STL 迭代器概念——range-for 只用到三个操作:operator*operator++operator!=(或 operator==)。

示例(简化版数组包装器):

template<typename T, size_t N>
struct MyArray {
    T data[N];
<pre class="brush:php;toolbar:false;">struct iterator {
    T* ptr;
    T& operator*() { return *ptr; }
    iterator& operator++() { ++ptr; return *this; }
    bool operator!=(const iterator& other) const { return ptr != other.ptr; }
};

iterator begin() { return {data}; }
iterator end() { return {data + N}; }

};

之后即可:

文心智能体平台 文心智能体平台

百度推出的基于文心大模型的Agent智能体平台,已上架2000+AI智能体

文心智能体平台 393 查看详情 文心智能体平台
MyArray<int, 3> arr = {{1,2,3}};
for (int& x : arr) x *= 2; // OK

更灵活:用 ADL 提供非成员 begin/end

若无法修改原类型(如 C 风格数组、第三方结构体),可通过 ADL 在其所在命名空间中定义非成员 begin/end

namespace mylib {
    struct RawData { int* p; size_t n; };
<pre class="brush:php;toolbar:false;">inline auto begin(RawData& r) { return r.p; }
inline auto end(RawData& r) { return r.p + r.n; }
// 注意:返回裸指针也合法 —— 指针天然满足迭代器基本操作

}

此时 for (auto x : mylib::RawData{...}) 即可工作。

注意事项与常见坑

以下情况会导致编译失败或行为异常:

  • begin()end() 返回类型不同 → 编译错误
  • 迭代器缺少 operator!=(且无 operator==)→ 编译错误
  • 返回临时对象的引用(如 return std::vector::begin() 但 vector 是局部变量)→ 悬空迭代器
  • 只提供 const 版本的 begin/end → 只能用于 const 容器或加 const 限定的 range-for
  • 想支持 for (const auto& x : ...)?确保 begin() 返回的迭代器解引用结果可绑定到 const T&

基本上就这些。写得干净点,连 typedefusing difference_type = std::ptrdiff_t 都不是必须的 —— range-for 不关心这些。

以上就是c++++中的范围for循环(range-based for)原理_c++自定义迭代器支持【C++11】的详细内容,更多请关注其它相关文章!


# 之心  # 牡丹江市关键词seo排名优化  # 密云区自制网站建设收费  # 新乡关键词排名投放  # 咸宁网站营销与推广加盟  # 湖南电商网站建设销售  # 邢台推广营销网络  # 徐州网站推广微忻hfqjwl下拉  # 潮州母婴推广招聘网站  # 征稿网站建设文案范文  # 网站建设卫辉如何操作流程  # 可通过  # 解决问题  # ai  # 中文网  # 相关文章  # 边缘  # 只需  # 游戏开发  # 自定义  # 迭代  # 标准库  # typedef  # 编译错误  # 作用域  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  在python-socketio事件处理器中安全访问Flask应用上下文  铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧  yy漫画网页版官方入口_yy漫画官网登录页面链接  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  理解J*aScript Promise的微任务队列与执行顺序  手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析  Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换  Go调试环境为何无法启动_Go调试器启动失败原因与解决策略  12306选座如何查看座位示意图_12306座位示意图解读与使用  如何在 Excel Online 和 Google 表格中更改日期格式  Angular中父组件异步更新子组件复选框状态的实践指南  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  顺丰快递查询系统 官方正版查询入口  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  蛙漫安全无毒 官方认证的绿色入口  Python类型检查:优化关联可选属性的Mypy推断策略  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  jQuery Mask 插件中实现电话号码固定前导零的教程  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  J*aScript中向JSON对象添加新属性的正确姿势  曝R星经典之作开发图 设计简陋但信息密集!  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  Python大型XML文件高效流式解析教程  html5 app怎么运行环境_配html5 app运行环境【教程】  深入理解J*a合成构造器:何时以及为何阻止其生成  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  如何在 Windows 11 中启动游戏手柄设置  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  抖音网页版怎么|直播|_抖音网页版开播操作指南  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  Python异步编程实践:使用Binance API构建实时交易数据流  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  汽水音乐在线解析 汽水音乐在线解析入口 

搜索