|
Программирование >> Немодифицирующие последовательные алгоритмы
В 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;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |