这些陈述
tab[n][m]=j+i;
swap(tab[n][1],tab[n][0]);
cout<<"{"<<tab[n][m]<<"}"<<" ";
调用未定义的行为,因为存在数组之外的内存访问,因为例如,如果数组具有 n 行或列,则行或列的有效索引范围为 [0, n)。
要交换二维数组的两列,只需编写一个循环即可。
您可以编写一个通用函数来交换整数数组中任意两个指定的列。
你来了。
#include <iostream>
#include <iomanip>
#include <utility>
template <size_t M, size_t N>
void swapp( int ( &a )[M][N], size_t col1, size_t col2 )
{
if ( col1 < N && col2 < N && col1 != col2 )
{
for ( size_t i = 0; i < M; i++ )
{
std::swap( a[i][col1], a[i][col2] );
}
}
}
int main()
{
const size_t M = 3, N = 4;
int a[M][N] =
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
for ( const auto &row : a )
{
for ( const auto &item : row )
{
std::cout << std::setw( 2 ) << item << ' ';
}
std::cout << '\n';
}
std::cout << '\n';
swapp( a, 0, 1 );
for ( const auto &row : a )
{
for ( const auto &item : row )
{
std::cout << std::setw( 2 ) << item << ' ';
}
std::cout << '\n';
}
std::cout << '\n';
return 0;
}
程序输出是
1 2 3 4
5 6 7 8
9 10 11 12
2 1 3 4
6 5 7 8
10 9 11 12