range-based for on multi-dimensional array(基于多维数组的范围)
问题描述
我的嵌入式系统有一个支持 C++11 的 g++ 版本,所以我一直在清理代码
My embedded system got a C++11-capable version of g++, so I've been cleaning up code from
for( uint16_t* p = array; p < (&array)[1]; ++p ) {
*p = fill_value;
}
到
for( uint16_t& r : array ) {
r = fill_value;
}
这更具可读性.
是否有一个基于范围的 for 循环来操作 array2[m][n]
的所有元素?
Is there a range-based for loop which operates over all elements of array2[m][n]
?
旧版本是
for( int16_t* p = array2[0]; p < (&array2)[1][0]; ++p ) {
*p = fill_value;
}
而且我不想要嵌套循环,除非可以保证编译器将它们展平.
and I don't want nested loops, unless it's guaranteed the compiler will flatten them.
(FWIW,编译器是 TI Code Composer Studio 6.0.0 附带的 GNU 4.7.4 Linaro g++ ARM 交叉编译器)
(FWIW, the compiler is the GNU 4.7.4 Linaro g++ ARM cross-compiler that ships with TI Code Composer Studio 6.0.0)
推荐答案
例如,有多种方法可以打印和操作多维数组的值.
As an example, there are various ways to print and manipulate value of a multidimensional array.
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 分配了计数.因此,它迭代到子数组的下一个元素.
Here in the first for loop we are referring to the two array. Then in the second array we have reference to the 3 elements of those subarrays separately. And we are also assigning count to col. So, it iterates over to the next element of the subarray.
第二种方法,
for( auto &row : arr)
for( auto col : row)
cout << col << endl;
我们在第一个循环中引用这里,因为我们想避免数组到指针的转换.
We take reference here in the first loop because we want to avoid array to pointer conversion.
如果这样做了(错误情况:第一个 for 循环不是引用),
If this is done( error case: first for loop is not a reference ),
for( auto row : arr) // program won't compile
for( auto col : row)
这里,我们有 int * 行.当我们到达第二个 for 循环时.因为 row 现在是 int * 而不是列表,程序将无法编译.您必须创建一个列表,然后我们才能将其传递给 ranged for 循环并使用它来迭代该列表.
Here, we have int * in row. By the time we reach the second for loop. Because row is now int * and not a list the program will not compile. You have to create a list then only we can pass that it to ranged for loop and use it for iterating over that list.
vector<int> list = { *(row+0) , *(row+1) , *(row+ 2) } ;
现在我们可以使用列表进行迭代
Now we can use the list for iteration
for ( ----- : list)
这篇关于基于多维数组的范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:基于多维数组的范围
基础教程推荐
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 为什么语句不能出现在命名空间范围内? 2021-01-01