C++. map. Знакомство с синтаксисом

  • map — это такая структура данных, которая содержит пару ключзначение
Ключом, как правило, является какое-то название, а значением назначаемые данные, связанные с этим названием. Например, у нас может быть набор объектов одной группы: яблоко, аплеьсин, персик", так вот название этой группы объектов — это ключ, а каждый из этих объектов — это то, что может быть значением, соотносящимся с названием группы. Это называется ассоциацией.
  • map — это массив ассоциаций.
Чтобы объявить какой-то объект map, нужно определиться, какой тип будет иметь ключ, а какой тип будет у названий. А чтобы использовать map, следует включать соответствующую директиву:
Если вы после всех объяснений плохо себе представляете, что такое map, но хорошо понимаете, что такое одномерный массив, попробуйте представить одномерный массив, у каждой ячейки которого появилось уникальное название. А использованием названия можно вытащить значение названной ячейки.
******
ФРУКТ
ЦВЕТ
СТРАНА
МАССИВ
ЯБЛОКО
ЗЕЛЕНЫЙ
УКРАИНА
******
'Ауди'
'Фольцваген'
'Мерседес'
МАССИВ
1000
900
3000
В один момент времени у ключа map может быть только одно значение (но этим значением может быть, например, вектор). Смысл в том, что это значение можно менять. Так, таблица с названиями автомобилей — это что-то вроде прайс-листа. Ключом являются названия фирм, а значенями числа (якобы цены). Цены можно обновлять, но нельзя задать несколько цен одному ключу. Давайте кодом отобразим одну из показанных таблиц:
Хоть map и походит на массив с именованными ячейками, это не масссив, это другая структура данных. Нельзя у map вытащить значения не по имени ячейки, а по индексу. Дело в том, что значения не размещаются по собственному порядку, поэтому у них индексов как таковых нет вообще. Значения упорядочиваются по ключам.
В C++ у map ключ называется first, а назначаемое (назначенное) данное называется second. Обойти map можно почти как и обычный массив. В том смысле, что можно взять начало и конец объекта map и пройтись по этому диапазону, собирая все значения. Но в отличие от обхода массива (в котором ориентир идёт на номер хранимого элемента), обход map производится по позиции (с помощью перемещаемого по адресам итератора): итератор гуляет по ключам. Да и обращаться нужно, если к содержимому, то либо через итератор к ключу, либо через итератор к значению. Итератор — это такой бегунок, который позиционируется на адресе одного из элементов.
Для наглядности цикл в листинге #3.1 был упрощён. Если не брать во внимание существование автоматического выведения типа, то вы можете использовать или встречать что-то вроде такого:
Обычно ключ не предполагает редактирования собственного названия, поэтому напрямую до некоторых пор кодом ключу можно было задать название, использовать которое пермаментно, а если нужно было переименовать ключ, то находили нужную ячейку по ключу, сохраняли её значение в создаваемую, в создаваемой называли ключ нужным себе именем, после чего найденную ячейку удаляли, а вместо неё использовали созданную со скопированным значением. Меняются обычно значения, а не ключи. Вот несколько примеров изменить значения:
Основная сложность у меня во время моего знакомства была во вставке в map значений. Возможно, кто-то это читает только потому что испытывает те же трудности, что когда-то испытывал я. Дело в том, что для вставки map используют pair.
  • pair — это шаблонный класс, который предоставляет возможность использовать объекты с двумя значениями.
  • Для использования pair — нужно включать директиву #include <utility>.
  • Отличаются pair и map тем, что один pair предоставляет один объект с двумя значениями (с одним ключ-значением), а один map множество пар ключ-значение.
Шаблонные классы — это такие классы, тип для объектов которых даётся только при объявлении объектов. map — это тоже шаблонный класс: когда мы объявляли объект m в наших листингах, мы сразу предопределяли ему, какие типы в нём будут. Для pair тоже нужно предопределять типы. В нашем случае в map вставляются pair, поэтому предопределённые типы map и pair должны быть идентичными.
  • Для того, чтобы наделить объект пары названием и значением, следут использовать функцию make_pair
Такие пары и вставляются в map:
Если в map уже есть ключ с таким же именем, как у ключа вставляемой пары, то вставляемая пара будет проигнорирована. Нужно понимать, что ключи уникальны.
У ключа map, как и у значения, может быть любой тип. Но у типа должна обязательно быть определена операция <. Вот пример использования для ключа класса.
Операрация < используется для сортировки ключей, поэтому она должна быть определена так, чтобы в результате сравнения разные ключи не воспринимались одинаково, иначе, если разные ключи воспринимаются одинаковыми ключами, вставка в map просто дальше первой происходить не будет.
Статья переписана 02.01.2022

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/aleksey-goloschapov/google-android-programmirovanie-dlya-mobilnyh-ustroystv-2/?lfrom=15589587
Яндекс.Метрика