for循环中的两个索引增量

时间:2016-04-03 18:12:46

标签: c++ for-loop time-complexity

在阅读循环分析的文本时,我遇到了以下线性搜索例程,以返回数组中的最大值:

template <class otype>
int location_of_max (const otype a[], int first, int last)
{
    int max_loc = first; 
    for (++first; first <= last; ++first) {
        if (a[first] > a[max_loc]) {
            max_loc = first;
        }
    }

   return max_loc;
}

在相同的循环条件下有两个增量++first有点令人困惑。是否有一个原因?

3 个答案:

答案 0 :(得分:6)

代码比较每个循环上的两个元素。

初始循环声明语句将“start”迭代器推进到第二个数组位置,因为“reference”元素(a[max_loc])作为第一个元素开始生命。

这避免了一个不必要的和毫无意义的比较(即a[max_loc] > a[max_loc])。

答案 1 :(得分:2)

看看它在做什么。

  1. 将max_loc初始化为第一个索引。
  2. for循环的格式是(init; condition; increment)。

    此时无需检查[first]&gt; a [max_loc]因为first == max_loc,所以作为init的一部分首先预先递增到下一个索引。此步骤仅执行一次。第二个增量发生在循环的每次迭代中。

答案 2 :(得分:-3)

for 语句中的第一个子句只是一个起始值,在块执行之前只执行一次。

第三个子句在每个块迭代结束时执行,并且在条件 - 第二个子句 - 被评估之前执行。