c – 基于范围的多维数组

前端之家收集整理的这篇文章主要介绍了c – 基于范围的多维数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的嵌入式系统有一个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)

猜你在找的C&C++相关文章