stl compare関数がメンバーではないのはなぜですか?
-
06-07-2019 - |
質問
なぜ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"