C ++ две приоритетные сортировки с мультимножеством

Я пытаюсь получить сортировку объектов класса по двум его членам таким образом: сортировка по член. Если два объекта имеют одинаковое значение (или если разница ниже некоторого порога), то ищите по члену б. Я использую мультисет с этим.

проблема то, что когда приходит другой объект, проверяется в соответствии с классом сортировки и выполняет возврат 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;
}

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;
};

Кроме того, вы создали эту проблему с порогом. Просто уменьшите порог до значения, близкого к нулю, и проблема исчезнет, ​​иначе вам придется с этим смириться. Я не вижу другого пути.

2

Другие решения

К сожалению, пороги не работают хорошо с заказанными контейнерами 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 и вы не можете его использовать.

0

По вопросам рекламы [email protected]