Скачиваний:
190
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

15. Математические операции и их эквиваленты-функторы. Понятие полного упорядочения и квазиупорядочения

Обратите внимание, что функция WorseThan(), сортирует объекты Review менее точно, чем operator<. Если элемент title объектов совпадает, функция operato<() осуществляет сортировку по полю rating. Но если и эти два поля объектов совпадают, то функция WorseThan() считает их эквивалентными.

Первый вид упорядочения называется полным упорядочением, а второй — строгим квазиупорядочением. При полном упорядочении, если оба выражения а<b и b<a ложны, то а должно быть идентично b. При строгом квазиупорядочении это не так. Объекты могут быть полностью идентичными, а могут совпадать только по одному критерию. Поэтому при строгом квазиупорядочении лучше говорить, что объекты эквивалентны, а не идентичны.

16. Цикл for, основанный на диапазоне (С++11). Особенности его использования. Сравнение цикл for, основанного на диапазоне с функцией for_each.

Цикл for, основанный на диапазоне предназначен для работы с библиотекой STL. Рассмотрим пример:

double prices[5] = {4.99, 10.99, 6.87, 7.99, 8.49 }; for (double x : prices)

cout <<x <<endl;

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

for_each(books.begin(), books.end(), showReview);

Его можно заменить следующим циклом for, основанным на диапазоне:

for (auto x: books) showReview(x);

Компилятор будет использовать тип объекта books, которым является vector<Review>, для определения того, что типом объекта х является Review, и цикл будет по очереди передавать каждый объект типа Review контейнера books в функцию showReview().

В отличие от функции for_each(), цикл for, основанный на диапазоне, может изменять содержимое контейнера. При этом важно указать параметр ссылки. Например, предположим, что имеется следующее определение функции:

void inflateReview(Review &r) {r.rating++;}

Эту функцию можно было бы применить к каждому элементу в объекте books с помощью такого цикла:

for (auto & х : books) inflateReview(x);

17. Понятие обобщенного программирования. Связь обобщенного программирования и библиотеки stl.

При объектно-ориентированном программировании основное внимание уделяется аспекту данных, а при обобщенном — алгоритмам. Общим аспектом этих двух подходов является абстрагирование и создание повторно используемого кода, но положенная в их основу философия довольно отличается.

Цель обобщенного программирования — создание кода, который не зависит от типов данных. Шаблоны — это средства C++, предназначенные для создания обобщенных программ. Естественно, шаблоны позволяют определять функции или классы в терминах обобщенного типа. Библиотека STL продвигается еще дальше, предоставляя обобщенное представление алгоритмов. Шаблоны делают это возможным, но при тщательном и продуманном проектном решении.