Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lucik_op.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
2.88 Mб
Скачать

Алгоритмы equal, mismatch и lexicographical_compare

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

#include <vector>

#include <iostream>

#include <algorithm>

using namespace std;

int main()

{ int m1[]={2,3,5,7,12};

int m2[]={2,3,55,7,12};

std::vector<int> v1(m1,m1+sizeof(m1)/sizeof(int)),

v2(m2,m2+sizeof(m2)/sizeof(int)),

v3(m1,m1+sizeof(m1)/sizeof(int));

bool res=equal(v1.begin(), v1.end(),v2.begin());

cout<<"\nВектор v1 "<<(res?"":" не ")<<" равен вектору v2";

res=equal(v1.begin(), v1.end(),v3.begin());

cout<<"\nВектор v1 "<<(res?"":" не ")<<" равен вектору v3";

std::pair<std::vector<int>::iterator,

std::vector<int>::iterator> pr;

pr=std::mismatch(v1.begin(), v1.end(),v2.begin());

cout<<"\nv1 и v2 имеют различие в позиции "

<<(pr.first-v1.begin())<<" где v1= "<<*pr.first

<<" а v2= "<<*pr.second<<'\n';

char s1[]="abbbw", s2[]="hkc";

res=std::lexicographical_compare(s1,s1+sizeof(s1)/sizeof(char),

s2,s2+sizeof(s2)/sizeof(char));

cout<<s1<<(res?" меньше ":" не меньше ")<<s2<<'\n';

return 0;

}

В строке

bool res=equal(v1.begin(), v1.end(),v2.begin());

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

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

Алгоритм mismatch возвращает пару итераторов для двух сравниваемых последовательностей (v1 и v2), указывающих позиции, где элементы различаются:

std::pair<std::vector<int>::iterator,

std::vector<int>::iterator> pr;

pr=std::mismatch(v1.begin(), v1.end(),v2.begin());

Для определения позиции, в которой векторы различаются, требуется выполнить pr.first-v1.begin(). Согласно арифметике указателей это соответствует числу элементов от начала вектора v1 до элемента, отличного от соответствующего элемента вектора v2.

Алгоритм lexicographical_compare использует четыре итератора (по крайней мере для чтения) для сравнения, обычно строк. Если элемент первой последовательности (итерируемый первыми двумя итераторами) меньше элемента второй (два последних итератора), то функция возвращает true, иначе false.

Математические алгоритмы

Приводимая ниже программа демонстрирует использование нескольких математических алгоритмов: random_shuffle, count, count_if, min_element, max_element, accumulate и transform.

#include <iostream>

#include <algorithm>

#include <functional>

#include <vector>

using namespace std;

// возвращает целое число в диапазоне 0 - (n - 1)

int Rand(int n)

{ return rand() % n ; }

void main()

{ const int v_size = 8 ;

typedef vector<int > vect;

typedef vect::iterator vectIt ;

vect Numbers(v_size) ;

vectIt start, end, it ;

// инициализация вектора

Numbers[0] = 4 ; Numbers[1] = 10;

Numbers[2] = 70 ; Numbers[3] = 4 ;

Numbers[4] = 10; Numbers[5] = 4 ;

Numbers[6] = 96 ; Numbers[7] = 100;

start = Numbers.begin() ; // location of first

end = Numbers.end() ; // one past the location

cout << "До выполнения random_shuffle:" << endl ;

cout << "Numbers { " ;

for(it = start; it != end; it++)

cout << *it << " " ;

cout << " }" << endl ;

random_shuffle(start, end,pointer_to_unary_function<int, int>(Rand));

cout << "После выполнения random_shuffle:" << endl ;

cout << "Numbers { " ;

for(it = start; it != end; it++)

cout << *it << " " ;

cout << " }" << endl ;

cout<<"число 4 встречается"<<count(start, end,4)<<" раз"<<endl;

}

Результат работы программы:

До выполнения random_shuffle

Numbers {4 10 70 4 10 4 96 100}

После выполнения random_shuffle

Numbers {10 4 4 70 96 100 4 10}

число 4 встречается 3 раза

Кратко охарактеризуем данные алгоритмы:

random_shuffle - имеется две версии функции для расположения в произвольном порядке чисел в диапазоне, определяемом аргументами-итераторами;

count, count_if – используются для подсчета числа элементов с заданным значением в диапазоне;

min_element, max_element – нахождение min- и max- элемента в диапазоне;

accumulate – суммирование чисел в диапазоне;

transform – применение общей функции к каждому элементу вектора.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]