Как использовать неупорядоченную карту C ++

How Use C Unordered Map



Карта, также известная как ассоциативный массив, представляет собой список элементов, где каждый элемент представляет собой пару ключ / значение. Итак, каждый ключ соответствует значению. Для обычной работы разные ключи могут иметь одно и то же значение. Например, ключи могут быть списком фруктов и соответствующими значениями цветов фруктов. В C ++ карта реализована как структура данных с функциями-членами и операторами. Упорядоченная карта - это карта, в которой пары элементов упорядочены по ключам. Неупорядоченная карта - это карта, на которой нет порядка. В этой статье объясняется, как использовать неупорядоченную карту C ++, записанную как unordered_map. Чтобы понять эту статью, вам понадобятся знания указателей C ++. unordered_map является частью стандартной библиотеки C ++.

Класс и объекты

Класс - это набор переменных и функций, которые работают вместе, где переменным не присвоены значения. Когда переменным присваиваются значения, класс становится объектом. Различные значения, присвоенные одному и тому же классу, приводят к разным объектам; то есть разные объекты относятся к одному классу с разными значениями. Считается, что создание объекта из класса создает экземпляр объекта.







Имя, unordered_map, это класс. Объект, созданный из класса unordered_map, имеет имя, выбранное программистом.



Функция, принадлежащая классу, необходима для создания экземпляра объекта из класса. В C ++ эта функция имеет то же имя, что и имя класса. Объекты, созданные (экземпляры) из класса, имеют разные имена, данные им программистом.



Создание объекта из класса означает создание объекта; это также означает создание экземпляра.





Программа на C ++, использующая класс unordered_map, начинается со следующих строк в верхней части файла:

#включают
#включают
используя пространство имен std;

Первая строка предназначена для ввода / вывода. Вторая строка позволяет программе использовать все возможности класса unordered_map. Третья строка позволяет программе использовать имена в стандартном пространстве имен.



Перегрузка функции

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

Строительство / Копирование Строительство

Простая конструкция

Неупорядоченную карту можно построить и присвоить ей следующие значения:

unordered_map<const символ*, const символ*>umap;

umap['банан'] знак равно 'желтый';
umap['виноград'] знак равно 'зеленый';
umap['Инжир'] знак равно 'фиолетовый';

Объявление начинается со специализации шаблона с типами для пар ключ и значение. За ним следует выбранное программистом имя для карты; затем точка с запятой. Второй сегмент кода показывает, как присвоить значения их ключам.
Строительство по Initializer_list
Это можно сделать следующим образом:

unordered_map<const символ*, const символ*>umap({{'банан', 'желтый'},
{'виноград', 'зеленый'}, {'Инжир', 'фиолетовый'}});

Построение путем присвоения Initializer_list
Пример:

unordered_map<const символ*, const символ*>umapзнак равно {{'банан', 'желтый'},
{'виноград', 'зеленый'}, {'Инжир', 'фиолетовый'}};

Построение путем копирования другого unordered_map
Пример:

unordered_map<const символ*, const символ*>umap1({{'банан', 'желтый'},
{'виноград', 'зеленый'}, {'Инжир', 'фиолетовый'}});
unordered_map<const символ*, const символ*>umap2(umap1);

Пара Элемент

Следующий код показывает, как создать элемент пары и получить к нему доступ:

пара<символ, const символ*>прзнак равно {'d', 'быть'};
Стоимость<<пр.первый << ' п';
Стоимость<<пр.второй << ' п';

Результат:

d
быть

first и second - зарезервированные слова для двух элементов в паре. Значения в паре все еще можно изменить, используя первое и второе.

Пара называется value_type в теме неупорядоченной карты.

Доступ к элементу unordered_map

mapped_type & operator [] (key_type && k)
Возвращает значение для соответствующего ключа. Пример:

unordered_map<const символ*, const символ*>umap;

umap['банан'] знак равно 'желтый';
umap['виноград'] знак равно 'зеленый';
umap['Инжир'] знак равно 'фиолетовый';

const символ *Правильнознак равноumap['виноград'];

Стоимость<<Правильно<<' п';

Результат: зеленый. Таким же образом можно присвоить значения - см. Выше.

unordered_map Емкость

size_type size () const noexcept
Возвращает количество пар на карте.

unordered_map<const символ*, const символ*>umap;

umap['банан'] знак равно 'желтый';
umap['виноград'] знак равно 'зеленый';
umap['Инжир'] знак равно 'фиолетовый';

Стоимость<<umap.размер() <<' п';

Выход 3.

bool empty () const noexcept

Возвращает 1 для истины, если на карте нет пары, и 0 для false, если на ней есть пары. Пример:

unordered_map<const символ*, const символ*>umap;
Стоимость<<umap.пустой() <<' п';

Выход 1.

Возвращение итераторов и класса неупорядоченной карты

Итератор похож на указатель, но имеет больше функций, чем указатель.

begin () noexcept

Возвращает итератор, указывающий на первую пару объекта карты, как в следующем сегменте кода:

unordered_map<const символ*, const символ*>umap;

umap['банан'] знак равно 'желтый';umap['виноград'] знак равно 'зеленый';umap['Инжир'] знак равно 'фиолетовый';

unordered_map<const символ*, const символ*> ::итераторiterзнак равноumap.начинать();
пара<const символ*, const символ*>прзнак равно *iter;
Стоимость<<пр.первый << ',' <<пр.второй << ' п';

На выходе получается: инжир, фиолетовый. Карта неупорядочена.

begin () const noexcept;

Возвращает итератор, указывающий на первый элемент коллекции объектов карты. Когда конструкции объекта предшествует const, выражение begin () const выполняется вместо begin (). В этом случае элементы в объекте не могут быть изменены. Например, он используется в следующем коде.

constunordered_map<const символ*, const символ*>umap({{'банан', 'желтый'},
{'виноград', 'зеленый'}, {'Инжир', 'фиолетовый'}});

unordered_map<const символ*, const символ*> ::const_iteratoriterзнак равноumap.начинать();
пара<const символ*, const символ*>прзнак равно *iter;
Стоимость<<пр.первый << ',' <<пр.второй << ' п';

На выходе получается: инжир, фиолетовый. Карта неупорядочена. Обратите внимание, что на этот раз для получения возвращенного итератора был использован const_iterator вместо простого итератора.

конец () noexcept

Возвращает итератор, который указывает сразу за последним элементом объекта карты.

конец () const noexcept

Возвращает итератор, который указывает сразу за последним элементом объекта карты. Когда построению объекта карты предшествует const, выражение end () const выполняется вместо end ().

unordered_map Операции

поиск итератора (const key_type & k)

Ищет пару данного ключа на карте. Если он найден, он возвращает итератор. Если не найден, он возвращает итератор, указывающий на конец карты, которая не является парой. В следующем коде показано, как использовать эту функцию-член:

unordered_map<символ,символ>umap;

umap['к'] знак равно 'b';umap['c'] знак равно 'd';umap['А также'] знак равно 'f';

unordered_map<символ,символ> ::итераторiterзнак равноumap.найти('c');
если (umap.найти('c') знак равноumap.конец())
{
пара<символ,символ>прзнак равно *iter;
Стоимость<<пр.первый << ',' <<пр.второй << ' п';
}

Результат: c, d

const_iterator find (const key_type & k) const;

Эта версия функции вызывается, если создание неупорядоченной карты начинается с const, что делает все элементы карты доступными только для чтения.

unordered_map Модификаторы

вставка пары (тип_значения && объект)
Неупорядоченная карта означает, что пары расположены не в каком-либо порядке. Итак, программа вставляет пару в любое удобное для нее место. Функция возвращает пару. Если вставка прошла успешно, bool будет иметь значение 1 для истины, в противном случае - 0 для false. Если вставка прошла успешно, итератор укажет на вновь вставленный элемент. Следующий код иллюстрирует использование:

unordered_map<const символ*, const символ*>umap;

umap['банан'] знак равно 'желтый';
umap['виноград'] знак равно 'зеленый';
umap['Инжир'] знак равно 'фиолетовый';

umap.вставлять({{'вишня', 'сеть'}, {'клубника', 'сеть'}});

Стоимость<<umap.размер() << ' п';

Результат: 5. Можно вставить более одной пары.

size_type стереть (const key_type & k)

Эта функция стирает пару из unordered_map. Следующий фрагмент кода иллюстрирует:

unordered_map<const символ*, const символ*>umap;

umap['банан'] знак равно 'желтый';
umap['виноград'] знак равно 'зеленый';
umap['Инжир'] знак равно 'фиолетовый';

intна однойзнак равноumap.стереть('виноград');

Стоимость<<umap.размер() << ' п';

Выход 2.
недействительный своп (unordered_map &)
Две неупорядоченные карты можно поменять местами, как показано в этом сегменте кода:

unordered_map<const символ*, const символ*>umap1знак равно {{'банан', 'желтый'},
{'виноград', 'зеленый'}, {'Инжир', 'фиолетовый'}, {'клубника', 'сеть'}};

unordered_map<const символ*, const символ*>umap2знак равно {{'вишня', 'сеть'}, {'Лайм', 'зеленый'}};

umap1.поменять местами(umap2);

unordered_map<const символ*, const символ*> ::итераторiter1знак равноumap1.начинать();
пара<const символ*, const символ*>pr1знак равно *iter1;
unordered_map<const символ*, const символ*> ::итераторiter2знак равноumap2.начинать();
пара<const символ*, const символ*>pr2знак равно *iter2;

Стоимость<< 'Первый ключ и размер umap1:'<<пр1.первый <<','<<umap1.размер() << ' п';
Стоимость<< 'Первый ключ и размер umap2'<<pr2.первый <<','<<umap2.размер() << ' п';
unordered_map<const символ*, const символ*>umap1знак равно {{'банан', 'желтый'},
{'виноград', 'зеленый'}, {'Инжир', 'фиолетовый'}, {'клубника', 'сеть'}};
unordered_map<const символ*, const символ*>umap2знак равно {{'вишня', 'сеть'}, {'Лайм', 'зеленый'}};

umap1.поменять местами(umap2);

unordered_map<const символ*, const символ*> ::итераторiter1знак равноumap1.начинать();
пара<const символ*, const символ*>pr1знак равно *iter1;
unordered_map<const символ*, const символ*> ::итераторiter2знак равноumap2.начинать();
пара<const символ*, const символ*>pr2знак равно *iter2;

Стоимость<< 'Первый ключ и размер umap1:'<<пр1.первый <<','<<umap1.размер() << ' п';
Стоимость<< 'Первый ключ и размер umap2'<<pr2.первый <<','<<umap2.размер() << ' п';

Результат:

Первый ключ и размер umap1: lime, 2

Первый ключ и размер клубники umap2, 4

Карта неупорядочена. Обратите внимание, что длина карты при необходимости увеличивается. Типы данных должны быть одинаковыми.

Класс и его экземпляры

Значение относится к типу данных, как созданный объект относится к классу. Построение неупорядоченной карты также может принимать класс как тип данных. Следующая программа иллюстрирует это:

#включают
#включают
используя пространство имен std;

класс TheCla
{
общественный:
intна одной;
статический символch;

пустотафункция(символнет, const символ *п)
{
Стоимость<< 'Есть ' <<на одной<< 'книги стоят' <<нет<<п<< ' в магазине.' << ' п';
}
статический пустотавеселье(символch)
{
если (ch== 'к')
Стоимость<< 'Официальная статическая функция-член' << ' п';
}
};

intглавный()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

unordered_map<const символ*,TheCla>umap;
umapзнак равно {{'банан',obj1}, {'виноград',obj2}, {'Инжир',obj3}, {'клубника',obj4}, {'Лайм',obj5}};

Стоимость<<umap.размер() << ' п';

возвращение 0;
}

Результат: 5.

Определение класса имеет два открытых члена данных и две публичные функции члена. В функции main () создаются экземпляры различных объектов класса. Затем создается неупорядоченная карта, где каждая пара состоит из имени фрукта и объекта из класса. Отображается размер карты. Программа компилируется без предупреждений или сообщений об ошибках.

Применение карты

Массив связывает индекс со значением. Пары ключ / значение существуют во многих жизненных ситуациях, которые можно запрограммировать. Пара ключ / значение фрукт / цвет - лишь один из примеров. Другой пример - имена людей и их возраст. В этом случае пара будет типа пара. Это также может быть пара. В последнем случае будет использоваться директива предварительной обработки. Пара ключ / значение по-прежнему может быть именами супружеских пар. В странах, где существует многоженство, у одного мужчины будут разные жены.

Формирование карты

Карта - это не двухмерный массив с двумя столбцами. Карта работает с хеш-функцией. Ключ кодируется хеш-функцией в целое число массива. Именно этот массив содержит значения. Таким образом, на самом деле существует один массив со значениями, и ключи отображаются в индексы массива, и, таким образом, выполняется соответствие между ключами и значениями. Хеширование - обширная тема, которая не рассматривается в этой статье.

Заключение

Карта, также известная как ассоциативный массив, представляет собой список элементов, где каждый элемент представляет собой пару ключ / значение. Итак, каждый ключ соответствует значению. В C ++ карта реализована как структура данных с функциями-членами и операторами. Упорядоченная карта - это карта, в которой пары элементов упорядочены по ключам. Неупорядоченная карта - это карта, на которой нет порядка.

Технически хеш состоит из парных элементов. Фактически, пара представляет собой целую структуру данных со своими функциями-членами и операторами. Два параметра шаблона для пары - это те же два параметра шаблона для unordered_map.

Initializer_list для карты - это литерал массива литералов. Каждый внутренний литерал состоит из двух объектов, пары ключ / значение.

Функции-члены и операторы для unordered_map можно разделить на следующие категории: создание / копирование unordered_map, емкость unordered_map, итератор unordered_map, операции unordered_map и модификаторы unordered_map.

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

Chrys