Неупорядоченная карта в C++

Неупорядоченная карта в C++ Программирование и разработка

Неупорядоченная карта в C++

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

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

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

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

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

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

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

#include <iostream>
#include <unordered_map>
using namespace std;

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

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

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

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

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

    unordered_map<const char*, const char*> umap;

umap[«banana»] = «yellow»;
umap[«grape»] = «green»;
umap[«fig»] = «purple»;

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

Построение с помощью Initializer_list

Это можно сделать следующим образом:

unordered_map<const char*, const char*> umap ({{«banana», «yellow»},
{«grape», «green»}, {«fig», «purple»}});

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

Пример:

unordered_map<const char*, const char*> umap = {{«banana», «yellow»},
{«grape», «green»}, {«fig», «purple»}};

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

примера unordered_map :

unordered_map<const char*, const char*> umap1 ({{«banana», «yellow»},
{«grape», «green»}, {«fig», «purple»}});
unordered_map<const char*, const char*> umap2 (umap1);

Пара <type1, type2> Element

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

pair<char, const char*> pr = {‘d’, «sea»};
cout << pr.first << \n;
cout << pr.second << \n;

Результат:

d
sea

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

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

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

mapped_type & operator [] (key_type && k)

Возвращает значение для соответствующего ключа. Пример:

    unordered_map<const char*, const char*> umap;

umap[«banana»] = «yellow»;
umap[«grape»] = «green»;
umap[«fig»] = «purple»;

const char *ret = umap[«grape»];

cout << ret <<\n;

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

unordered_map Емкость

   unordered_map<const char*, const char*> umap;

umap[«banana»] = «yellow»;
umap[«grape»] = «green»;
umap[«fig»] = «purple»;

cout << umap.size() <<\n;

Выход 3.

bool empty () const noexcept

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

    unordered_map<const char*, const char*> umap;
cout << umap.empty() <<\n;

Выход 1.

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

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

begin () noexcept

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

    unordered_map<const char*, const char*> umap;

umap[«banana»] = «yellow»; umap[«grape»] = «green»; umap[«fig»] = «purple»;

unordered_map<const char*, const char*>::iterator iter = umap.begin();
pair<const char*, const char*> pr = *iter;
cout << pr.first << «, « << pr.second << \n;

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

begin () const noexcept;

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

    const unordered_map<const char*, const char*> umap ({{«banana», «yellow»},
{«grape», «green»}, {«fig», «purple»}});

unordered_map<const char*, const char*>::const_iterator iter = umap.begin();
pair<const char*, const char*> pr = *iter;
cout << pr.first << «, « << pr.second << \n;

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

end() noexcept

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

end() const noexcept

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

unordered_map Операции

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

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

    unordered_map<char, char> umap;

umap[‘a’] = ‘b’; umap[‘c’] = ‘d’; umap[‘e’] = ‘f’;

unordered_map<char, char>::iterator iter = umap.find(‘c’);
if (umap.find(‘c’) != umap.end())
{
pair<char, char> pr = *iter;
cout << pr.first << «, « << pr.second << \n;
}

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

const_iterator find (const key_type & k) const;

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

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

pair <iterator, bool> insert (value_type && obj)

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

    unordered_map<const char*, const char*> umap;

umap[«banana»] = «yellow»;
umap[«grape»] = «green»;
umap[«fig»] = «purple»;

umap.insert({{«cherry», «red»}, {«strawberry», «red»}});

cout << umap.size() << \n;

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

size_type erase(const key_type& k)

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

    unordered_map<const char*, const char*> umap;

umap[«banana»] = «yellow»;
umap[«grape»] = «green»;
umap[«fig»] = «purple»;

int num = umap.erase(«grape»);

cout << umap.size() << \n;

Результатом будет 2.

void swap (unordered_map &)

Две неупорядоченные карты можно поменять местами, как показано в этом сегменте кода:

     unordered_map<const char*, const char*> umap1 = {{«banana», «yellow»},
{«grape», «green»}, {«fig», «purple»}, {«strawberry», «red»}};

unordered_map<const char*, const char*> umap2 = {{«cherry», «red»}, {«lime», «green»}};

umap1.swap(umap2);

unordered_map<const char*, const char*>::iterator iter1 = umap1.begin();
pair<const char*, const char*> pr1 = *iter1;
unordered_map<const char*, const char*>::iterator iter2 = umap2.begin();
pair<const char*, const char*> pr2 = *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<const char*, const char*> umap1 = {{«banana», «yellow»},
{«grape», «green»}, {«fig», «purple»}, {«strawberry», «red»}};
unordered_map<const char*, const char*> umap2 = {{«cherry», «red»}, {«lime», «green»}};

umap1.swap(umap2);

unordered_map<const char*, const char*>::iterator iter1 = umap1.begin();
pair<const char*, const char*> pr1 = *iter1;
unordered_map<const char*, const char*>::iterator iter2 = umap2.begin();
pair<const char*, const char*> pr2 = *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

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

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

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

#include <iostream>
#include <unordered_map>
using namespace std;

class TheCla
{
public:
int num;
static char ch;

void func (char cha, const char *str)
{
cout << «There are « << num << » books worth « << cha << str << » in the store.» << \n;
}
static void fun (char ch)
{
if (ch == ‘a’)
cout << «Official static member function» << \n;
}
};

int main()
{
TheCla obj1; TheCla obj2; TheCla obj3; TheCla obj4; TheCla obj5;

unordered_map <const char*, TheCla> umap;
umap = {{«banana», obj1}, {«grape», obj2}, {«fig», obj3}, {«strawberry», obj4}, {«lime», obj5}};

cout << umap.size() << \n;

return 0;
}

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

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

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

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

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

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

Заключение

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

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

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

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

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

Читайте также:  Реализация класса Singleton в C++
Оцените статью
bestprogrammer.ru
Добавить комментарий