Я пытаюсь получить сортировку объектов класса по двум его членам таким образом: сортировка по член. Если два объекта имеют одинаковое значение (или если разница ниже некоторого порога), то ищите по члену б. Я использую мультисет с этим.
проблема то, что когда приходит другой объект, проверяется в соответствии с классом сортировки и выполняет возврат 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_b, если m_a одинаковы (вы можете поместить туда равенство или неравенство, тоже не работает)
#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;
}
Давайте прекратим использовать 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;
};
Кроме того, вы создали эту проблему с порогом. Просто уменьшите порог до значения, близкого к нулю, и проблема исчезнет, иначе вам придется с этим смириться. Я не вижу другого пути.
К сожалению, пороги не работают хорошо с заказанными контейнерами 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
и вы не можете его использовать.