0

以下のように std::map で比較をカスタマイズします。

class my_cmp {
public:
  bool operator()(const string &a, const string &b) {
  return (a.length() >= b.length());
  }
};

map<string, int, tmp_cmp> tmp;文字列の長さごとにソートされたすべてのキーでうまく機能します。しかしtmp.erase("a string");、もはや機能しません。比較をカスタマイズした後も std::map::erase(key_type) を機能させる解決策はありますか?

4

3 に答える 3

2

のカスタム コンパレータはstd::map、"less" 演算子と同じ動作をする必要があります。したがって、コードを次のように変更する必要がありますreturn (a.length() < b.length());

于 2013-06-26T18:55:07.267 に答える
2

@Chadのコメントはさておき、あなたの問題は=、実装に含めることだと思います。

mapの平等の定義は!less(a,b) && !less(b,a). これは、 の定義では機能しませんless

「23.2.4連想コンテナ」で標準が述べていることは次のとおりです。

3 「キーの等価性」という語句は、キーの operator== ではなく、比較によって課される等価関係を意味します。つまり、比較オブジェクト comp が comp(k1, k2) == false && comp(k2, k1) == false の場合、2 つのキー k1 と k2 は同等であると見なされます。同じコンテナー内の任意の 2 つのキー k1 と k2 について、comp(k1, k2) を呼び出すと、常に同じ値が返されます。

于 2013-06-26T18:55:49.307 に答える
1

マップのコンパレータは、厳密な弱い順序付けを課す必要があります。部分的には、両方とも真ではないことcomp(a,b)を意味します。したがって、比較はorではなく andのcomp(b,a)ように振る舞うべきです。<><=>=

于 2013-06-26T19:57:45.027 に答える