我们获得了一个二维数组A[n,m]
,其中n
行和m
列以及随机R
选择的该数组的元素。
将数组视为循环,当我们访问A[n-1, m-1]
时,我们访问的下一个元素将是A[0, 0]
。
从元素R
开始,我们想要访问每个元素一次,并在移动到下一个元素之前调用函数foo()
。
以下是我的第一个实现,但有一个错误。如果我们从x
和0
之间的某个行n-1
开始,我们就不会访问该列中0
到x-1
的元素。< / p>
// Init - pretend rand() always returns valid index in range
curr_row = rand();
curr_col = rand();
// Look at each column once
for (int i = 0; i < m; ++i)
{
for (; curr_row < n; ++curr_row)
{
foo(A[curr_row][curr_col]);
}
curr_row = 0;
curr_col = (curr_col + 1) % m;
}
进行此遍历的干净方法是什么,以便我们满足上述要求?
答案 0 :(得分:1)
// Init - pretend rand() always returns valid index in range
curr_row = rand();
curr_col = rand();
//first row
for(int j=curr_col;j<m;++j)
foo(A[curr_row][j]);
//rest of the rows
for(int i=(curr_row+1)%n;i!=curr_row;i=(i+1)%n)
for(int j=0;j<m;++j)
foo(A[i][j]);
//first row , going over missed cells
for(int j=0;j<curr_col;++j)
foo(A[curr_row][j]);
如果你非常关心性能,你也可以划分第二个循环,这样根本就不会有“%”。
另一种选择,因为C在一个简单数组中有2d数组:
// Init - pretend rand() always returns valid index in range
curr_row = rand();
curr_col = rand();
int start=curr_row*m+curr_col;
int maxCell=n*m;
int end=(start-1)%maxCell;
for(int i=start;i!=end;i=(i+1)%maxCell)
foo(A[i]);
foo(A[end]);
可能会有一个微小的数学错误,但这个想法没问题。
答案 1 :(得分:1)
转到下一个索引,检查一下你是否回来了,在这种情况下,停止:
// should be something that guarantees in-range indices
curr_row = rand();
curr_col = rand();
int i = curr_row, j = curr_col;
do {
foo(A[i][j]);
++j;
if (j == n) {
j = 0;
++i;
if (i == m) {
i = 0;
}
}
}while(i != curr_row || j != curr_col);
这不是你的实现所做的,而是标题要求的内容。
答案 2 :(得分:-1)
A[curr_row, curr_col]
不用于访问多维数组成员的语法;相反,你想要A[curr_row][curr_col]
,假设数组被正确声明。 A[curr_row, curr_col]
将调用逗号运算符,它有效地计算第一个值,然后将其抛出并计算第二个值,然后使用该值索引数组。