Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 48 49 50 [ 51 ] 52 53 54 ... 78


В STL определены также версии find first of и findend, принимающие в качестве дополнительного параметра для проведения сравнений бинарный предикат. Мы можем использовать этот предикат для замены проверки на равенство другим условием; подробнее применение этого предиката рассмотрено в следующем разделе на примере алгоритма adjacentfind.

7.1.2. Алгоритм adjacent find

Forwardlterator adjacent find

(Forwardlteratorfirst, Forwardlteratorlast, const T& value); Forwardlterator adjacent find

(Forwardlteratorfirst, Forwardlteratorlast, Predicate pred);

Для поиска в последовательном контейнере определены два алгоритма adjacent find (найти рядом). Первый ищет соседние элементы a[k] и а[+1], которые равны друг другу; второй ищет соседние элементы, которые удовлетворяют заданному условию. В следующей программе показано, как работают оба варианта. Программа adjacent.cpp осуществляет поиск в массиве а четыре раза:

двух элементов, a[k\ и а[+1], которые равны между собой; двух элементов, a[k] и а[+1], удовлетворяющих условию a[k\ > a[k+l]; двух элементов, a[k] и а[+1], удовлетворяющих условию а[ку = a[k+l]; двух элементов, a[k] и а[+1], удовлетворяющих условию a[kY = a[k+i].

Если искомые соседние элементы не найдены, функция adjacent find возвращает, как обычно, итератор, следующий за итератором, указывающим на последний элемент. Так, если бы мы вместо массива а использовали вектор V, это значение совпало бы со значением v.end(). Значения в массиве а подобраны таким образом, что первые три поиска происходят удачно, а последний - нет:

adjacent.cpp: Алгоритмы adjacent find.

iinclude <iostream>

iinclude <iomanip>

iinclude <algorithin>

iinclude <functional>

using namespace std;

bool is square(int x, int y){return x * x == y;} bool is cube(int x, int у){return x * x * x == y;}

int mainO

{ int a[10] =

{5, 10, 28, 20, 10, 5, 25, 10, 10, 90}, *p, k;



for (к;=0; к<10; к++) cout setw(3) к; cout << endl;

for (k=0; k<10; k++) cout setw(3) a[k]; cout endl;

p = adjacent find(a, a+10); к = p - a; if (k != 10)

cout a[k] = a[k+l], found at к = к endl;

p = adjacent find(a, a+10, greater<int>()); к = p - a; if (k != 10)

cout a[k] > a[k+l], found at к = к endl;

p = adjacent find(a, a+10, is square); к = p - a; if (k != 10)

cout a[k]*a[k] == a[k+l], found at к = к endl;

p = adjacent find(a, a+10, is cube); к = p - a; if (k != 10)

cout a[k]*a[k]*a[k] == a[k+l], found at к = к endl; else cout If not found: к = << к endl; return 0;

Программа выведет:

0123456789

5 10 28 20 10 5 25 10 10 90 a[k] = a[k+l], found at к = 7 a[k] > a[k+l], found at к = 2 a[k]*a[k] == a[k+l], found at к = 5 If not found: к = 10

Предикаты в этой программе записаны как функции. Из предыдущего обсуждения (см., например, главу 6) очевидно, что мы можем использовать вместо функций функциональные объекты. Например, мы можем заменить функцию issquare следующим определением класса:

struct sq{

bool operator!)(int x, int у){return x * x == y;} };

если также заменим



р = adjacent find(a, а+10, is square);

р = adjacent find(a, а+10, sqO); Этот подход применим и к другим предикатам в настоящей главе.

7.1.3. Отличие

pair<InputIteratorl, InputIterator2> mismatch (Inputlteratorl firstl, Inputlteratorl lastl, InputIterator2 first2); pair<InputIteratorl, InputIterator2> mismatch (Inputlteratorl firstl, Inputlteratorl lastl, InputIterator2 first2, BinaryPredicate binary pred);

Существуют два варианта алгоритма mismatch. Первый ищет одновременно в двух последовательных контейнерах несовпадающие элементы, стоящие в одной позиции. Другими словами, если мы обозначим эти элементы как X и у, будет выполнено условие \(х == у). Второй вариант использует передаваемый дополнительно предикат вместо оператора ==. Следующая программа демонстрирует оба варианта:

mismatch.срр: Алгоритмы mismatch, iinclude <iostream> iinclude <iomanip> iinclude <algorithm> using namespace std;

bool smalldifdnt a, int b) {return abs(a - b) < 25;} int mainO

{ int a[4] = {50, 80, 30, 90},

b[5] = {50, 80, 10, 40, 20}, *pa, *pb, k; pair<int*, int*> difpos(0, 0); for (k=0; k<5; k++) cout setw(3) k; cout << endl;

for (k=0; k<4; k++) cout setw(3) << a[k]; cout << endl;

for (k=0; k<5; k++) cout setw(3) b[k]; cout endl;

difpos = mismatch(a, a+4, b); pa = difpos.first; pb = difpos.second; cout Different elements << *pa << and << *pb

found at position << pa - a << endl; difpos = mismatch(a, a+4, b, smalldif); pa = difpos.first;



1 ... 48 49 50 [ 51 ] 52 53 54 ... 78

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