我的嵌入式系统有一个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交叉编译器)
解决方法
作为一个例子,有多种打印和操作多维数组值的方式.
int arr[2][3] = { { 2,3,4 },{ 5,6,7} };
第一种方法,
size_t count = 0 ; for( auto &row : arr) for(auto &col : row) col = count ++;
在第一个for循环中,我们指的是两个数组.那么在第二个数组中,我们分别引用了这些子数组的3个元素.而且我们也把计数分配给col.所以,它迭代到子阵列的下一个元素.
第二种方法,
for( auto &row : arr) for( auto col : row) cout << col << endl;
我们在第一个循环中参考,因为我们希望避免数组转换为指针.
如果这样做(错误情况:第一个for循环不是参考),
for( auto row : arr) // program won't compile for( auto col : row)
这里,我们在行中有*.当我们到达第二个循环.因为行现在是int *而不是列表,程序将不会编译.您必须创建一个列表,那么只有我们可以将其传递给范围广泛的循环,并使用它来迭代该列表.
vector<int> list = { *(row+0),*(row+1),*(row+ 2) } ;
现在我们可以使用列表进行迭代
for ( ----- : list)