【发布时间】:2025-11-22 21:55:02
【问题描述】:
我正在开发一个程序,该程序接收用户的分数并返回最大值、最小值、平均值、中值和标准差。每当我尝试运行我的代码时,我都会遇到此错误:
文件:c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector
线路:1201
表达式:向量下标超出范围
谁能告诉我我做错了什么?无论我做什么,我似乎都无法修复它。完全是 C++ 编码的新手,所以如果你能深入解释一下,那将非常有帮助。
这是它在矢量文件中引用的代码块:
#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;
}
另外,在我的主要功能中;我可以像在输出语句中那样调用其他函数吗?
【问题讨论】:
-
你使用了很多不同的
vectors。你读到的那个不是你检查min/max/avg的那个。这里有很多问题,这个问题太多了。建议您选择good book。 -
我记得这个错误(当我学习使用迭代器时)。然后我查看了你的代码,发现比这个错误更多的问题。无论哪种方式,当您有一个向量的迭代器,但它们未设置为向量内的任何有效位置时,都会发生此错误(对于该特定向量,它们“超出范围”)。
-
您的代码的其他问题:您实例化迭代器而不将它们设置到某个位置,并且没有在代码中使用它们(您也可以删除声明);当您应该通过引用或 const 引用传递向量时,您按值传递向量;您将零等级附加到矢量(这将搞砸最低和平均等级);从您的 cmets 中,您将变量声明与初始化混淆了。
-
找不到超出范围,但我有一些评论:为什么要调整向量的大小(到当前大小)?不要那样做。您正在调用索引“值”。我觉得这很令人困惑。
value = array[index]在我看来更自然。您找到了报告错误的行。但是,您挖得太深了。您必须找出代码中的哪一行导致了问题。您正在声明一些迭代器,但是(与代码中的 cmets 相比)您没有初始化它们(而且您也根本不使用它们)。 -
...最后但并非最不重要的一点是,无需编写自己的函数来获取最小/最大/平均值,但如果您使用 stl 算法(例如查找 std: :max_element)。
标签: c++ vector range max subscript