使用C ++中的自定义排序运算符进行分段错误

时间:2017-08-03 19:09:46

标签: c++ c++11

以下代码,从文件中读取输入。 文件中的每一行都包含一对整数和一对。

读取值后,会将其存储到名为^2.6

struct
PNode

数据结构#include <iostream> #include <fstream> #include <algorithm> #include <vector> struct PNode { int xi; int ri; double H; bool operator<(const PNode& rhs) const { if (ri > rhs.ri) return true; if (H < rhs.H) return true; return false; } }; int main(int argc, char* argv[]) { if (argc != 2) { std::cout << "usage: " << argv[0] << " input" << std::endl; return -1; } std::vector<PNode> v; std::ifstream f(argv[1]); int xi = -1; int ri = -1; double H = -1; while(f >> xi >> ri >> H) v.push_back(PNode{xi, ri, H}); for (auto& x : v) std::cout << x.xi << "\t" << x.ri << "\t" << x.H << std::endl; std::sort(v.begin(), v.end()); for (auto& x : v) std::cout << x.xi << "\t" << x.ri << "\t" << x.H << std::endl; return 0; } 已内部定义PNode,用于对operator<进行排序。

但是,在某些输入上,代码会发出分段错误。

PNode

Failing input

0 2 12 1 3 210.618 2 4 57.8743 3 4 155.022 4 2 8 5 4 0 6 3 90.8939 7 4 2 8 5 96.3038 9 3 95.268 10 4 650.056 11 2 32.2647 12 3 30.7549 13 2 29.2451 14 4 0 15 2 0 16 5 191.284 17 4 234.158 18 2 115.349 19 4 348.659 20 3 0 21 2 283.372 22 4 8 23 4 328.962 24 2 46.2444 25 4 2 26 3 142.561

Working input

使用以下标志编译代码:

0 2 29.7149
1 2 441.595
2 2 25.2916
3 2 1149.05
4 2 364.557

执行时:

g++ -g3 -std=c++11 test.cpp 

valgrind --leak-check=full ./a.out IN 报告的前几行错误:

valgrind

2 个答案:

答案 0 :(得分:3)

我同意@Slava的评论。

我建议对该功能进行一些改进。

bool operator<(const PNode& rhs) const {
    if (ri != rhs.ri)
    {
       return (ri > rhs.ri);
    }
    return (H < rhs.H);
}   

答案 1 :(得分:2)

您的PNode::operator<不符合strict weak ordering要求。

可能的解决方法:

bool operator<(const PNode& rhs) const {
    if (ri > rhs.ri) return true;
    if (ri < rhs.ri) return false;

    return H < rhs.H;
}