关于数组Range-based for loop遍历逻辑的理解是否正确?
关于Range-based for loop的用法理解问题
嘿,你的理解确实有偏差哦!咱们来拆解一下问题:
首先,C++的范围for循环(Range-based for loop)的核心是直接遍历容器/数组的元素本身,而不是遍历元素的索引或者数组的元素个数。
看你写的这段代码:
int iArray[16]; int iOtherArray[16]; for ( auto &i: iArray ) { iOtherArray[i] = iArray[i]; }
这里的auto &i是对iArray中每一个元素的引用,而不是数组的下标索引。举个例子,如果iArray[0]的值是5,那第一次循环里的i就是5,你写iOtherArray[i]就相当于访问iOtherArray[5],这完全不是你想要的“按顺序遍历数组位置”的效果——甚至如果iArray里的元素值超出0-15的范围,还会触发数组越界的未定义行为。
如果你的需求是遍历数组的索引(从而操作对应位置的元素),更合适的做法是用传统的for循环:
int iArray[16]; int iOtherArray[16]; for (int idx = 0; idx < std::size(iArray); ++idx) { iOtherArray[idx] = iArray[idx]; }
这里std::size可以自动获取数组的长度(需要C++17及以上,或者用sizeof(iArray)/sizeof(iArray[0])兼容旧标准),idx就是从0到15的索引,完美匹配你的需求。
当然,如果一定要用范围for搭配索引,也可以额外加一个计数器变量,但这种写法不如传统for直观:
int iArray[16]; int iOtherArray[16]; int idx = 0; for (auto &elem : iArray) { iOtherArray[idx] = elem; ++idx; }
总结一下:范围for是为“逐个处理元素”设计的,当你需要用到索引时,传统for循环才是更贴合需求的选择。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

