На этом шаге мы рассмотрим использование второй формы алгоритма search().
В следующем примере вторая форма алгоритма search() используется для поиска серии элементов, определяемых более сложным критерием. В данном случае ищется серия из четного, нечетного и вновь четного элементов:
//--------------------------------------------------------------------------- #include <vcl.h> #include <iterator> #include "algostuff.hpp" #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; std::string ToRus(const std::string &in) { char *buff = new char [in.length()+1]; CharToOem(in.c_str(),buff); std::string out(buff); delete [] buff; return out; } // Проверка элемента на четность bool checkEven (int elem, bool even) { if (even) { return elem % 2 == 0; } else { return elem % 2 == 1; } } int main() { vector<int> coll; INSERT_ELEMENTS(coll,1,9); PRINT_ELEMENTS(coll,"Исходный вектор:\n"); // Аргументы checkEven() // - проверка последовательности "чет нечет чет" bool checkEvenArgs[3] = { true, false, true }; // Поиск первого подинтервала в coll vector<int>::iterator pos; pos = search (coll.begin(), coll.end(), // Интервал checkEvenArgs, checkEvenArgs+3, // Значения подинтервала checkEven); // Критерий // Цикл повторяется до тех пор, пока внутри coll // успешно находится очередное вхождение подинтервала while (pos != coll.end()) { // Вывод позиции первого элемента cout << ToRus("Очередной подинтервал начинается с элемента ") << distance(coll.begin(),pos) + 1 << endl; // Поиск следующего подинтервала в coll pos = search (++pos, coll.end(), // Интервал checkEvenArgs, checkEvenArgs+3, // Значения checkEven); // Критерий } getch(); return 0; } //---------------------------------------------------------------------------
Программа выводит следующий результат:
Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим поиск последнего подинтервала.