STLセットを使用してカスタムオブジェクトをC++に格納する場合、多くの人が言います:<演算子をオーバーロードする必要がありますが、find()メソッドを使用する場合は、==演算子を使用してそれを実現できると思います。いくつかのポインタを教えてください。
4 に答える
標準ライブラリ set::find
は、値を見つけるために等式ではなく等式を使用します。を提供する必要はありません(または、指定した比較演算子がデフォルトです)。operator ==
operator <
set
std::less
要素がどのように見つかるか疑問に思っている場合は、デフォルトの順序を想定すると、次find(x)
の要素が返されますe
。
!( x < e || e < x )
sには、厳密な弱順序std::set
を指定するものが必要なので。このタスクには不十分です。operator==
operator<
クラスにとって意味がある場合にのみ、オーバーロードする必要があります。そうでない場合はstd::set
、2番目のテンプレートパラメータとして持っているという事実を利用する方がはるかに良いでしょうCompare
。したがって、比較構造体/関数を定義し、これをセットの2番目のパラメーターとして渡すことは、別の一般的に好ましいオプションです。
最後のオプションはstd::less
、タイプに特化することです。例えば:
namespace std
{
template <>
struct less<CustomClass>
{ ... };
}
ほとんどの標準ライブラリのアルゴリズムとコンテナは、順序付けと検索にoperator <(またはlhs要素が小さい場合にtrueを返すように提供する比較関数)を使用します。順序付けされていないコンテナで使用するアルゴリズムは、operator==を使用します。
たとえば、std :: lower_bound()は、並べ替えられたコンテナから検索条件に一致する最初の要素、正確な用語が見つからない場合は検索用語よりも小さい最大の要素、またはコンテナの最後までのイテレータを返します。検索した要素よりも大きい要素がない場合。これはoperator<で行います。他の演算子は必要ありません。log(n)の順に多くの操作が必要です。
!=と==を除いて、他のすべての比較演算子(>、> =、<=)はoperator<から導出できます。
ただし、std :: findでは、使用するタイプがEqualityComparableである必要があります。ここでリファレンスを見つけることができます:http://en.cppreference.com/w/cpp/algorithm/find
したがって、順序付けられた要素を使用している場合は、operator<が必要です。順序付けされていない要素を使用している場合は、operator==が必要です。
set
、、および指定した比較関数のみを使用します。デフォルトmap
は、です。これは通常、です。C ++ 11の順序付けされていないバージョンには、より複雑なプロトコルがあります。順序の比較は必要ありませんが(順序付けされていません)、同等性とハッシュの両方が必要です。multiset
multimap
std::less
operator<
これは、順序付け( sort
、、、、など)を含むすべての標準アルゴリズムにも当てはまります。ただし、アルゴリズム(および、、、などの他の同様のアルゴリズムは、デフォルトで等式関数を必要とします。標準ライブラリアルゴリズムは両方を必要としません。nth_element
lower_bound
binary_search
find
count
search
mismatch
operator==
メンバー関数について具体的に質問したのでfind
、答えはset
、すべてのメンバー関数が順序を比較するだけで正常に機能するということです。
それでも、を定義する場合は、ほとんどの場合、すべての比較演算子を定義することをお勧めしますoperator<
。