|
Программирование >> Операторы преобразования типа
cout no four consecutive elements with value > 3 found endl; Результат выполнения программы: 1 2 3 4 5 6 7 8 9 no four consecutive elements with value 3 found four consecutive elements with value > 3 start with 4. element При использовании второй формы алгоритма search n() возникает весьма неприятная проблема. Рассмотрим второй вызов search n(): pos = search n (coll.beginC). coll.endO. Интервал 4. Счетчик 3. Значение greater<int>()); Критерий Такая семантика поиска элементов, удовлетво1ояющих заданному критерию, отличается от той, что используется в других компонентах STL. По канонам STL этот вызов должен выглядеть так: pos = search n 1f (coll .beginO. coll.endO. Интервал 4. Счетчик bind2nd(greater<int>().3)): Критерий К сожалению, никто не заметил этой непоследовательности при включении новых алгоритмов в стандарт (они не входили в исходную версию STL). Некоторые даже полагают, что версия с четырьмя аргументами более удобна, однако она требует бинарного предиката даже в том случае, когда по логике должно быть достаточно унарного предиката. Например, конструкция с пользовательской унарной предикатной функцией обычно выглядит так: bool isPrime (int elem); pos = search njf (coll .beginO. coll.endO, Интервал 4. Счетчик isPrime): Критерий Однако на практике алгоритм требует, чтобы вы использовали бинарный предикат. Из-за этого приходится либо менять сигнатуру функции, либо писать функцию-оболочку: bool binarylsPrime (int eleml. int) { return isPrime(eleml); pos = search n (coll.beginC). coll.endC). Интервал 4. Счетчик 0. Фиктивное значение binarylsPrime): Бинарный критери1 Поиск первого подинтервала Forwardlteratorl search (Forwardlteratorl beg. Forwardlteratorl end. ForwardIterator2 searchBeg. ForwardIterator2 searchEnd) Forwardlteratorl search (Forwardlteratorl beg. Forwardlteratorl end. ForwardIterator2 searchBeg. ForwardIterator2 searchEnd. BinaryPredicate op) О Обе формы возвращают позицию первого элемента в первом Подинтервале интервала [beg,end), совпадающем с искомым интервалом [searchBegsearchEnd). О В первой форме элементы найденного подинтервала должны быть равны элементам искомого интервала. О Во второй форме вызов бинарного предиката op{etem,searchEtem) для соответствующих элементов искомого интервала и подинтервала должен возвращать true. О Если подходящий элемент не найден, обе формы возвращают end. О Предикат ор не должен изменять свое состояние во время вызова. За подробностями обращайтесь на с. 303. О Предикат ор не должен изменять передаваемые аргументы. О Проблема поиска интервала по известным значениям начального и конечного элементов рассматривается на с. 109. О Сложность линейная (не более numberOfElementsnumberofSearchElements cjoan-нений или вызовов ор соответственно). Следующий пример показывает, как найти первое вхождение серии элементов внутри другой последовательности (сравните с примером использования алгоритма find end() на с. 348): algo/searchl.cpp #include algostuff.hpp using namespace std: int mainO { deque<int> coll; llst<int> subcoll: INSERTJLEMENTS(C011.1.7): INSERT ELEMENTS(C0ll.l.7); INSERT ELEMENTS(subcoll.3.6): PRINT ELEMENTS(coll. coll: ): PRINT ELEMENTS(SubColl. subcoll: ): Поиск первого вхождения subcoll в coll deque<int>;:iterator pos; pos = search Ccoll .beginO, coll.endO. Интервал subcoll.beginC). subcol1.end()); Подинтервал Цикл повторяется до тех пор. пока внутри coll успешно находится очередное вхождение subcoll while Cpos != coll .endO) { Вывод позиции первого элемента cout subcoll found starting with element distanceCcoU-beginC).pos) + 1 endl; Поиск следующего вхождения subcoll ++pos; pos = search (pos. coll.endO, Интервал subcoll .beginC). subcoll .endO); Подинтервал Результат выполнения программы: coll: 12345671234567 subcoll; 3 4 5 6 subcoll found starting with element 3 subcoll found starting with element 10 В следующем примере вторая форма алгоритма search() используется для поиска серии элементов, определяемых более сложным критерием. В данном случае ищется серия из четного, нечетного и вновь четного элементов: algo/-search2.cpp finclude algostuff.hpp using namespace std; Проверка элемента на четность bool checkEven (int elem. bool even) { if (even) { return elem 2 == 0: else { return elem 2 == 1; int mainC) { vector<1nt> coll: INSERT ELEMENTSCcoll.1.9);
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |