Алгоритм search_end_if

Я написал алгоритм, используется функтор. Например, есть условие, которое заключается в том, что элементы последовательности должны быть больше нуля. Но такая реализация не работает. Сейчас выводится Not found. А должно быть Found on 1. Почему так? Пробовал разные условия, например i%2=1 (с другой последовательностью). Так вот, результат получается верный (Found on 1), но по факту числа последовательности i%2=0.

search_end_if

#include<iostream>
#include<algorithm>

template<class ForwardIterator1, class ForwardIterator2, class Predicate>
ForwardIterator1 search_end_if(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, Predicate Functor){
 
    ForwardIterator1 ret = last1;
 
    for (; first1 != last1; ++first1) {
        ForwardIterator1 it1 = first1;
        ForwardIterator2 it2 = first2;
 
        while (*it1 == *it2) {
            ++it1;
            ++it2;
            if (Functor(*last2)) {
                ret = first1;
                break;
            }
            if (Functor(*last1)) return ret;
        }
    }
    return ret;
}
 
class Odd { public: bool operator()(int i) { return i > 0; } };
 
 
int main() {
    int* n;
    int x[3] = { 41, 1, 2 };
    int y[2] = { 1, 2 };
 
    search_end_if(x, x + 3, y, y + 2, Odd());
    Odd f;
    n = search_end_if(x, x + 3, y, y + 2, f);
   
    if (n == x + 3) std::cout << "\nNot found" << std::endl;
    else std::cout << "\nFound on position number " << (n - x) << std::endl;
 
    return 0;
}

Но перед этим мне было необходимо написать код для search_end. Его я написал, и он работает(по типу find_end). И вот search_end_if я строил, исходя из search_end. То есть, просто добавил функтор. Как можно исправить код, чтобы все правильно выводилось?

search_end

#include<iostream>
#include<algorithm>

template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2){
   if (first2 == last2) return last1;  

   ForwardIterator1 ret = last1;

   for (; first1 != last1;  ++first1) {
       ForwardIterator1 it1 = first1;
       ForwardIterator2 it2 = first2;
       while (*it1 == *it2) {    
           ++it1;
           ++it2;
           if (it2 == last2) {
               ret = first1;
               break;
           }
           if (it1 == last1) return ret;
       }       
   }
   return ret;
}

int main() {

   int* c;
   int a[10] = { 1, 26, 33, 40, 0, 1, 26, 83, 41, 50 };
   int b[3] = { 1, 26 };
 
   c =  search_end(a, a + 10, b, b + 2);

   if (c == a + 10) std::cout << "Not found" << std::endl;
   else std::cout << "Found on position number " << (c - a) << std::endl;
   return 0;
}

Ответы (0 шт):