2

このような方法で、2 つのメンバーに従ってクラス オブジェクトの並べ替えを取得しようとしています: メンバーに従って並べ替えます2 つのオブジェクトの値が同じ場合 (または差がしきい値を下回っている場合) は、メンバーbに従って検索します。私はそれでマルチセットを使用しています。

問題は、別のオブジェクトが来て、並べ替えクラスに従ってチェックされ、満たすと true を返す (比較対象のオブジェクトよりも上位に配置される) 場合、別のオブジェクトが 1 段階上にあることで満たされる可能性があることです。ここで、できるだけ多くの以前のオブジェクトをチェックし、可能な限り高くする必要があることをどのように紹介できますか? (非常によくソートされたマルチセットを取得するために!) ソート クラスの書き方を以下に示します。素敵なアイデアを教えてください!

そして、コードのこの部分にインデントを導入するのに問題がありました。編集を手伝ってくれる人はいますか? それは読めません。

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および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;
    };

また、しきい値に関するこの問題を作成しました。しきい値をゼロに近づけるだけで問題は解決します。他に方法はありません。

于 2013-01-28T16:34:24.087 に答える
0

残念ながら、しきい値は STL で順序付けされたコンテナーではうまく機能しません。順序付け基準の要件は、厳密な弱い順序付けを定義することです。これは、とりわけ、 ifa == bおよびb == c、 then 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使用できません。

于 2013-01-28T16:34:12.010 に答える