Ответ 1
У меня была такая же проблема, короткий ответ на ваш вопрос: это невозможно со стандартными библиотеками stl (хотя это возможно с boost:: phoenix).
Однако вы можете написать собственное закрытие, окружающее итераторы последовательности, которые принимают параметризованную переменную "Значение" и возвращает результат bool.
template<class Iterator> struct is_not_in_range
{
Iterator const begin;
Iterator const end;
is_not_in_range(Iterator const& b, Iterator const& e)
: begin(b)
, end(e) {}
template<class Value> bool operator()(Value & v)
{
return std::find(begin,end,v) == end;
}
};
Тогда вы можете сделать это
std::find_if(begin1, end1, is_not_in_range<Iterator2>(begin2,end2));
В качестве альтернативы вы можете написать версию, которая использует меньшее разветвление, но требует break- > continue (аппроксимируется оператором goto)
template<class Iterator1, class Iterator2> Iterator1 find_first_not_of
( Iterator1 const& begin1
, Iterator1 const& end1
, Iterator2 const& begin2
, Iterator2 const& end2 )
{
for(Iterator1 mid1 = begin1; mid1 != end1; ++mid1)
{
for(Iterator2 mid2 = begin2; mid2 != end2; ++mid2)
if(*mid1 == *mid2)
goto FOUND;
return mid1;
FOUND: ;
}
return end1;
};