sortやfind_ifの条件指定はどういう動きをしているのか
C++でsortやfind_ifでは、イテレータのbeginとendに加えて、
関数orオブジェクトを渡すことで条件を自由に設定できます。
参考
このとき内部がどういう処理をして渡した関数を呼び出しているのかが気になったので調べました。
特に、第三引数にクラスを渡す場合、何故()オペレータに条件を書く必要があるのかが気になりました。
結論としては、実装を見れば簡単に解決しました。
内部実装
find_ifの場合
template <class _InputIter, class _Predicate>
inline _InputIter find_if(_InputIter __first, _InputIter __last,
_Predicate __pred,
input_iterator_tag)
{
while (__first != __last && !__pred(*__first))
++__first;
return __first;
}
ソートの場合
ソートは少々複雑なので、該当部分だけ抜き出します。
template <class _RandomAccessIter, class _Tp, class _Compare>
void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val,
_Compare __comp) {
_RandomAccessIter __next = __last;
--__next;
while (__comp(__val, *__next)) {
*__last = *__next;
__last = __next;
--__next;
}
*__last = __val;
}
まとめ
動きとしてはとても簡単で、比較が必要なところで引数を実行しているだけです。
おそらく、テンプレートの展開時に第三期引数の()を呼び出すように展開されるため、
関数の場合はそのまま関数呼び出しに、クラスの場合は()オペレーターの実行になるようです。