Скачиваний:
62
Добавлен:
05.07.2021
Размер:
94.13 Кб
Скачать

Лекция 12

Функция scope (swap?) класса вектор будет работать эффективнее автономной функции scope. Автономная версия позволяет обменивать содержимое контейнеров независимо от типа.

Функция for_each работает с любым классом-контейнером, принимает 3 параметра. Первые 2 из них определяют итераторы, определяющие диапазон обрабатываемых аргументов, а третий определяет указатель на функцию. Функция for_each принимает указанную в аргументе функцию ко всем элементам контейнера в указанном диапазоне. Функция в аргументе не должна изменять значение аргументов контейнера.

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

В отличие от функции for_each, которая работает с любым контейнерным классом, функция shuffle требует, чтобы класс контейнера позволял доступ к своим элементам в произвольном порядке.

Функция sort также требует произвольного доступа и должна получить положение элемента на единицу дальше конечного в диапазоне. При необходимости в функцию sort можно передать способ сравнивания объектов. Если он не указан, то сортирует по возрастанию. Если элементами контейнера являются объекты, тип которых определен пользователем, то для этого типа должен быть определен перегруженный оператор “меньше”, иначе sort для этого типа работать не будет.

Первый вид упорядочения( когда используется перегрузка оператора меньше и сравниваются значения всех полей называется полным упорядочением). При нем, если условие а<b и а<b ложны, то объекты равны между собой. Если сравниваются не все поля объектов, то объекты могут быть одинаковыми по одному критерию, а фактически быть разными( квази-упорядочение). При этом объекты не идентичны, а эквиваленты.

Цикл for , основанный на диапазоне

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

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

Обобщённое программирование

STL является примером обобщенного программирования. При ООП программирование основное внимание уделяется данным, а при обобщенном программирование – алгоритмам. Общим для ООП и обобщенного программирования является абстрагирование и создание повторно используемого кода. Целью обобщенного программирования является создание кода, которые не зависит от типов данных. Подобно тому, как шаблоны обеспечивают независимость от типов хранимых данных, итераторы обеспечивают независимость от типа используемого контейнера.

Целью обобщенного программирования может быть получение единственной функции (например, функции find), которая работала бы и с массивами, и со списками, и с векторами, и с очередями, и с map, и с другими любыми контейнерами.

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

Обобщенным представлением процесса перемещения по элементам контейнера является итератор.

5 мая 2021