计算std :: vector <double>的中位数导致段错误

syn*_*tik 2 c++ segmentation-fault median stdvector

以下函数应该计算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];
}
Run Code Online (Sandbox Code Playgroud)

我在这条线上遇到了一个段错误,有时候:

return (copyVec[floor(static_cast<double>(copyVec.size())/2.0)] + copyVec[ceil(static_cast<double>(copyVec.size())/2.0)]) / 2.0;
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到这个功能的问题?

段错误可能是由于我不知道的其他地方的内存损坏,但我想确保在我探索这种可能性之前,我没有在上面的代码中做出一个微妙或粗心的错误.


GDB说:

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
Run Code Online (Sandbox Code Playgroud)

小智 8

代码中有这么多错误!我想你想要:

#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];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您不必对向量进行排序即可获得中值。这效率不高。 (2认同)