イテレータを指定すると、このイテレータが参照するコレクションに対して正しい比較関数を取得/使用できますか?イテレータを指定してコンテナの比較関数を取得する
たとえば、のは、私は一般的なアルゴリズムを書いていると仮定しましょう:
今template <class InIt, class T>
void do_something(InIt b, InIt e, T v) {
// ...
}
、のは、私が[b..e)
でv
を見つけるように、簡単な何かをしたいとしましょう。 b
とe
がstd::vector
を超えるイテレータの場合は、単にif (*b == v) ...
を使用します。しかし、b
とe
は、std::map
以上のイテレータであるとします。この場合、I ははのキーと比較するだけで、マップに含まれている値のタイプ全体ではありません。
質問には、それらのイテレータがマップ内にある場合、キーを比較するだけのマップの比較関数を取得するにはどうすればよいですか?同時に、私は盲目的に私がmap
で働いていると仮定したくありません。たとえば、イテレータがset
を指していたら、そのために定義された比較関数を使用したいと思います。set
彼らがvector
またはdeque
を指していた場合、おそらく==
を使用する必要があります。なぜなら、それらのコンテナには比較関数が定義されていないからです。
ああ、ほとんど忘れてしまった:多くの場合、コンテナに含まれている要素のoperator==
ではなく、operator<
に相当するものがあることに気がつきました。
今すぐ回答を書く時間はありませんが、これはhttp://en.cppreference.com/w/cpp/container/map/key_compに役立ちます。うーん、それほど多くはない。トリッキーな部分はコンテナを取得しています。 –
私はあなたの 'set'のために混乱しています。 'set'のコンパレータはtotal-orderでなければなりません。これは' operator == 'の場合ではありません。 – pmr
マップエントリのキーだけを比較する場合とエントリ全体を比較する場合とで同じではありませんか? [編集]もちろん、そうではありません。マップされた部分に等価操作がないかもしれません。 –