我试图以这样的方式根据其两个成员获取类对象的排序:根据 a 成员排序。如果两个对象具有相同的值(或者差异低于某个阈值),则根据成员 b 进行搜索。我正在使用multiset。
问题是,当另一个对象出现时,根据排序类进行检查,并且履行返回true(要比被比较的对象高),它也可能满足另一个高出一步。我怎么能在这里介绍它应该检查尽可能多的先前对象,并尽可能高? (获得排序很好的多重集!) 下面是我编写排序类的方法。请给我一些好主意!
我在为这部分代码引入缩进时遇到问题,有人可以帮我编辑吗?这是不可读的。
std::multiset<classA , classA ::SortClass> mydata;
class SortClass
{
public:
bool operator() (const classA &pt1, const classA &pt2)
{
if(pt1.a < pt2.a)
{
if(abs(pt1.a-pt2.a) < 0.01)
{
if(pt1.b > pt2.b)
return true;
else
return false;
}
else
return true;
}
else
return false;
}
};
编辑:
粘贴这个,看看我想要什么,不能实现。我希望它按m_a排序增加,如果m_a相同则减少m_b(你可以设置相等或不等,也不起作用)
#include <iostream>
#include <set>
using namespace std;
class classA
{
protected:
double m_b;
double m_a;
public:
double get_b() {return m_b;}
double get_a() {return m_a;}
void set_b(double b) {m_b = b;}
void set_a(double a) {m_a = a;}
class SortClass
{
public:
bool operator() (const classA &pt1, const classA &pt2)
{
if(pt1.m_a < pt2.m_a)
{
if(pt2.m_a - pt1.m_a == 0)
return (pt1.m_b > pt2.m_b);
else
return (pt1.m_a < pt2.m_a);
}
else
return false;
}
};
};
int main()
{
std::multiset<classA, classA::SortClass> mydata;
classA objA;
for(int i=0; i<100;i++)
{
objA.set_a(rand() %100);
objA.set_b(rand() %10);
mydata.insert(objA);
}
return 0;
}
答案 0 :(得分:2)
让我们停止使用true
,false
和return
bool
表达式。它使您的代码更容易阅读。
bool sortClassA (const classA &pt1, const classA &pt2)
{
if(pt2.m_a == pt1.m_a) {
return pt1.m_b > pt2.m_b;
}
return pt1.m_a > pt2.m_a;
};
此外,您创建了此阈值的问题。简单地将阈值降低到接近零的水平,问题就会消失,否则你将不得不忍受它。我没有看到任何其他方式。
答案 1 :(得分:0)
不幸的是,阈值对STL订购的容器不起作用。排序标准的必要条件是它定义了严格的弱排序;这意味着,除其他事项外,如果a == b
和b == c
,则a == b
(==
表示等效;这是既不大也不小于,不一定相等)。
我们可能有pt1.a = 0.004
,pt2.a = 0.01
和pt3.a = 0.016
;根据您的标准,pt1.a == pt2.a
和pt2.a == pt3.a
,但pt1.a =\= pt3.a
。您的订购标准不符合std::multiset
的先决条件,您无法使用它。