Возможно, вам понадобится следующее:
#include <iterator>
struct always_true{
template<typename T>
bool operator()(T&& val) const{
return true;
}
};
template <
typename It,
typename Pred = always_true,
typename Comp = std::less<typename std::iterator_traits<It>::value_type >
>
It minElementWhere(
It begin,
It end,
Pred pred = Pred(),
Comp comp = Comp()
){
It minElement = end;
for (It it = begin; it != end; ++it) {
if (pred(*it) && (minElement == end || comp(*it, *minElement))){
minElement = it;
}
}
return minElement;
}