为什么VecMedian生成超出范围

Why does VecMedian generate out of range?

本文关键字:范围 VecMedian 为什么      更新时间:2023-10-16

目前,我正试图弄清楚为什么我用于计算HW数向量中值的辅助函数不能正确工作。假设我的辅助函数不仅仅处理一个向量。错误:

./a.out
terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check
AVG: 30Aborted

学生:

#ifndef STUDENT_H
#define STUDENT_H
#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Student
{
 public:
  Student(string tname);
  double getHWWeight();
  void setHWWeight(double arg);
  double getmidtermExamWeight();
  void setmidtermExamWeight(double arg);
  double getfinalExamWeight();
  void setfinalExamWeight(double arg);
  double getmidterm();
  void setmidterm(double arg);
  double getfinal();
  void setfinal(double arg);
  void addHW(double arg);
  void readHW(istream &i);
  double getHWAverage();
  double getHWMedian();

 private:
  string name;
  double midterm;
  double final;
  vector<double> HW;
  static double HWWeight;
  static double midtermExamWeight;
  static double finalExamWeight;
};
#endif

Student.cpp:

#include "Student.h"
#include <algorithm>
double Student::HWWeight = 60;
double Student::midtermExamWeight = 15;
double Student::finalExamWeight = 25;

template<typename T>
T VecAverage(vector<T> arg){
  typename vector<T>::iterator it;
  T temp=0;

  for(it=arg.begin(); it < arg.end(); it++)temp+=*it;
  temp/=arg.size();
  return temp;

}
template<typename T>
T VecMedian(vector<T> arg){
  int medians = arg.size()/2;
  medians+=1;
  sort(arg.begin(),arg.end() );
  return arg.at(medians);
}
Student::Student(string tname){
  name = tname;
}
double Student::getHWWeight(){
  return HWWeight;
}
void Student::setHWWeight(double arg){
  HWWeight = arg;
}
double Student::getmidtermExamWeight(){
  return midtermExamWeight;
}
void Student::setmidtermExamWeight(double arg){
  midtermExamWeight = arg;
}
double Student::getfinalExamWeight(){
  return finalExamWeight;
}
void Student::setfinalExamWeight(double arg){
  finalExamWeight = arg;
}
double Student::getmidterm(){
  return midterm;
}
void Student::setmidterm(double arg){
  midterm = arg;
}
double Student::getfinal(){
  return final;
}
void Student::setfinal(double arg){
  final = arg;
}
void Student::addHW(double arg){
  HW.push_back(arg);
}

void Student::readHW(istream &i){
  int x;
  i >> x ;
  while(x >= 0){
    HW.push_back(x);
    i >> x;
  }
}
double Student::getHWAverage(){
  return VecAverage(HW);
}
double Student::getHWMedian(){
  return VecMedian(HW);
}

谢谢。

考虑中值函数

 T VecMedian(vector<T> arg){
  int medians = arg.size()/2;
  medians+=1;
  sort(arg.begin(),arg.end() );
  return arg.at(medians);
}

如果输入arg大小为2。。您只能访问arg[0]和arg[1];

您的medians将是2,因此超出范围

template<typename T>
T VecMedian(vector<T> arg){
  int medians = arg.size()/2;
  medians+=1;
  sort(arg.begin(),arg.end() );
  return arg.at(medians);
}

假设你有一个空向量。medians将是0 + 1,并且您将尝试访问空向量的索引1

添加类似的检查

if( medians < arg.size() )
//..

例如,尺寸2也会发生同样的情况。

return arg.at(medians);

medians成为std::vector的无效索引时,最有可能在这行代码中引发异常。您可以在gdb中捕获此异常。加载您的程序并为类似(gdb) catch throw的异常设置捕获点。这将有助于进一步调试问题。