質問
キーがカスタムクラスであるstd :: multimapがあります。このようなもの:
Class X {
public:
std::string s;
int x;
operator <(const X& other) const { return s < other.s; }
};
std::multimap<X, int> mymap;
今、私はupper_boundとlower_boundを使用して、<!> quot; s <!> quot;の同じ値を持つすべての要素を反復処理したいと思います。 Xに他の演算子を実装する必要がありますか(例:==)。それとも、このように正しく動作しますか?
また、 upper_bound および lower_bound の引数として何を指定する必要がありますか? <!> quot; s <!> quot;?
の値を使用してダミーオブジェクトを作成する必要があると思います解決
class X
はマルチマップのキーであるため、upper_bound()
/ lower_bound()
のパラメーターはそのタイプである必要があります。 std::string
にX::s
(less<>
のタイプ)からの暗黙的な変換がある場合、operator <()
/ <=>へのパラメーターとして使用できます。
マルチマップのデフォルトの比較は<=>で、単に<=>を呼び出すだけです。したがって、マルチマップが機能するためには<=>に必要な唯一の演算子です。
他のヒント
演算子==および<!> lt;のみを提供する必要があります。
upper_boundおよびlower_boundは他のfind-typeメソッドとまったく同じであるため、比較するのと同じ種類のオブジェクトが必要です。この場合、必要な値がsの「ダミー」オブジェクトです。
編集:コメントは正しいので、演算子のみが必要です<!> lt; lower / upper_bound、および検索用。ただし、コンテナで他のメソッドを呼び出す場合は、operator ==も必要です。例えば。コンテナをsort()する場合は、operator ==が必要です。
すべてのSTLコンテナに必要な2つのオーバーロードはoperator <!> lt;およびoperator ==。両方を実装するのがベストプラクティスです。
もちろん、質問は、オブジェクトに依存せずに、マップ自体に比較ファンクターを実装することにより、より完全に回答することもできます。これは、多くの場合、マップでfind()を呼び出すさまざまな方法を実装するのに適した方法です。