[英]What is the difference between these two code blocks?
我在分配給我的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;
}
}
我的問題是關於無限for中的第一個if語句。 在第一個代碼塊中,如果找不到值而不是結尾,則每次迭代向量時都返回中間值嗎? 還是兩個if語句之間的主要區別是什么?
謝謝。
編輯beg_和end_,它們是通過以下方式實例化的:
private beg_;
private end_;
以下是它們的正常使用方式:
sorted_vector() : beg_(nullptr), end_(nullptr), cap_(nullptr) { }
iterator begin() { return iterator( beg_ ); }
iterator end() { return iterator( end_ ); }
好吧,看來beg_
和end_
是類的成員變量,它們指定存儲序列[beg_, end_)
的開始和結束。 由於這些值永遠不會改變,因此代碼的第一個版本完全不正確:在二進制搜索過程中, p
的值將沒有機會等於end_
(除了end_
特定情況,例如鍵大於任何存儲的值)。 如果鍵不存在於數組中並且不大於數組中的最后一個值,我希望第一個版本陷入無限循環。
同時,第二版本被實現正確(假定它有沒有其他錯誤):它檢查p
針對當前子段的末尾[front, back)
原始序列的,不與原始序列的末尾。
無論如何,在不知道那里遵循什么約定的情況下,不可能完全分析該代碼。 例如, end_
是什么? 是數組最后一個元素的迭代器嗎? 還是迭代器用於數組的倒數第二個元素?
它們是有區別的。 您完全知道它在做什么,但請記住“ back = p;”行。
將會發生一些循環,返回很可能會更改為更大的值。 (因為如果p大於一個值,則將back設置為p)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.