簡體   English   中英

C++ 為向量制作 min 和 max 函數

[英]C++ making min and max function for vectors

我正在嘗試為雙精度向量開發最小和最大函數。 我正在使用迭代器遍歷向量以找到最小值和最大值。 我的代碼有效,但是,如果我嘗試返回的值位於列表的末尾,則該函數將不會返回它。 我在 ostream 運算符上使用了相同的 for 循環,並且運行良好,但是它不適用於這些函數。 我錯過了什么嗎?

double maximum() {
    double maximum;
    typedef vector<double>::const_iterator iter;
    for(iter i = this->get_data().begin(); i != this->get_data().end(); ++i) {
        if (*i > maximum) {
             maximum = *i;

        } else {
             return maximum;
        }
    }
}

旁注:get_data 函數是我在該方法所在的類中創建的函數,該函數返回雙精度向量

我首先要說的是,在生產代碼中,我將始終使用std::min_elementstd::max_element來避免實現中的問題,例如您面臨的問題。 不過,將此作為學習練習是個好主意! 您在這里遇到的問題是返回位置錯誤:

#include <limits>
double maximum() {
    double maximum = std::numeric_limits<double>::min();//This is important
    typedef vector<double>::const_iterator iter;
    for(iter i = this->get_data().begin(); i != this->get_data().end(); ++i) {
        if (*i > maximum) {
            maximum = *i; 
        } else {
            // the first time you get a number less than the
            // current maximum you are returning immediately!
            return maximum;
        }
    }
    //return maximum should be here
}

刪除整個 else 分支(這是不必要的)並在 for 循環檢查所有元素后將 return 移動到。 此外,您希望將最大值初始化為可以存儲在雙精度中的最小數字, numeric_limits在這里有幫助。 目前,您使用的是maximum而沒有先為其分配一個值,因此如果碰巧存儲在maximum的值大於您的元素,那么您將得到錯誤的結果。 不要讓這個偶然發生,總是初始化你的變量。

為此目的有明確定義的算法:-

std::min_element
std::max_element

您的代碼有誤。 刪除else子句並將return移到for循環之后。

double maximum() {
    double maximum; // need to initialize this as well
    typedef vector<double>::const_iterator iter;
    for (iter i = this->get_data().begin(); i != this->get_data().end(); ++i) {
        if (*i > maximum) {
             maximum = *i;
        }
    }
    return maximum;
}

您可以使用第一個元素作為初始值並假設vector非空。 如果你這樣做,你也可以在第二個元素開始循環。

否則,您還沒有定義空vector上的行為應該是什么。 您還可以將maximum初始化為負無窮大或MIN_DOUBLE並且不假設向量為空。 此值也等效於std::numeric_limits<double>::min()

每當您編寫循環時,最好考慮要維護的不變量。 在這種情況下,變體是i指向的向量的元素。 不變式是maximum包含向量的最大值。

一旦你大聲說出來,很明顯空向量必須作為特殊情況處理。 空向量的最大值是多少? 我不知道。 它是未定義的。 我們可以編造一個值,但應該記錄下來。 或者,這可能是一個錯誤。

一旦您決定如何處理這種情況,很明顯您必須處理所有元素才能知道最大值。 因此你不能提前退出循環。 這就是return錯誤的原因。

下一步是確定哪個元素最大。 這部分你大部分是對的。 *i大於maximum您有一個新的最大值元素。 因此,您需要有條件的檢查和分配。

對您編寫的每個循環進行這種類型的分析會為您節省許多錯誤。

  • 首先,您需要初始化最大變量。 一個好的值是向量的第一個元素。
  • 比 else 語句是不必要的,而且非常錯誤。 將其從 for 循環中刪除,並將返回移動到函數的末尾。 否則,它將返回不高於向量中前一個元素的第一個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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