0

目前我正试图弄清楚为什么我用于计算硬件数字向量中位数的辅助函数无法正常工作。我的辅助函数应该不仅仅是一个向量。错误:

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

学生.h:

#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

学生.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);

}

谢谢你。

4

3 回答 3

0

考虑你的中值函数

 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因此超出范围

于 2011-11-21T07:30:09.777 回答
0
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 也会发生同样的情况。

于 2011-11-21T07:30:50.333 回答
0
return arg.at(medians);

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

于 2011-11-21T07:44:59.837 回答