1

キーがカスタムクラスである 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 を使用して、同じ値の "s" を持つすべての要素を反復処理したいと思います。X に他の演算子を実装する必要がありますか (例: ==)。それとも、このままで正常に動作するのでしょうか?

また、 upper_boundlower_boundの引数として何を指定すればよいですか? 「s」の目的の値でダミーオブジェクトを作成する必要があると思いますか?

4

2 に答える 2

5

はマルチマップのキーであるため、 /class Xへのパラメーターはそのタイプである必要があります。( の型である)からの暗黙的な変換がある場合は、それを/へのパラメーターとして使用できます。upper_bound()lower_bound()class Xstd::stringX::supper_bound()lower_bound()

multimap のデフォルトの比較はless<>、単純に呼び出されるものです。つまり、multimap が機能operator <()するために必要な唯一の演算子ですclass X

于 2008-10-18T23:10:39.667 に答える
0

演算子 == と < のみを指定する必要があります。

upper_bound と lower_bound は他の検索タイプのメソッドとまったく同じであるため、比較するには同じ種類のオブジェクトが必要です。この場合、必要な値 s を持つ「ダミー」オブジェクトです。

edit : コメントは正しいです。lower/upper_bound と find には operator< のみが必要です。ただし、コンテナーで他のメソッドを呼び出したい場合は、operator== も必要になります。例えば。コンテナーを sort() する場合は、operator== が必要です。

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

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

于 2008-10-18T23:06:09.350 に答える