2013-09-25 84 views
-1

我爲一個sorted_vector頭文件中的向量.find提供了一個模板化函數,用於分配任務。我正在使用BOOST庫對不同的方法/構造函數等進行單元測試,以確保沒有錯誤並且在引入錯誤的情況下使代碼更加簡單。我只是有關於這兩個代碼塊之間的差異一個簡單的問題:這兩個代碼塊有什麼區別?

template <typename T> 
typename sorted_vector<T>::iterator sorted_vector<T>::find(value_type const& value) const { 
    auto front = beg_; 
    auto back = end_; 

     for(;;) { 
      auto p = (back - front)/2 + front; 
      if(p == end_) 
       return p; 
      else if(*p == value) 
       return p; 
      else if(*p > value) 
       back = p; 
      else 
       front = p + 1; 
     } 
} 

而且此塊:

template <typename T> 
typename sorted_vector<T>::iterator sorted_vector<T>::find(value_type const& value) const { 
    auto front = beg_; 
    auto back = end_; 

    for(;;) { 
     auto p = (back - front)/2 + front; 
     if(p == back) 
      return end_; 
     else if(*p == value) 
      return p; 
     else if(*p > value) 
      back = p; 
     else 
      front = p + 1; 
    } 
} 

我的問題是關於第一個if語句在無限的。在第一個代碼塊中,如果它無法找到值而不是結束,則每次它在迭代中都返回中間值?或者這兩個陳述的主要區別是什麼?

謝謝。

編輯的beg_和結束_他們被實例化這種方式:

private beg_; 
private end_; 

,這裏是它們是如何正常使用:

sorted_vector() : beg_(nullptr), end_(nullptr), cap_(nullptr) { } 
iterator begin() { return iterator(beg_); } 
iterator end() { return iterator(end_); } 
+1

第二個格式化好一點。 –

+0

您不能有一個名爲'private'的類型。 –

回答

6

那麼,看起來beg_end_是指定存儲的序列[beg_, end_)的開始和結束的類的成員變量。由於這些值永遠不會改變,所以代碼的第一個版本是不正確的:在二進制搜索期間,p的值將不可能等於end_(除了一組狹窄的特定情況,例如當密鑰大於任何存儲的值)。如果鍵不在數組中並且不大於數組中的最後一個值,我期望第一個版本會陷入無限循環。

同時,第二版本被正確實現(假設它沒有其他錯誤):它檢查p針對原始序列的當前子段[front, back)的端部,而不是抵靠原始的端部序列。

在任何情況下,都不可能完全分析此代碼,而不知道在那裏遵循了哪些約定。例如,什麼是end_? Is是數組最後一個元素的迭代器?或者它是數組的最後一個元素的迭代器?

+0

是的,beg_和end_都是私有變量。所以說我有一個從1-1000到1001的矢量矢量,我搜索一個值。什麼值會導致它不等於end_? beg_,end_還是中間?或者任何價值可能會導致問題? – Delete

+1

對,第一個只是越野車。考慮一個包含一個元素的數組,該元素等於0,搜索1的「值」。這將使'back'等於'front'並永遠循環。或者嘗試搜索-1的「值」;這將增加'前面'和解引用超過數組的末尾。 (當且僅當該值在數組中並且數組已被排序時,該代碼實際上才起作用。) – Nemo

+1

@Aaron G .:在數組中不存在的任何值,同時不會超過數組中的最大值數組應該導致無限循環,或者可能是未定義的行爲。例如,如果您在'{1,8,20}'數組中搜索'5',則第一個版本將無法正常工作。 – AnT

1

是有區別的。你對它正在做什麼完全正確,但請記住「back = p;」這一行。

會發生什麼是幾個循環後,後面很可能會變成一個更大的值。 (因爲如果p大於一個值,則返回設置爲p)

+0

我不明白'back'可以「更改爲更大的值」。 'p'被計算爲'front'和'back'之間的中點。所以,當我們做'back = p'時,我們總是將'back' * backwards *移動到*更小的*值。這是'back'可以改變的唯一的地方, – AnT

+0

這條線顯示p越來越大:auto p =(back - front)/ 2 + front; – Garrett

+0

大於什麼?這條線總是會產生比'back'更小的'p'。 – AnT