2011-11-21 83 views
0

目前我想弄清楚为什么我的帮助函数用于计算硬件编号向量的中位数不能正常工作。我的帮助函数假设不仅仅是一个向量。 错误:为什么VecMedian产生超出范围?

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

Student.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 

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); 

} 

谢谢。

回答

0

考虑您的中位数功能

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

} 

如果输入ARG尺寸为 ..你只能访问ARG [0]和Arg [1];

medians将和因此超出范围

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,例如。

0
return arg.at(medians); 

最有可能的异常被抛出在这行代码,当medians无效指数std::vector。你可以在gdb中捕获这个异常。加载你的程序,并设置像这样的异常的catchpoint (gdb) catch throw。这将有助于进一步调试该问题。