イテレータを指定すると、このイテレータが参照するコレクションの正しい比較関数を取得/使用できますか?
たとえば、一般的なアルゴリズムを書いているとしましょう:
template <class InIt, class T>
void do_something(InIt b, InIt e, T v) {
// ...
}
v
ここで、 find inのような簡単なことをしたいとしましょう[b..e)
。b
とe
が a のイテレータである場合、std::vector
単純に を使用できますif (*b == v) ...
。b
ただし、とe
が a のイテレータであると仮定しましょうstd::map
。この場合、マップに含まれている値の型全体ではなく、キーのみを比較する必要があります。
問題は、これらのイテレータをマップに指定した場合、キーのみを比較するマップの比較関数を取得するにはどうすればよいかということです。同時に、map
どちらか一方を扱っているとやみくもに想定したくありません。たとえば、反復子が を指している場合、その に対してset
定義された比較関数を使用したいと思いますset
。vector
それらがまたはを指している場合、これらのコンテナーには比較関数が定義されていないため、deque
おそらく を使用する必要があります。==
ああ、ほとんど忘れていました。多くの場合、コンテナーには、含まれる要素ではoperator<
なく、同等のものしかないことがわかりました。それを使用できてもまったく問題ありません。operator==