![](/img/trans.png)
[英]how to get min&Max values from vector<Mat> collection of 2D images opencv c++
[英]finding min&max element in an array (C++)
嘗試獲取數組中的最大/最小元素時,結果出現問題。 代碼是:
#include <iostream>
using namespace std;
int main(void){
int a, b, max, min;
cin >> a;
int arr [a] ;
max,min = arr[0];
for (int i; i < a; i++){
cin >> b;
arr[i]=b;
if (arr[i] > max) max = arr[i];
if (arr[i] < min) min = arr[i];
}
cout << min << " " << max ;
return 0;
}
輸入:5 20 30 40 50 60 輸出:0 60
我一直得到 '0' 作為最小元素的答案。 你能看到我的代碼有錯誤嗎?
最重要的是:請打開編譯器警告。 它顯示您的代碼中的錯誤:
:7:7: 警告:ISO C++ 禁止可變長度數組 'arr' [-Wvla]7 | int arr [a] ; | ^~~
int arr [a];
這聲明了一個 VLA(可變長度數組),因為a
不是編譯時常量。 VLA 不是標准 C++ 的一部分,它們是某些編譯器(最著名的是 gcc、clang)的擴展。
:8:3: 警告:逗號運算符的左操作數無效 [-Wunused-value]8 | max,min = arr[0]; | ^~~
這被解析為(max, min) = arr[0]
。 max, min
的逗號運算符計算每個操作數,運算符的結果是最后一個操作數,即max
被丟棄,只分配min
(不正確,見下文)
:8:11: 警告: '*[0]' 使用未初始化 [-Wuninitialized]8 | max,min = arr[0]; | ~~~~^~~~~~~~
arr
未初始化,因此arr[0]
未初始化。 您從未初始化的對象中讀取。 這是未定義行為的來源之一。
:9:12: 警告: 'i' 可能會在未初始化的情況下使用 [-Wmaybe-uninitialized]9 | for (int i; i < a; i++){ | ^
同樣,您從未初始化的變量i
讀取。
:18:25: 警告: 'max' 可能在此函數中未初始化使用 [-Wmaybe-uninitialized]18 | cout << min << " " << max ; | ^~~
由於上述原因,可以在此處初始化max
。
用標准 C++ 容器替換 VLA,例如std::vector
始終初始化您的變量。 一個好的經驗法則是在聲明變量時始終初始化它們並盡可能晚地聲明它們。
此外,還有一個標准算法可以找到范圍內的最小值和最大值: std::minmax
並始終使用編譯器警告(gcc/clang 上的-Wall -Wextra
,MSVC 上的/W3
)
通過將您的min
設置為arr[0]
,您將其設置為一個恰好為 0 的未定義值。您需要讀取您的第一個值集並將min
設置為該值,以防萬一沒有小於0 所以你不會意外地得到奇數值。
#include <iostream>
using namespace std;
int main(void){
int a, b, max, min;
cin >> a;
int arr[a];
// Initializing all values to the first value in the array
cin >> b;
min = max = arr[0] = b;
// Since we already filled out the value at index 0, we start i at 1
for (int i = 1; i < a; i++) {
cin >> b;
arr[i]=b;
if (arr[i] > max)
max = arr[i];
if (arr[i] < min)
min = arr[i];
}
cout << min << " " << max ;
return 0;
}
老實說,你甚至不需要一個數組,因為你在讀取它們時比較值。你可以像這樣實現它:
#include <iostream>
using namespace std;
int main(void){
int a, b, max, min;
cin >> a;
cin >> b;
min = max = b;
for (int i = 1; i < a; i++) {
cin >> b;
if (b > max)
max = b;
if (b < min)
min = b;
}
cout << min << " " << max ;
return 0;
}
當arr[0]
尚未初始化時,您正在使用arr[0]
初始化min
和max
。 您可以通過在使用它初始化min
和max
之前將第一個元素存儲在arr[0]
來修復它。
如果您進行適當的更改,您的代碼可能如下所示:
#include <iostream>
using namespace std;
int main(void){
int a, b, max, min;
cin >> a;
int arr [a] ;
cin >> arr[0];
max = min = arr[0];
for (int i=1; i < a; i++){
cin >> b;
arr[i]=b;
if (arr[i] > max) max = arr[i];
if (arr[i] < min) min = arr[i];
}
cout << min << " " << max ;
return 0;
}
這不是完美的代碼,但它會起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.