
- •Учебное пособие
- •Введение
- •Объектно-ориентированный подход
- •Объектно-ориентированное программирование Абстрактные типы данных
- •Базовые принципы объектно-ориентированного программирования
- •Простейший ввод и вывод
- •Объект cout
- •Манипуляторы hex и oct
- •Другие манипуляторы
- •Объект cin
- •Операторы для динамического выделения и освобождения памяти (new и delete)
- •Базовые конструкции объектно-ориентированных программ Объекты
- •Понятие класса
- •Конструктор копирования
- •Конструктор explicit
- •Указатели на компоненты класса
- •Встроенные функции (спецификатор inline)
- •Организация внешнего доступа к локальным компонентам класса (спецификатор friend)
- •Вложенные классы
- •Static-члены (данные) класса
- •Указатель this
- •Компоненты-функции static и const
- •Proxi-классы
- •Параметры ссылки
- •Независимые ссылки
- •Практические приемы ограничения числа объектов класса
- •Наследование (производные классы)
- •Конструкторы и деструкторы при наследовании
- •Виртуальные функции
- •Абстрактные классы
- •Виртуальные деструкторы
- •Множественное наследование
- •Виртуальное наследование
- •Перегрузка функций
- •Перегрузка операторов
- •Перегрузка бинарного оператора
- •Перегрузка унарного оператора
- •Дружественная функция operator
- •Перегрузка оператора []
- •Перегрузка оператора ()
- •Перегрузка операторов new и delete
- •Преобразование типа
- •Явные преобразования типов
- •Преобразования типов, определенных в программе
- •Шаблоны Параметризированные классы
- •Передача в шаблон класса дополнительных параметров
- •Шаблоны функций
- •Совместное использование шаблонов и наследования
- •Шаблоны класса и friend
- •Некоторые примеры использования шаблона класса Реализация smart-указателя
- •Классы поддерживающие транзакции
- •Задание значений параметров класса по умолчанию
- •Пространства имен
- •Ключевое слово using как директива
- •Ключевое слово using как объявление
- •Псевдоним пространства имен
- •Организация ввода-вывода
- •Состояние потока
- •Строковые потоки
- •Организация работы с файлами
- •Организация файла последовательного доступа
- •Создание файла произвольного доступа
- •Основные функции классов ios, istream, ostream
- •Основы обработки исключительных ситуаций
- •Перенаправление исключительных ситуаций
- •Исключительная ситуация, генерируемая оператором new
- •Генерация исключений в конструкторах
- •Задание собственной функции завершения
- •Спецификации исключительных ситуаций
- •Задание собственного неожиданного обработчика
- •Иерархия исключений стандартной библиотеки
- •Стандартная библиотека шаблонов (stl) Общее понятие о контейнере
- •Общее понятие об итераторе
- •Категории итераторов
- •Основные итераторы
- •Вспомогательные итераторы
- •Операции с итераторами
- •Контейнерные классы Контейнеры последовательностей
- •Контейнер последовательностей vector
- •Контейнер последовательностей list
- •Контейнер последовательностей deque
- •Ассоциативные контейнеры
- •Ассоциативный контейнер multiset
- •Ассоциативный контейнер set
- •Ассоциативный контейнер multimap
- •Ассоциативный контейнер map
- •Адаптеры контейнеров
- •Адаптеры stack
- •Адаптеры queue
- •Адаптеры priority_queue
- •Пассивные и активные итераторы
- •Алгоритмы
- •Алгоритмы сортировки sort, partial_sort, sort_heap
- •Алгоритмы поиска find, find_if, find_end, binary_search
- •Алгоритмы fill, fill_n, generate и generate_n
- •Алгоритмы equal, mismatch и lexicographical_compare
- •Математические алгоритмы
- •Алгоритмы работы с множествами
- •Алгоритмы swap, iter_swap и swap_ranges
- •Алгоритмы copy, copy_backward, merge, unique и reverse
- •Примеры реализации контейнерных классов Связанные списки
- •Реализация односвязного списка
- •Реализация двусвязного списка
- •Реализация двоичного дерева
- •Литература
- •Вопросы по курсу ооп
- •220013, Минск, п.Бровки, 6.
Алгоритмы 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 – применение общей функции к каждому элементу вектора.