質問

なぜstl :: sortの比較関数が静的メンバーになれないのか、ただただ興味がありますか?

ヘッダーで宣言および定義されている小さなヘルパークラスfooがありますが、cmp()の実装用にfoo.cppファイルを作成して、多重定義されないようにします。

また、fooCmp()が他のcmp()と衝突しないように、適切に装飾された名前を考える必要があります。

メンバー変数にはアクセスできないため、他の値(たとえば、foo.barからの距離でソート)にアクセスする必要がある比較操作には、複雑なbind2nd呼び出しが必要です。

役に立ちましたか?

解決

あなたが不平を言っていることはわかりません:

std::sort(begin,end)        // use operator<
std::sort(begin,end,order)  // Where order is a functor

したがって、順序は次のようになります。

  • 関数
  • 静的メンバー関数
  • または関数のように動作するオブジェクト。

以下は私にとってはうまくいきます:

class X
{
    public: static bool diff(X const& lhs,X const& rhs) { return true;}
};

int main()
{
    std::vector<X>   a;

    std::sort(a.begin(),a.end(),&X::diff);
}

ただし、クラスに自然な順序がある場合は、単に演算子を定義しないだけです!<!> lt;クラス用。これにより、メンバーへのアクセスが可能になり、順序を定義する必要があるほとんどの標準コンテナ/アルゴリズムに対して適切に動作します。

class X
{
    public: bool operator<(X const& rhs) const   {  return true;}
};
int main()
{
    std::vector<X>   a;

    std::sort(a.begin(),a.end());
}

他のヒント

乗算定義の比較関数に関心がある場合は、staticリンケージで関数を宣言してみてください。その場合、関数のスコープは、見つかったコンパイル単位を超えて拡張されません。

それはあなたの比較<!> quot; function <!> quot;関数である必要はありませんが、代わりに関数 object にすることができます。関数オブジェクトは関数に非常に似ていますが、通常のクラス内で適切なパラメーターを受け取るoperator()として実装されます。通常のクラスなので、コンストラクターのパラメーターをクラスに渡すことができます。

簡単な例を次に示します。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class comparator {
public:
    bool operator()(int a, int b) {
        return a < b;
    }
};

int main(int, char *[])
{
    vector<int> a;
    a.push_back(1);
    a.push_back(3);
    a.push_back(2);
    sort(a.begin(), a.end(), comparator());
    cout << a << endl;
}

実際には関数は クラスで宣言された、 ヘッダーで定義されているが、インラインリンケージのないクラスの外部で定義されている

ieのようなもの:

class foo{
public:
   static bool compare(const foo& lhs,const foo& rhs);
   ...
};
bool foo::compare(const foo& lhs,const foo& rhs){
   ...
} 

の代わりに

class foo{
public:
   static bool compare(const foo& lhs,const foo& rhs);
   ...
};
inline bool foo::compare(const foo& lhs,const foo& rhs){
   ...
} 

最初の関数は、コンパイル単位ごとに関数を定義します

#includes "foo.h"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top