加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 基于范围的多维数组

发布时间:2020-12-16 06:02:09 所属栏目:百科 来源:网络整理
导读:我的嵌入式系统有一个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]的所有元素进
我的嵌入式系统有一个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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读