質問

キーがカスタムクラスである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::stringX::sless<>のタイプ)からの暗黙的な変換がある場合、operator <() / <=>へのパラメーターとして使用できます。

マルチマップのデフォルトの比較は<=>で、単に<=>を呼び出すだけです。したがって、マルチマップが機能するためには<=>に必要な唯一の演算子です。

他のヒント

演算子==および<!> lt;のみを提供する必要があります。

upper_boundおよびlower_boundは他のfind-typeメソッドとまったく同じであるため、比較するのと同じ種類のオブジェクトが必要です。この場合、必要な値がsの「ダミー」オブジェクトです。

編集:コメントは正しいので、演算子のみが必要です<!> lt; lower / upper_bound、および検索用。ただし、コンテナで他のメソッドを呼び出す場合は、operator ==も必要です。例えば。コンテナをsort()する場合は、operator ==が必要です。

すべてのSTLコンテナに必要な2つのオーバーロードはoperator <!> lt;およびoperator ==。両方を実装するのがベストプラクティスです。

もちろん、質問は、オブジェクトに依存せずに、マップ自体に比較ファンクターを実装することにより、より完全に回答することもできます。これは、多くの場合、マップでfind()を呼び出すさまざまな方法を実装するのに適した方法です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top