2015-11-28 50 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开始,它应该可以解决你的问题。