基于范围的多维数组

Ben*_*igt 17 c++ arrays foreach for-loop c++11

我的嵌入式系统有一个支持C++ 11的g ++版本,所以我一直在清理代码

for( uint16_t* p = array; p < (&array)[1]; ++p ) {
    *p = fill_value;
}
Run Code Online (Sandbox Code Playgroud)

for( uint16_t& r : array ) {
    r = fill_value;
}
Run Code Online (Sandbox Code Playgroud)

这是更具有可读性.

是否存在基于范围的for循环,它可以在所有元素上运行array2[m][n]

旧版本是

for( int16_t* p = array2[0]; p < (&array2)[1][0]; ++p ) {
    *p = fill_value;
}
Run Code Online (Sandbox Code Playgroud)

我不希望嵌套循环,除非保证编译器将它们展平.

(FWIW,编译器是TI Code Composer Studio 6.0.0附带的GNU 4.7.4 Linaro g ++ ARM交叉编译器)

Abh*_*yan 8

作为示例,有多种方式来打印和操纵多维数组的值.

int arr[2][3] = { { 2, 3, 4 }, { 5, 6, 7} };  
Run Code Online (Sandbox Code Playgroud)

第一种方法,

size_t count = 0 ; 

for( auto &row : arr)
    for(auto &col : row)
         col = count ++; 
Run Code Online (Sandbox Code Playgroud)

在第一个for循环中,我们指的是两个数组.然后在第二个数组中,我们分别引用了这些子数组的3个元素.而且我们也将计数分配给col.因此,它迭代到子数组的下一个元素.

第二种方法,

for( auto &row : arr)
     for( auto col : row)
          cout << col << endl; 
Run Code Online (Sandbox Code Playgroud)

我们在第一个循环中引用这里,因为我们想避免数组到指针的转换.

如果这样做(错误情况:首先for循环不是参考),

for( auto row : arr)          // program won't compile
     for( auto col : row)
Run Code Online (Sandbox Code Playgroud)

在这里,我们有行*.当我们到达第二个for循环时.因为row现在是int*而不是列表,程序将无法编译.您必须创建一个列表,然后我们才能将它传递给ranged for循环并使用它来迭代该列表.

vector<int> list = { *(row+0) , *(row+1) , *(row+ 2) } ;
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用列表进行迭代

for ( ----- : list)
Run Code Online (Sandbox Code Playgroud)


Vla*_*cow 7

for ( auto &a : array )
{
   for ( int &x : a ) x = fill_value;
}
Run Code Online (Sandbox Code Playgroud)

编辑:您可以尝试以下

const size_t n = 2;
const size_t m = 3;

int a[n][m] = { { 1, 2, 3 }, { 4, 5, 6 } };

for ( auto &x : reinterpret_cast<int ( & )[n * m]>( a ) )  x = 10;
for ( auto x : reinterpret_cast<int ( & )[n * m]>( a ) )  std::cout << x << ' ';
std::cout << std::endl;;
Run Code Online (Sandbox Code Playgroud)

输出是

10 10 10 10 10 10 
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是您可以重新解释任何多维数组,而不仅仅是二维数组.例如

int a[n][m][k] = { /* some initializers */ };

for ( auto x : reinterpret_cast<int ( & )[sizeof( a ) / sizeof( ***a )]>( a ) )
{
    std::cout << x << ' ';
}
std::cout << std::endl;;
Run Code Online (Sandbox Code Playgroud)

  • *我不想要嵌套循环,除非保证编译器将它们展平.* - 对他正在使用的编译器有任何保证吗? (3认同)