C ++

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

unordered_map umap;
umap ["банан"] = "желтый";
umap ["виноград"] = "зеленый";
umap ["рис"] = "фиолетовый";

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

unordered_map umap ("банан", "желтый",
"виноградный", "зеленый", "инжирный", "фиолетовый");

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

unordered_map umap = "банан", "желтый",
"виноградный", "зеленый", "инжирный", "фиолетовый";

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

unordered_map umap1 ("банан", "желтый",
"виноградный", "зеленый", "инжирный", "фиолетовый");
unordered_map umap2 (umap1);

Пара Элемент

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

пара пр = 'д', "море";
cout << pr.first << '\n';
cout << pr.second << '\n';

Результат:

d
море

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

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

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

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

unordered_map umap;
umap ["банан"] = "желтый";
umap ["виноград"] = "зеленый";
umap ["рис"] = "фиолетовый";
const char * ret = umap ["виноград"];
cout << ret <<'\n';

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

unordered_map Емкость

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

unordered_map umap;
umap ["банан"] = "желтый";
umap ["виноград"] = "зеленый";
umap ["рис"] = "фиолетовый";
cout << umap.size() <<'\n';

Выход 3.

bool empty () const noexcept

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

unordered_map umap;
cout << umap.empty() <<'\n';

Выход 1.

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

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

begin () noexcept

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

unordered_map umap;
umap ["банан"] = "желтый"; umap ["виноград"] = "зеленый"; umap ["рис"] = "фиолетовый";
unordered_map:: итератор iter = umap.начинать();
пара пр = * итер;
cout << pr.first << ", " << pr.second << '\n';

Результат: инжир, фиолетовый. Карта неупорядочена.

begin () const noexcept;

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

const unordered_map umap ("банан", "желтый",
"виноградный", "зеленый", "инжирный", "фиолетовый");
unordered_map:: const_iterator iter = umap.начинать();
пара пр = * итер;
cout << pr.first << ", " << pr.second << '\n';

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

конец () noexcept

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

конец () const noexcept

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

unordered_map Операции

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

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

unordered_map umap;
umap ['а'] = 'б'; umap ['c'] = 'd'; umap ['e'] = 'е';
unordered_map:: итератор iter = umap.найти ('c');
если (umap.найти ('c') != umap.конец())

пара пр = * итер;
cout << pr.first << ", " << pr.second << '\n';

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

const_iterator find (const key_type & k) const;

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

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

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

unordered_map umap;
umap ["банан"] = "желтый";
umap ["виноград"] = "зеленый";
umap ["рис"] = "фиолетовый";
umap.insert ("вишня", "красный", "клубничный", "красный");
cout << umap.size() << '\n';

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

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

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

unordered_map umap;
umap ["банан"] = "желтый";
umap ["виноград"] = "зеленый";
umap ["рис"] = "фиолетовый";
int число = umap.стереть («виноград»);
cout << umap.size() << '\n';

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

unordered_map umap1 = "банан", "желтый",
"виноградный", "зеленый", "инжирный", "фиолетовый", "клубничный", "красный";
unordered_map umap2 = "вишня", "красный", "салатовый", "зеленый";
umap1.своп (umap2);
unordered_map:: итератор iter1 = umap1.начинать();
пара пр1 = * iter1;
unordered_map:: итератор iter2 = umap2.начинать();
пара пр2 = * iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';
unordered_map umap1 = "банан", "желтый",
"виноградный", "зеленый", "инжирный", "фиолетовый", "клубничный", "красный";
unordered_map umap2 = "вишня", "красный", "салатовый", "зеленый";
umap1.своп (umap2);
unordered_map:: итератор iter1 = umap1.начинать();
пара пр1 = * iter1;
unordered_map:: итератор iter2 = umap2.начинать();
пара пр2 = * iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';

Результат:

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

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

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

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

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

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

общественность:
int num;
static char ch;
void func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

статическая пустота весело (char ch)

если (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

TheCla obj1; TheCla obj2; TheCla obj3; TheCla obj4; TheCla obj5;
unordered_map umap;
umap = "банан", obj1, "виноград", obj2, "инжир", obj3, "клубника", obj4, "лайм", obj5;
cout << umap.size() << '\n';
возврат 0;

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

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

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

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

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

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

Заключение

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

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

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

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

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

Chrys

Лучшие приложения для сопоставления геймпадов для Linux
Если вам нравится играть в игры на Linux с помощью геймпада вместо стандартной системы ввода с клавиатуры и мыши, для вас есть несколько полезных прил...
Полезные инструменты для геймеров Linux
Если вам нравится играть в игры на Linux, скорее всего, вы использовали приложения и утилиты, такие как Wine, Lutris и OBS Studio, для улучшения игров...
Игры HD Remastered для Linux, ранее не выпускавшиеся для Linux
Многие разработчики и издатели игр придумывают HD-ремастеры старых игр, чтобы продлить жизнь франшизы, порадовать фанатов, требующих совместимости с с...