C ++向量下标超出范围行1201

时间:2015-11-28 23:20:23

标签: c++ loops vector

所以我必须在矢量中写入n个实数,然后从中打印出最大的数字。

#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。我认为问题是与void {{ 1}}部分。

4 个答案:

答案 0 :(得分: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

当我写改善时,我的意思是正确

答案 1 :(得分:3)

for循环中,当您访问i = 0x[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

答案 2 :(得分:3)

在你的for循环x=0的第一轮中

,你使用x[i - 1]即。 x[-1]

答案 3 :(得分:1)

如果您的第一个索引为0,则行x[i] > x[i - 1]变为x[0] > x[-1],并且x[-1]在绑定时始终为out。将您的循环更改为从int i = 1开始,它应该可以解决您的问题。