[英]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_element
和std::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
您有一個新的最大值元素。 因此,您需要有條件的檢查和分配。
對您編寫的每個循環進行這種類型的分析會為您節省許多錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.