2

遍历数组时,如何将当前元素与前一个元素进行比较?这很容易,除了需要注意的是第一个元素没有前一个元素。是最好的解决方案

for(i = 0; i < arrLen; i++)
{
  arr[i] = process(i, someArg);
  if(i > 0) 
   someFunc(arr[i], arr[i-1]);
}

这是需要对数组的每个元素执行的另一个比较,这似乎很浪费。

抱歉,我忘了说正在同时填充数组。所以从 1 开始循环意味着第一个元素是空的。

4

5 回答 5

4

只需从 1 开始循环:

for (int i = 1; i < arrLen; i++)
   someFunc(arr[i], arr[i-1]);

编辑:鉴于您的新循环,我认为您的代码还可以。您的优化器可能会处理得很好。如果您真的很担心,只需在循环外执行第一个分配:

arr[0] = process(0, someArg);
for(i = 1; i < arrLen; i++)
{
    arr[i] = process(i, someArg);
    someFunc(arr[i], arr[i-1]);
}
于 2013-10-10T17:58:03.920 回答
1

如果您要这样做,只需从 1 开始计数器。

for (int i = 1 ...)

如果您以另一种方式进行操作,则使用i+1, 尽快结束计数器 1

for (int i = 1; i < arrLen -1 ; ++i)
于 2013-10-10T17:58:23.017 回答
1

我想你有for实际的代码

for( int i = 1; i < arrLen; i++)
   someFunc(arr[i], arr[i-1]);

或者

 for( int i = 0; i < arrLen -1; i++)
       someFunc(arr[i], arr[i+1]);
于 2013-10-10T17:59:18.647 回答
0

从 1 而不是 0 开始你的循环,那么你将永远有一个 i-1

for(i = 1; i < arrLen; i++)
    someFunc(arr[i], arr[i-1])

编辑:

鉴于您的新信息,我会说只需将其保留在 if 语句中即可。我认为没有特别好的方法。你可以在循环之外初始化一个 prevVal 变量,但我认为你不会真的比你拥有的 if i > 0 语句获得很多。

于 2013-10-10T17:59:15.917 回答
0

您只需要从 0 而是从 1 开始迭代。这是因为0-1=-1(非法数组索引)

for (int i = 1; i < arrLen; i++)
   someFunc(arr[i], arr[i-1]);

第零个元素的分配应该在循环之前完成:

arr[0] = process(0, someArg);
for(i = 1; i < arrLen; i++)
{
    arr[i] = process(i, someArg);
    someFunc(arr[i], arr[i-1]);
}

而且您可能需要检查是否需要分配第零个元素,因此代码应该是:

if (arrLen)
{
    arr[0] = process(0, someArg);
    for(i = 1; i < arrLen; i++)
    {
        arr[i] = process(i, someArg);
        someFunc(arr[i], arr[i-1]);
    }
}

注意:这样你就不需要使用if条件,因为i总是积极的。

于 2013-10-10T18:22:34.383 回答