2

比較したいC++エンティティがあるときはいつでも、実装するだけoperator<です。ただし、他の人のコードを読んで、実装することで同じことが達成できることがわかりましたoperator()

2つの違いは何ですか?これらの各演算子はいつ使用する必要がありますか?

4

1 に答える 1

5

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);
}
于 2013-05-02T13:29:13.533 に答える