【发布时间】:2014-08-10 14:50:30
【问题描述】:
我的嵌入式系统有一个支持 C++11 的 g++ 版本,所以我一直在清理代码
for( uint16_t* p = array; p < (&array)[1]; ++p ) {
*p = fill_value;
}
到
for( uint16_t& r : array ) {
r = fill_value;
}
这更多更具可读性。
是否存在基于范围的 for 循环,它对 array2[m][n] 的所有元素进行操作?
旧版本是
for( int16_t* p = array2[0]; p < (&array2)[1][0]; ++p ) {
*p = fill_value;
}
我不想要嵌套循环,除非它保证编译器会将它们展平。
(FWIW,编译器是 TI Code Composer Studio 6.0.0 附带的 GNU 4.7.4 Linaro g++ ARM 交叉编译器)
【问题讨论】:
-
@πάνταῥεῖ:使用
std::array,我可以编写for( p = array2.front().begin(); p < array2.back().end(); ++p ),这是一个很大的改进,但仍然不如基于范围的 for -
"我不想要嵌套循环,除非它保证编译器会将它们展平。" 如果我问为什么,介意吗?如果有好处,编译器将它们展平还不够吗?
-
如果您可以使用 Boost,并且可以用 Boost.MultiArray 替换这些数组,我很确定有一种方法可以获得多维的一维 视图维数组。然后,您可以使用基于范围的
for对视图进行迭代。 -
@David:这是一个嵌入式系统。我尽量不做无端增加指令数的事情。
-
@BenVoigt 然后,大概你的编译器也是如此。否则,您选择了一个糟糕的编译器。您应该首先按照您的意思编写代码,并且只有在您有证据表明编译器出错时才担心这些细节。
标签: c++ arrays c++11 for-loop foreach