Программирование >>  Операторы преобразования типа 

1 ... 106 107 108 [ 109 ] 110 111 112 ... 239


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);



1 ... 106 107 108 [ 109 ] 110 111 112 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика