2016-04-03 26 views
2

在閱讀上循環分析一文中,我碰到下面的線性搜索例程來在數組中返回最大值:兩個指標增量環

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在相同的循環條件有點混亂。是否有一個原因?

+1

downvote也困惑我。 – wally

+3

乍一看,我幾乎低估了這一點,作爲一個「好吧,你爲什麼不問那個寫它的人?蠢事。但是它是可以回答的,所以... –

回答

6

該代碼比較每個循環中的兩個元素。

由於「引用」元素(a[max_loc])以第一個元素開始,所以初始循環聲明語句將「start」迭代器前進到第二個數組位置。

這可以避免一個不必要和無意義的比較(即a[max_loc] > a[max_loc])。

-3

對於語句,中的第一個子句只是一個起始值,在塊執行前僅執行一次。

第三個子句在每個塊迭代結束時執行,並且在條件 - 第二個子句被評估之前執行。

+4

OP要求_why_初始化語句是這樣寫的。不是'for'循環做什麼。 –

2

看看它在做什麼。

  1. 將max_loc初始化爲第一個索引。

for循環的格式是(init; condition; increment)。

此時,不需要檢查[first]> a [max_loc]是否因爲first == max_loc,因此作爲init的一部分,首先會預先遞增到下一個索引。此步驟僅執行一次。第二次增量發生在循環的每次迭代中。