簡體   English   中英

這兩個代碼塊有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM