C ++

Уникальные и упорядоченные контейнеры в C ++

Уникальные и упорядоченные контейнеры в C ++
6, 10, 2, 8, 4 - набор; 2, 4, 6, 8, 10 - это набор одинаковых целых чисел, расположенных в порядке возрастания. В математике набор имеет уникальные элементы (отдельные элементы), то есть ни один элемент не встречается более одного раза. Кроме того, мультимножество - это набор, в котором любой элемент может встречаться более одного раза. 6, 6, 10, 2, 2, 8, 4, 4, 4 - мультимножество. 2, 2, 4, 4, 4, 6, 6, 8, 10 - это то же мультимножество, но с элементами, расположенными в порядке возрастания. В этой статье не рассматривается мультимножество. Он имеет дело со структурой данных C ++, называемой, set.

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

Пример карты: 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. Первая вставленная здесь пара ключ / значение - 'c', 3, где 'c' - ключ, а 30 - значение. Эта карта не упорядочена по ключам. Упорядочивание этой карты по клавишам дает 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Обратите внимание, что могут быть повторяющиеся значения, но не повторяющиеся ключи. Упорядоченная карта - это карта, упорядоченная по ключам.

Мультимножество относится к набору, как мультимножество для карты. Это означает, что есть карты с повторяющимися ключами. Пример мульти-карты: 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. И, как указывалось выше, эта статья не имеет отношения к мульти-карте, скорее, она касается структуры данных C ++, называемой, map.

В C ++ структура данных - это структура со свойствами (членами данных) и методами (функциями-членами). Данные структуры представляют собой список; набор - это список; карта - это список пар ключ / значение.

В этой статье обсуждаются основы наборов и отображений в C ++, и, чтобы лучше понять эту статью, читатель должен иметь базовые знания C++.

Содержание статьи:

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

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

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

Создание набора или карты:

Создание экземпляра набора из его класса набора создает набор; создание экземпляра карты из ее класса карты создает карту. Созданному таким образом объекту дается имя по выбору программиста.

Для создания набора программа должна начинаться с:

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

Обратите внимание на директиву «#include », Который включает в себя библиотеку наборов с классом набора, из которого будут созданы экземпляры структур данных.

Чтобы создать карту, программа должна начинаться с:

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

Обратите внимание на директиву «#include », Который включает в себя библиотеку карт, в которой есть класс карты, из которого будут созданы экземпляры структур данных карты.

Синтаксис для создания пустого набора:

набор objectName

Пример:

набор setObj;

Пример создания набора с содержимым:

набор setObj (6, 10, 2, 8, 4);

Синтаксис для создания пустой карты:

карта objectName

Пример:

карта mapObj;

Пример создания карты с содержимым:

карта mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Основы итератора:

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

Функция-член begin ()

Функция-член begin () возвращает итератор, указывающий на первый элемент списка. Следующий пример иллюстрирует это для набора:

набор setObj (6, 10, 2, 8, 4);
набор:: итератор iter = setObj.начинать();
cout << *iter << '\n';

Обратите внимание на то, как begin () использовался с setObj и оператором точки. iter - это возвращаемый объект итератора. Также обратите внимание на то, как он был объявлен. * - косвенный оператор. При использовании с iter он возвращает первый элемент набора; первый элемент - 2 вместо 6 - см. объяснение ниже.

В следующем примере показано использование функции begin () для карты:

карта mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
карта:: итератор iter = mapObj.начинать();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Обратите внимание на то, как begin () использовался с mapObj и оператором точки. iter - это возвращаемый объект итератора. Также обратите внимание на то, как он был объявлен. «Первый», как здесь используется, относится к ключу. «Второй» относится к значению, соответствующему ключу. Посмотрите, как они использовались с iter для получения компонентов начального элемента списка. Первый элемент - a, 10 вместо c, 30 - см. Объяснение ниже.

Функция-член begin () const

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

константный набор setObj (6, 10, 2, 8, 4);
набор:: const_iterator iter = setObj.начинать();
cout << *iter << '\n';

Обратите внимание на то, как begin () использовался с setObj и оператором точки. Сразу после begin () не было введено «const». Однако "const" предшествует объявлению. iter - это возвращаемый объект постоянного итератора, который отличается от обычного итератора. Также обратите внимание на то, как он был объявлен. * - косвенный оператор; при использовании с iter, он возвращает первый элемент набора. Первый элемент - 2 вместо 6 - см. Объяснение ниже.

В следующем примере показано использование функции begin () const для карты:

const карта mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
карта:: const_iterator iter = mapObj.начинать();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Обратите внимание на то, как begin () использовался с mapObj и оператором точки. Сразу после begin () не было введено «const». Однако "const" предшествует объявлению. iter здесь - это возвращаемый объект постоянного итератора, который отличается от обычного итератора. Также обратите внимание на то, как он был объявлен. «Первый», как здесь используется, относится к ключу; «Второй», как здесь используется, относится к значению, соответствующему ключу. Посмотрите, как они использовались с iter для получения компонентов начального элемента списка. Первый элемент - a, 10 вместо c, 30 - см. Объяснение ниже.

Функция-член end ()

Функция-член end () возвращает итератор, который указывает сразу после конца списка. Следующий пример иллюстрирует это для набора:

набор setObj (6, 10, 2, 8, 4);
набор:: итератор iter = setObj.конец();
cout << *iter << '\n';

Обратите внимание на способ использования end () с setObj и оператором точки. iter - это возвращаемый объект итератора. Также обратите внимание на то, как он был объявлен. * - косвенный оператор; при использовании с iter, он возвращает последний + 1 элемент набора. На компьютере автора последний + 1 элемент равен 5, чего нет в списке. Итак, будьте осторожны, чтобы не использовать этот элемент.

В следующем примере показано использование функции end () для карты:

карта mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
карта:: итератор iter = mapObj.конец();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Обратите внимание на способ использования end () с mapObj и оператором точки. iter - это возвращаемый объект итератора. Также обратите внимание на то, как он был объявлен. * - косвенный оператор; при использовании с iter, он возвращает последний + 1 элемент карты. На компьютере автора последний + 1 элемент - , 0, которого нет в списке. Итак, будьте осторожны, чтобы не использовать этот элемент.

Функция-член end () const

Функция-член end () const возвращает итератор, который указывает сразу после конца списка, когда объявление набора начинается с const (для константы). В этом случае значение в списке, на которое ссылается возвращаемый итератор, не может быть изменено итератором. Следующий пример иллюстрирует его использование для набора:

константный набор setObj (6, 10, 2, 8, 4);
набор:: const_iterator iter = setObj.конец();
cout << *iter << '\n';

Обратите внимание на способ использования end () с setObj и оператором точки. Сразу после end () не было набрано «const». Однако "const" предшествует объявлению. iter - это возвращаемый объект итератора. Также обратите внимание на то, как он был объявлен. * - косвенный оператор; при использовании с iter, он возвращает последний + 1 элемент набора.

В следующем примере показано использование функции «end () const» для карты:

const карта mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
карта:: const_iterator iter = mapObj.конец();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Обратите внимание на способ использования end () с mapObj и оператором точки. Сразу после end () не было введено ни одной «const». Однако "const" предшествует объявлению. iter - это возвращаемый постоянный объект итератора, который отличается от обычного итератора. Также внимательно следите за тем, как это было заявлено.

Доступ к элементам для набора и карты:

Набор

С набором элемент читается с помощью оператора косвенного обращения. Первые два элемента набора читаются в следующем примере:

набор setObj (6, 10, 2, 8, 4);
набор:: итератор iter = setObj.начинать();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

На выходе будет 2, затем 4 - см. Объяснение ниже. Чтобы указать на следующий элемент списка, итератор увеличивается.

Примечание: элемент нельзя изменить с помощью оператора косвенного обращения для набора. Например, «* iter = 9;» это невозможно.

карта

Карта состоит из пар ключ / значение. Значение можно прочитать с помощью соответствующего ключа и изменить с помощью того же ключа. Следующий фрагмент кода иллюстрирует это:

карта mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj['b'] << '\n';
mapObj ['b'] = 55;
cout << mapObj['b'] << '\n';

Результат:

20
55

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

Порядок элементов в наборе или карте:

Элементы можно вставлять в набор в любом порядке. Однако после вставки набор переупорядочивает свои элементы в порядке возрастания. Порядок возрастания - порядок по умолчанию. Если нужен убывающий порядок, то набор должен быть объявлен, как в следующем примере:

набор > setObj (6, 10, 2, 8, 4);

Итак, после типа e.грамм., int, в шаблоне ставится запятая, за которой следует «больше»”В угловых скобках.

Элементы можно вставлять на карту в любом порядке. Однако после вставки карта меняет свои элементы в порядке возрастания по ключу (только), сохраняя связь между каждым ключом и его значением. Порядок возрастания - это порядок по умолчанию; если нужен убывающий порядок, то карту нужно объявить, как в следующем примере:

карта > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Итак, после пары типов e.грамм., «Char, int», для шаблона стоит запятая, за которой следует «больше»”В угловых скобках.

Переход по множеству

Цикл while или for с итератором можно использовать для обхода набора. В следующем примере цикл for используется для обхода набора, который был настроен в порядке убывания:

набор > setObj (6, 10, 2, 8, 4);
для (установить:: итератор iter = setObj.начинать(); iter != setObj.конец(); ++ iter)

cout << *iter << ";

Результат:

10 8 6 4 2

Увеличение итератора указывает на следующий элемент.

Путешествие по карте

Для обхода карты можно использовать цикл while или for с итератором. В следующем примере цикл for используется для просмотра карты, настроенной в порядке убывания:

карта > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
для (карта:: итератор iter = mapObj.начинать(); iter != mapObj.конец(); ++ iter)

cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Результат:

e, 40, d, 30, c, 30, b, 20, a, 10,

Увеличение итератора указывает на следующий элемент. «Первый» в коде относится к ключу, а «второй» относится к соответствующему значению. Обратите внимание, как эти значения были получены для вывода.

Другие часто используемые функции-члены:

Функция size ()

Эта функция возвращает целое число - количество элементов в списке. Пример установки:

набор > setObj (6, 10, 2, 8, 4);
cout << setObj.size() << '\n';

Выход 5.

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

карта > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj.size() << '\n';

Выход 5.

Функция insert ()

набор

набор не позволяет дублировать. Таким образом, любой вставленный дубликат автоматически отклоняется. С установленным аргументом функции insert () является значение, которое нужно вставить. Значение помещается в позицию, в которой порядок в наборе остается восходящим или нисходящим. Пример:

набор setObj (6, 10, 2, 8, 4);
setObj.вставка (6);
setObj.вставка (9);
setObj.вставка (12);
для (установить:: итератор iter = setObj.начинать(); iter != setObj.конец(); ++ iter)

cout << *iter << ";

Результат:

2 4 6 8 9 10 12

Примечание: функцию-член insert () можно использовать для заполнения пустого набора.

карта

карта не позволяет дублировать по ключу. Таким образом, любой вставленный дубликат автоматически отклоняется. При использовании карты аргументом функции insert () является пара ключ / значение в фигурных скобках. Элемент помещается в позицию по ключу, при этом порядок на карте остается восходящим или нисходящим. Пример:

карта mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.вставить ('е', 80);
mapObj.вставить ('f', 50);
mapObj.вставить ('g', 60);
для (карта:: итератор iter = mapObj.начинать(); iter != mapObj.конец(); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Результат:

a, 10, b, 20, c, 30, d, 30, e, 40, f, 50, g, 60,

Примечание: функцию-член insert () можно использовать для заполнения пустой карты.

Функция empty ()

Эта функция возвращает истину, если список пуст, и ложь, если в противном случае. Пример установки:

набор setObj (6, 10, 2, 8, 4);
bool ret = setObj.пустой();
cout << ret << '\n';

Вывод равен 0 для false, что означает, что набор здесь не пустой.

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

карта mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = mapObj.пустой();
cout << ret << '\n';

Вывод равен 0 для false, что означает, что карта здесь не пуста.

Функция erase ()

набор

Рассмотрим следующий фрагмент кода:

набор setObj (10, 20, 30, 40, 50);
набор:: итератор iter = setObj.начинать();
набор:: итератор itr = setObj.стереть (итер);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.стереть (итр);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Результат:

новый размер: 4
следующее значение: 20
новый размер: 3
следующее значение: 30

Функция erase () принимает итератор, который указывает на элемент в качестве аргумента. После стирания элемента функция erase () возвращает итератор, указывающий на следующий элемент.

карта

Рассмотрим следующий фрагмент кода:

карта mapObj ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
карта:: итератор iter = mapObj.начинать();
карта:: итератор itr = mapObj.стереть (итер);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapObj.стереть (итр);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Результат:

новый размер: 4
следующая пара значений: b, 20
новый размер: 3
следующая пара значений: c, 30

Функция erase () принимает итератор, который указывает на элемент в качестве аргумента. После стирания элемента функция erase () возвращает итератор, указывающий на следующий элемент.

Функция clear ()

Функция clear () удаляет все элементы в списке. Пример установки:

набор setObj (6, 10, 2, 8, 4);
setObj.Чисто();
cout << setObj.size() << '\n';

На выходе 0.

пример карты:

карта mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.Чисто();
cout << mapObj.size() << '\n';

На выходе 0.

Заключение:

Заданная структура данных в C ++ - это структура, в которой список элементов хранится в порядке возрастания по умолчанию или в порядке убывания по выбору программиста. Все элементы набора уникальны. Структура данных карты в C ++ - это структура, в которой список представляет собой хэш пар ключ / значение, хранящихся в порядке возрастания ключей по умолчанию или в порядке убывания ключей по выбору программиста. Ключи также уникальны, и могут быть повторяющиеся значения. Основным членом данных любой из структур является список. Любая структура имеет функции-члены, некоторые из которых обычно используются.

Как использовать чит-движок GameConqueror в Linux
В статье содержится руководство по использованию чит-движка GameConqueror в Linux. Многие пользователи, играющие в игры на Windows, часто используют п...
Лучшие эмуляторы игровой консоли для Linux
В этой статье будет перечислено популярное программное обеспечение для эмуляции игровых консолей, доступное для Linux. Эмуляция - это уровень совмести...
Лучшие дистрибутивы Linux для игр в 2021 году
Операционная система Linux прошла долгий путь от своего первоначального простого серверного вида. Эта ОС значительно улучшилась за последние годы и те...