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

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


* - со значением 4 (если он есть) */

I1st<int>: iterator pos2: 1f (posl != coll.endO) {

pos2 = find (++posl. coll.endO. Интервал 4); Значение

/* Вывод всех элементов от первого до второго элемента

* со значением 4. включая оба элемента

* - Итератор posl необходимо вернуть к позиции первого элемента

* со значением 4 (если он есть)

* - конец интервала определяется позицией эа вторым элементом

* со значением 4 (если он есть) */

if (posl!=coll ,endO && pos2!-coll .endO) { copy (--posl. ++pos2.

ostream 1terator<1nt>(cout. )): cout endl;

Чтобы найти второй элемент со значением 4, необходимо увеличить позицию первого найденного элемента posl. Но следует помнить, что попытки выйти за конец коллекции приводят к непредсказуемым последствиям. Если вы не уверены в существовании элемента, перед увеличением проверьте значение, возвращаемое алгоритмом find(). Программа выводит следующий результат:

coll: 123456789123456789 4567891234

Алгоритм find() может повторно вызываться для одного интервала с разными зпаченрптми. Тем не менее использование найденных позиций для определения интервалов требует осторожности, поскольку интервал может оказаться недействительным. Проблема действительности интервалов рассматривается на с. 109.

В следующем примере алгоритм find if() используется для поиска элементов по совершенно иному критерию:

algo/find2,cpp #include algostuff.hpp using namespace std;

int main0 {

vector<int> coll: vector<1nt>::iterator pos

INSERT ELEMENTS(coll.l.9)

PRINT ELEMENTS(coll. coll



Поиск первого элемента, большего 3 pos = findjf (coll.beginC). coll.endO. Интервал bind2ndCgreater<int>().3)); Критерий

Вывод позиции cout the

distance(coll.begin().pos) + 1

element is the first greater than 3 endl;

Поиск первого элемента, кратного 3 pos = find if (coll .beginO. coll.endO.

notl(bind2nd(modulus<int>().3))):

Вывод позиции cout the

d1stance(coll .beginO ,pos) + 1

. element is the first divisible by 3 endl;

При первом вызове find() простой объект функции в сочетании с адаптером bind2nd ищет первый элемент со значением, большим 3. При втором вызове передается более сложная комбинация для поиска первого элемента, делящегося на 3 без остатка.

Программа выводит следующий результат;

coll; 12 3 4 5 6 7 8 9

the 4. element is the first greater than 3

the 3. element is the first divisible by 3

Ha c. 131 приведен пример использования алгоритма find() для поиска первого простого числа.

Поиск первых п последовательных совпадений

Inputlterator

search n (Inputlterator beg. Inputlterator end, Size count, const T& value) Inputlterator

search n СInputlterator beg. Inputlterator end.

Size count, const T8i value. BinaryPredicate op)

О Первая форма возвращает позицию первого из count последовательных элементов в интервале [beg,end), каждый из которых имеет значение value.

О Вторая форма возвращает позицию первого из count последовательных элементов в интервале [beg,end), для которых бинарный предикат op{elem,value) возвращает true.

О Если подходящий элемент не найден, обе формы возвращают end.

О Предикат ор не должен изменять свое состояние во время вызова. За подробностями обращайтесь на с. 303.

О Предикат ор не должен изменять передаваемые аргументы.



О Эти алгоритмы не входили в исходную версию STL, а при их включении была допущена определенная небрежность. Использование бинарного предиката во второй форме (вместо унарного предиката) нарушает логическую согласованность исходной версии STL (см. комментарий на с. 344).

О Сложность линейная (не более numberOfElements>count сравнений или вызовов ор соответственно).

Пример поиска трех последовательных элементов со значениями, большими либо равными 3:

algo/searchnl.cpp #include algostuff.hpp using namespace std;

int mainO {

deque<1nt> coll:

INSERTJLEMENTSCcoll ,1.9): PRINTJLEMENTSCcoll):

Поиск четырех последоватепьных элементов со значением 3 deque<int>::iterator pos:

pos = search n (coll.beginO. coll.endO. Интервал 4. Счетчик

3): Значение

Вывод результата

if (pos coll.endO) {

cout four consecutive elements with value 3

start with distance(coll,beginO,pos) +1

. element endl:

else {

cout no four consecutive elements with value 3 found endl:

Поиск четырех последовательных элементов со значением, большим 3 pos = search n (coll.beginO. coll.endO. Интервал

4. Счетчик

3. Значение

greater<int>()): Критерий

Вывод результата

if (pos != coll .endO) {

cout four consecutive elements with value > 3 start with distance(coll .beginO,pos) +1 , element endl;

else {



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

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