Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
40
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 14. Алгоритмы

345

adjacent_find

Алгоритм adjacentjfind выполняет нахождение пары соседних значений.

tempiate<class For> For adjacent_find(For first. For last); tempiate<class For, class BinPred>

For adjacent_find(For first, For last, BinPred pred);

Первая форма алгоритма находит в последовательном контейнере пару соседних одинаковых значений и возвращает итератор на первое из них или конец последовательности (итератор на элемент, следующий за последним).

Вторая форма находит соседние элементы, удовлетворяющие условию, заданному предикатом pred в виде функции или функционального объекта.

Пример (программа находит самую левую пару одинаковых элементов целочисленного массива и пару элементов структуры, у которых равна сумма полей):

#include <algorithm> using namespace std; struct A{ int x, y;}; bool f(A &al. A& a2){

return al.x + al.y == a2.x + a2.y;} int main (){

int m[8] = {45. 60. 60. 25. 25. 2. 13. 35};

cout « *(adjacent_find(m, m + 8)); // Вывод: 60

Ama[5] = {{2.4}. {3.1}. {2.2}. {1.2}. {1.2}};

cout « (*adjacent_find(ma. ma + 5. f)).x « endl; // Вывод:3

return 0;

}

count, countjf

Алгоритм count выполняет подсчет количества вхождений значения в последовательность:

tempiate<class In, class T>

typename iterator_traits<In>::difference_type countdn first. In last, const T& value);

Эта форма алгоритма вычисляет в последовательном контейнере количество вхождений заданного значения value. Результат имеет тип разности между двумя итераторами difference_type (см. с. 330).

Алгоритм count_i f выполняет подсчет количества выполнений условия в последовательности:

tempiate<class In. class Pred>

typename iterator_traits<In>::difference_type countjf (In first. In last. Pred pred);

Эта форма алгоритма вычисляет в последовательном контейнере количество элементов, удовлетворяющих условию, заданному предикатом pred в виде функции или функционального объекта.

Пример использования функции count_i f приведен на с. 338.

346

Часть III. Стандартная библиотека

equal

Алгоритм equal выполняет попарное сравнение элементов двух последовательностей. Пользователь может задать предикат, определяющий, что считать равенством:

template <class Inl, class In2>

bool equal(Inl firstl. Inl lastl. In2 first2); template <class Inl. class In2, class BinPred>

bool equal(Inl firstl. Inl lastl. In2 first2. BinPred pred);

find, findjf

Алгоритмы семейства find осуществляют поиск в последовательности.

Алгоритм find выполняет поиск заданного значения value:

tempiate<class In. class T>

In finddn first. In last, const T& value);

Алгоритм find_if выполняет поиск значения, соответствующего заданному предикату pred:

tempiate<class In, class Pred>

In findjf (In first. In last. Pred pred);

Эти алгоритмы возвращают итератор на самое левое найденное значение в случае успешного поиска и на конец последовательности — в противном случае.

В качестве примера рассмотрим нахождение значений в векторе, элементы которого считываются из файла (в качестве предиката используется функциональный объект):

#include <fstream> #include <iostream> #include <vector> #include <algorithm> using namespace std; class In_10_50{ public:

bool operator()(int x) {return x > 10 && x < 50;}

}:

int main(){

ifstream in ("inpnum"):

vector<int> v;

int x;

while ( in » x. Mn.eofO) v.push_back(x);

for (int i = 0; i<v.size(); i++) cout « v[i] « " ":

cout « endl;

// Поиск элемента, равного 51:

cout « *find(v.begin(). v.endO. 51) « endl;