Search code examples
c++segmentation-faultstdvectormedian

Computing median of std::vector<double> causing segfault


The following function is supposed to compute the median of a std::vector<double>.

double vecMed(vector<double>& vec) {

    vector<double> copyVec = vec;

    sort(copyVec.begin(), copyVec.end());

    if( copyVec.size()%2 == 0)
        return (copyVec[floor(static_cast<double>(copyVec.size())/2.0)] + copyVec[ceil(static_cast<double>(copyVec.size())/2.0)]) / 2.0;
    else
        return copyVec[copyVec.size()/2];
}

I'm getting a segfault on this line, sometimes:

return (copyVec[floor(static_cast<double>(copyVec.size())/2.0)] + copyVec[ceil(static_cast<double>(copyVec.size())/2.0)]) / 2.0;

Can anyone see a problem with this function?

The segfault might be due to memory corruption elsewhere that I'm unaware of, but I want to make sure I'm not making a subtle or careless mistake in the above code before I explore that possibility.


GDB says:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000428ab6 in vecMed (this=0x7fffffffd1b0, vec=...) at ../globals.cpp:834
834         return (copyVec[floor(static_cast<double>(copyVec.size())/2.0)] + copyVec[ceil(static_cast<double>(copyVec.size())/2.0)]) / 2.0;
(gdb) bt
#0  0x0000000000428ab6 in vecMed (this=0x7fffffffd1b0, vec=...) at ../globals.cpp:834

Solution

  • So much errors in the code! I guess you want:

    #include <algorithm>
    #include <vector>
    
    double vecMed(std::vector<double> vec) {
        if(vec.empty()) return 0;
        else {
            std::sort(vec.begin(), vec.end());
            if(vec.size() % 2 == 0)
                    return (vec[vec.size()/2 - 1] + vec[vec.size()/2]) / 2;
            else
                    return vec[vec.size()/2];
        }
    }