比較したいC++エンティティがあるときはいつでも、実装するだけoperator<
です。ただし、他の人のコードを読んで、実装することで同じことが達成できることがわかりましたoperator()
。
2つの違いは何ですか?これらの各演算子はいつ使用する必要がありますか?
operator<
比較演算子を定義する標準的な方法です。
struct A { /* some members */ };
struct B { /* some members */ };
// comparison operator
bool operator<(const A&, const B&);
これにより、従来の使用法が得られます。
int main()
{
A a;
B b;
const bool result = (a < b);
}
これまで見てきたのは、ファンクターを作成する人々です。つまり、比較をラップすることのみを目的とするクラス全体です。これらを呼び出しコードの関数のように見せるために、以下を使用します。operator()
struct A { /* some members */ };
struct B { /* some members */ };
// comparison functor
struct comparator
{
bool operator()(const A&, const B&);
};
これにより、前の例と同等のコードで従来の使用法が少なくなります。
int main()
{
A a;
B b;
comparator c;
const bool result = c(a,b);
}
ただし、これには使用しません。ファンクターは、アルゴリズムに渡すためのものです (特に一般的なコードで)。また、コンストラクターの引数を使用できるため、 stateを保持できるという追加の利点もあります。これにより、単純な関数ポインターよりも柔軟になります。
int main()
{
std::vector<A> a(5);
B b;
comparator c;
std::sort(a.begin(), a.end(), c);
// or, simply:
std::sort(a.begin(), a.end(), comparator());
// all more easily extensible than:
std::sort(a.begin(), a.end(), &someComparisonFunction);
}