C++ vector 下标超出范围第 1201 行

标签 c++ vector range max subscript

我正在开发一个程序,它从用户那里获取成绩并返回最大值、最小值、平均值、中值和标准偏差。每当我尝试运行我的代码时,我总是遇到这个错误:

文件:c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector

线路:1201

表达式: vector 下标超出范围

有人可以告诉我我做错了什么吗?无论我做什么,我似乎都无法修复它。对使用 C++ 进行编码完全陌生,因此,如果您能深入解释,那将非常有帮助。

这是它在 vector 文件中引用的代码块:

#if _ITERATOR_DEBUG_LEVEL == 2
if (size() <= _Pos)
{   // report error
    _DEBUG_ERROR("vector subscript out of range");
    _SCL_SECURE_OUT_OF_RANGE;
}

具体指向这一行:

    _DEBUG_ERROR("vector subscript out of range");

我的代码:

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

void enterGrades()
{
    int count = 0;//initialize count
    int grade;//initialize grade variable
    int maxGrade = 0;
    vector<int> gradeList;//initialize vector
    vector<int>::iterator gradeListIt;//initialize iterator
    do {
        cout << "Enter grades [0 to exit]: ";//enter grades
        cin >> grade;//user input
        count += 1;//for each grade, increase count
        gradeList.push_back(grade);//append grades to vector    
    } while (grade != 0);
};

int maxNum(vector<int> gradeList)
{
    int largest = gradeList[0];//initialize largest number
    int length = gradeList.size();
    gradeList.resize(length);
    for (int value = 0; value < length; value++)//traverse vector
    {
        if (gradeList[value] > largest)//if current value > largest
            largest = gradeList[value];//set largest to that value
    }
    return largest;//return largest

};

int minNum(vector<int> gradeList)
{
    int smallest = gradeList[0];
    int length = gradeList.size();
    gradeList.resize(length);
    for (int value = 0; value < length; value++)
    {
        if (gradeList[value] < smallest)
            smallest = gradeList[value];
    }
    return smallest;
};

int avgNum(vector<int> gradeList)
{
    int total = 0;
    int length = gradeList.size();
    gradeList.resize(length);
    for (int value = 0; value < length; value++)
    {
        total += value;
    }
    return total / length;

};

//int stdDev (vector<int>& gradeList)
//{
//    int variance = 0;
//    int avg = avgNum(vector<int>& gradeList);
//    int length = gradeList.size();
//    for(int value = 1; value < length; value++)
//    {
//            variance = variance + pow(value - avg, 2);
//    }
//    variance = pow(variance / length, 0.5);
//    return variance;
//    
//};



int main()
{
    vector<int> gradeList;//initialize vector
    vector<int>::iterator gradeListIt;//initialize iterator
    enterGrades();//
    cout << "Maximum grade is: " << maxNum(gradeList) << endl;
    cout << "Minimum grade is: " << minNum(gradeList) << endl;
    cout << "Average grade is: " << avgNum(gradeList) << endl;

}

此外,在我的主要功能中;我可以像在输出语句中那样调用其他函数吗?

最佳答案

赋予事物相同的名称并不能使它们成为同一事物。

enterGrades 返回后,main 中名为“gradeList”的 vector 仍然是空的。
当您尝试访问空 vector 的第一个元素时,您会收到错误消息。

你的 main 应该是这样的:

int main()
{
    std::vector<int> gradeList = enterGrades();
    cout << "Maximum grade is: " << maxNum(gradeList) << endl;
    cout << "Minimum grade is: " << minNum(gradeList) << endl;
    cout << "Average grade is: " << avgNum(gradeList) << endl;
}

更改 enterGrades 的实现以适应留作练习。

还有,你一直在做的这件事:

int length = gradeList.size();
gradeList.resize(length);

没有意义,因为它正在将 vector 的大小调整到它已有的大小。
将其删除。

您还毫无理由地重复声明迭代器。

您可能还想查看应该计算的平均值,因为您计算的是 vector 中的平均值 index,而不是平均值。
并注意那些整数除法。

关于C++ vector 下标超出范围第 1201 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29510166/

相关文章:

c++ - C++中 union 中的 'protected'有什么意义

c++ - 是否存在运营商?

c++ - 如果给你一对迭代器,如何将元素复制到 Vector?

javascript - 如何通过 keydown 事件在插入符上插入元素?

c++ - 如何使用 CMake?

C++11 numeric_limits<float> 和算术

c++ - 在 vector 中插入一些值?

c++ - resize() 和 reserve() 有什么区别?

Pythonic 方式查找值在范围列表中的位置

javascript - 如何使用对象查找给定数字的范围