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

11. Шаблонные классы map и multimap. Особенности, методы, принципы работы, возможности

Отображение, таблица (map) — это ассоциативный контейнер. Класс map поддерживает ассоциативный контейнер, в котором уникальным ключам соответствуют определенные значения.

Ключ — это имя, которое присвоено некоторому значению. После того как значение сохранено в контейнере, к нему можно получить доступ, используя его ключ. Таким образом, в самом широком смысле отображение — это список пар "ключ-значение". Если известен ключ, то можно легко найти значение. Например, можно определить отображение, в котором в качестве ключа используется имя человека, а в качестве значения — его телефонный номер. Отображение может хранить только уникальные ключи. Ключи-дубликаты не разрешены. Чтобы создать отображение, которое бы позволяло хранить неуникальные ключи, используется класс multimap

Обратите внимание на использование шаблонного класса pair для построения пар "ключ-значение". Типы данных, задаваемые pair выражением, должны соответствовать типам отображения, в которое вставляются эти пары.

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

Метод-элемент count() принимает в качестве аргумента ключ и возвращает количество элементов, имеющих такое значение ключа. Методы-элементы lower_bound() и upper_bound() принимают ключ и работают так же, как в классе set. Метод upper_bound() принимает ключ в качестве аргумента и возвращает итератор, указывающий на первый элемент набора, который больше ключевого аргумента. Метод lower_boind() принимает значение типа ключа в качестве аргумента и возвращает итератор, указывающий на первый элемент набора, который не меньше ключевого аргумента. Метод-элемент equal_range() принимает в качестве аргумента ключ и возвращает итераторы, представляющие диапазон значений, соответствующих этому ключу. Чтобы вернуть два значения, метод упаковывает их в один объект pair, на этот раз с обоими аргументами шаблона — итераторами.

12. Понятие функциональных объектов (функторов). Концепции функторов: генератор, унарная функция, бинарная функция, предикат, бинарный предикат. Предопределенные функторы

Многие алгоритмы STL используют функциональные объекты, которые также называются функторами. Функтор — это любой объект, который может использоваться с операцией () в манере, подобной функции. Это включает имена функций, указатели на функции и объекты классов, с перегруженной операцией() — т.е. классы, для которых определена версия перегруженного оператор operator().

КОНЦЕПЦИИ ФУНКТОРОВ Подобно тому, как библиотека STL определяет концепции контейнеров и итераторов, она определяет также концепции функторов:

генератор — это функтор, который может быть вызван без аргументов;

 унарная функция — функтор, который может быть вызван с одним аргументом;

 бинарная функция — функтор, который может быть вызван с двумя аргументами. Например, функтор, поддерживающий for_each(), должен быть унарной функцией, поскольку он применяется к одному элементу контейнера за раз.

Концепции функторов имеют уточнения:

 унарная функция, которая возвращает булевское значение, представляет собой предикат,

 бинарная функция, которая возвращает булевское значение, представляет собой бинарный предикат.

ПРЕДОПРЕДЕЛЕННЫЕ ФУНКТОРЫ БИБЛИОТЕКИ STL Библиотека STL определяет несколько элементарных функторов. Они выполняют такие действия, как сложение двух значений и проверка двух значений на предмет равенства. Функторы предназначены для оказания поддержки тем функциям STL, которые принимают функции в качестве аргументов. Для примера рассмотрим функцию transform(). Она имеет две версии. Первая принимает четыре аргумента. Из них первые два — итераторы, которые задают диапазон контейнера. Третий аргумент — это итератор, указывающий место помещения копии результата. И последний — функтор, который применяется к каждому элементу диапазона для создания каждого нового результирующего элемента.

13. Понятие алгоритма STL. Заголовочный файл algorithm. Основные свойства алгоритмов. Функции sort(), сору(), find(), for_each(), random_shuffle(), set_union(), set_intersection(), set_difference(), transform(), replace_if(), replace_copy_if(), replace_copy(), next_permutation(). Применение алгоритмов с массивами.

Библиотека STL включает в себя множество автономных функций для работы с контейнерами. Все они характеризуются одинаковым общим подходом — применением итераторов для идентификации диапазонов обрабатываемых данных и места помещения результатов. Некоторые также принимают аргумент — функциональный объект, который используется в процессе обработки данных. Существуют два основных общих проектных компонента функций алгоритмов. Во-первых, они применяют шаблоны для предоставления обобщенных типов. Во-вторых, они используют итераторы для обеспечения обобщенного представления доступа к данным в контейнере.

Заголовочный файл algorithm.

ГРУППЫ АЛГОРИТМОВ

Немодифицирующие последовательные операции обрабатывают каждый элемент в диапазоне. Эти операции оставляют контейнер без изменений. Например, find() и for_each() относятся к этой категории. Модифицирующие последовательные операции также обрабатывают каждый элемент в контейнере. Они могут изменить содержимое контейнера. Изменения могут касаться значений либо порядка, в котором они сохранены. Функции transform(), random_shuffle() и copy() относятся к этой категории. Сортирующие и связанные с ними операции включают некоторые сортирующие функции (в том числе sort()), а также ряд других функций, включая операции с наборами (множествами).

Один из способов классификации алгоритмов основан на том, куда должен быть помещен результат работы алгоритма. Некоторые алгоритмы делают свою работу на месте, другие создают копии.

Поэтому функция sort() является алгоритмом называемым "поместу". Однако функция сору() отправляет результат своей работы в другое местоположение, поэтому она является копирующим алгоритмом. Функция transform() может делать и то, и другое. Подобно сору(), она использует выходной итератор для указания места помещения результата. Но, в отличие от сору(), transform() позволяет выходному итератору указывать позицию внутри входного диапазона, поэтому она может копировать трансформированные значения поверх исходных. Некоторые алгоритмы имеют две версии: "по месту" и копирующую. В соответствии с соглашением STL, к имени копирующей версии добавляется _сору. Последняя версия принимает дополнительный параметр — выходной итератор для указания места копирования результата. В соответствии с принятым соглашением, копирующие алгоритмы возвращают итератор, который указывает на позицию, следующую за последним скопированным значением.

Еще одна часто используемая разновидность — функции, имеющие версию, которая выполняет действие условно, в зависимости от результата применения функции к элементу контейнера. Как правило, к именам этих версий добавляется _if. Например, функция replace_if() заменяет старое значение новым, если применение функции к старому значению возвращает true.

set_difference() строит отсортированную последовательность из элементов, имеющихся в первой последовательности [first1,last1), но отсутствующих во второй - [first2,last2).

for_each() применяет объект-функцию func к каждому элементу в диапазоне [first,last). func не может изменять элементы, поскольку итератор записи не гарантирует поддержки присваивания. Если же модификация необходима, следует воспользоваться алгоритмом transform(). func может возвращать значение, но оно игнорируется.

set_union ()Создает отсортированный диапазон, начиная с местоположения, на которое указывает результат с установленным объединением двух отсортированных диапазонов [first1,last1)и [first2,last2).

Алгоритм next_permutation() преобразует содержимое диапазона в следующую перестановку; в случае строки перестановки выполняются в возрастающем алфавитном порядке.

Применение алгоритмов с массивами.