2015-11-28 47 views
-1

所以我不得不寫入n個實數的矢量,然後打印最大的。C++矢量下標超出範圍線1201

#include <iostream> 
#include <vector> 
using namespace std; 

void printMax(vector<double>); 

int main() 
{ 
    vector<double> vct; 
    double n; 

    while(cin >> n) 
     vct.push_back(n); 

    printMax(vct); 
    return 0; 
} 

void printMax(vector<double> x) 
{ 
    int max; 

    for(int i = 1; i < x.size(); i++) 
    { 
     if(x[i] > x[i - 1]) max = x[i]; 
     else continue; 
    } 

    cout << "Max = \t" << max << endl; 
} 

當我啓動該程序它讓我輸入數字,但只要我按ctrl + z和進入崩潰,並說:矢量標超出範圍線:1201我認爲一個問題是與無效printMax部分。

+0

它代表別的東西:) @LightnessRacesinOrbit –

回答

4

你必須與i = 1啓動以下循環:

for (int i = 1; i < x.size(); i++){ 
    if (x[i] > x[i - 1]) 
     max = x[i]; 
    // else continue superfluous 
} 

因爲如果i0i - 1將是負面的一個(或unsigned int最大的價值存在)。在這種情況下,這可能不是一個有效的索引。

此外,爲什麼你使用int所說的實數?

其實,有一個簡單的方法來找到一個向量的最大元素。它不涉及兩個連續元素的比較,而是比較當前的每個元素max。改進你的算法,或者使用std::max_element

當我寫提高,我其實是正確它。

+0

您的代碼建議允許在某些情況下未初始化時讀取「max」;也不是找到最大值的正確邏輯 –

+0

如果我可以問,在什麼情況下?而...這不是'std :: set'。 – LogicStuff

+0

如果'x [i]> x [i-1]'從不是真的,那麼'max'永遠不會設置在循環中。我不是在談論'std :: set'。 「設置」是指我們試圖找到最大值的值。 –

3

for循環中,當i = 0正在訪問x[i - 1](即x[-1])時。

你可能想改變

int max = x[0]; 
for (int i = 1; i < x.size(); i++){ 
    if(x[i] > max) max = x[i]; // Compare with actual max 
+0

omg,我們幾乎寫了完全相同的答案;) –

3

在第一輪你的for循環x=0並使用x[i - 1]即。 x[-1]

1

如果你的第一個索引是0,那麼行x[i] > x[i - 1]變成x[0] > x[-1],並且x[-1]總是出來如果是邊界。改變你的循環從int i = 1開始,它應該可以解決你的問題。