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++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...