以下代码,从文件中读取输入。 文件中的每一行都包含一对整数和一对。
读取值后,会将其存储到名为^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
答案 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;
}