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交叉编译器)
作为示例,有多种方式来打印和操纵多维数组的值.
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)
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)