2

我试图以这样的方式根据其两个成员对类对象进行排序:根据成员排序。如果两个对象具有相同的值(或者如果差异低于某个阈值),则根据成员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;
    }
4

2 回答 2

2

让我们停止使用,truefalse表达式。它使您的代码更易于阅读。returnbool

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

此外,您创建了阈值问题。简单地将阈值降低到接近于零的值,问题就会消失,否则你将不得不忍受它。我没有看到任何其他方式。

于 2013-01-28T16:34:24.087 回答
0

不幸的是,阈值不适用于 STL 有序容器。排序标准的一个必要条件是它定义了严格的弱排序;这意味着,除其他外,如果a == bb == c,则a == b==这里的意思是等价的;这既不大于也不小于,不一定相等)。

我们可能有pt1.a = 0.004,pt2.a = 0.01pt3.a = 0.016; 根据您的标准,pt1.a == pt2.a并且pt2.a == pt3.a,但是pt1.a =\= pt3.a。您的订购标准不满足先决条件std::multiset,您不能使用它。

于 2013-01-28T16:34:12.010 回答