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

C++ Vector subscript out of range line 1201

本文关键字:范围 1201 下标 C++      更新时间:2023-10-16

所以我不得不将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并输入,它就会崩溃,并说:vector subscript超出范围行:1201。我认为一个问题是无效的printMax部分。

您必须使用i = 1:启动以下循环

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

因为如果i0,则i - 1将是负1(或者unsigned int的最大值)。在这种情况下,这可能不是一个有效的索引。

另外,为什么要用int来表示上述实数?

事实上,有一种更简单的方法可以找到向量的最大元素。它不涉及两个连续元件的比较,而是当前max与每个元件的比较。改进您的算法,或者使用std::max_element

当我写改进时,我的意思实际上是纠正

在for循环x=0的第一轮中使用x[i - 1],即x[-1]

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,则线x[i] > x[i - 1]变为x[0] > x[-1],并且x[-1]始终超出If边界。将循环更改为从int i = 1开始,它将解决您的问题。