1

クラスcl1があります。

class c1
{
long double * coords;
...
}

私は2番目のクラスcl2も持っています:

class cl2
{
vector<cl1*> cl1_vec;
unsigned int d;
...
}

ベクトルの並べ替え関数を使用して、coords[d]に基づいてcl2からcl1_vecを並べ替えたいと思います。だから私は次のようなものを持つことができます

sort(cl2_inst->cl1_vec.begin(),cl2_inst->cl1_vec.end(), ??? );

私は次のようなアプローチを試しました

クラスを含む'std::vector'をソートします

クラスの述語関数を使用したC++std :: sort

しかし、私はこれを解決する方法を作ることができませんでした。

このように来るどんな助けにも感謝します。

私が試したコード:

class cl1 {
    public:
        long double* coords;

        cl1(long double *, unsigned int);
        cl1();
        cl1(const cl1& orig);
        virtual ~cl1();        
};

class cl2 {

    public:

    unsigned int d;

    vector<cl1*> cl1_vec;

    //the srting functions
    static bool compareMyDataPredicate(cl1* lhs, cl1* rhs)
    {
        return (lhs->coords[d] < rhs->coords[d]);
    };
    // declare the functor nested within MyData.
    struct compareMyDataFunctor : public binary_function<my_point*, my_point*, bool>
    {
        bool operator()( cl1* lhs, cl1* rhs)
        {
            return (lhs->coords[d] < rhs->coords[d]);
        }
    };
    ...
    ...
}

その後、メインで

    std::sort(cl2_inst->cl1_vec.begin(),cl2_inst->cl1_vec.end(),cl2::compareMyDataPredicate() );
4

2 に答える 2

1

dエラーは、コンパレータ関数の静的コンテキストから非静的メンバーにアクセスしているためです。次のように、2番目のアプローチを使用します。

  • その構造体にコンストラクターを提供します。コンストラクターはパラメーターを受け取り、unsigned intメンバーをその値に設定します。
  • タイプのオブジェクトを作成compareMyDataFunctorし、の値をdコンストラクターに渡します。
  • このオブジェクトを並べ替えに使用します(std :: sortの3番目の引数)
于 2012-06-17T13:03:31.833 に答える
0

あなたの場合、正確に「機能しない」とはどういう意味か(コンパイルしない、コンパイルするがソートしないなど)について十分に正確ではなかったため、問題についてはよくわかりません。コンパイルされない場合(おそらく推測)、エラーメッセージを投稿しなかったため、問題の発見と説明が非常に困難になります。

投稿したコードに基づいた推測は次のとおりです。

静的関数とファンクターの両方がメンバーを使用して、dソートする列を決定します。ただしd、これはインスタンス変数であるため、静的なものには使用できません。インスタンスごとdに1つあるため、ファンクターも静的メンバー関数も、どちらを使用できるかを認識しません。d

C ++ 11機能(lamdas)に頼らずにこれを行う最良の方法は、d使用する予定のファンクターにコンストラクターを提供することです。このようなもの:

struct compareMyDataFunctor : public binary_function<cl1*, cl1*, bool>
{
    compareMyDataFunctor( unsigned int d ) : d( d ) {}
    bool operator()( cl1* lhs, cl1* rhs)
    {
        return (lhs->coords[d] < rhs->coords[d]);
    }

    unsigned int d;
};

これでうまくいくはずです。

ただし、投稿したコードにはさらにいくつかの問題があります。

  • 配列にはsize_t、ではなくタイプを使用してインデックスを付ける必要がありますunsigned int。同じことがstd::vectorsにも当てはまります
  • インスタンス化の型std::binary_functionがメソッドの実際の型と一致しません(コードの削減に問題がある可能性があります)。
  • 使用しないusing namespace stdでください(コード内の宣言から使用すると思います)。
  • このようなファンクターは、パラメーターを値ではなくconst-referenceとして受け取る必要があります。

それが私が考えることができるすべてです。次回は、短く、自己完結型の、完全な例を提示しようとすると、人々は推測に頼る必要がなくなります。

于 2012-06-17T13:01:48.343 に答える