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 ++ непридатний набір - це клас, а також непридатна карта. Коли об'єкт інстанціюється з непридатного набору або непридатної карти, об'єкт стає реальною структурою даних. У структурі даних набору та карти основним елементом даних є список. Ну, набір і карта утворюють групу контейнерів, що називаються упорядкованими асоціативними контейнерами. Невпорядкований набір і невпорядкована карта також існують, але, на жаль, у цій статті не розглядаються.

Створення набору або карти:

Примірник набору з його класу наборів - це створення набору; інстанціювання карти з її класу карт створює карту. Створеному таким чином об'єкту надається ім'я на вибір програміста.

Для того, щоб створити набір, програма повинна починатися з:

#включати
#включати
використання простору імен 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.begin ();
кут << *iter << '\n';

Зверніть увагу на те, як метод begin () використовувався з setObj та оператором крапок. iter - це повернутий об'єкт ітератора. Крім того, зверніть увагу на те, як це було оголошено. * є оператором непрямої дії. Як використовується з iter, він повертає перший елемент набору; перший елемент - 2 замість 6 - див. пояснення нижче.

Наступний приклад ілюструє використання функції begin () для карти:

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

Зверніть увагу, як метод begin () був використаний з mapObj та оператором крапок. iter - це повернутий об'єкт ітератора. Крім того, зверніть увагу на те, як це було оголошено. "Перший", як тут використовується, відноситься до ключа. "Другий" відноситься до значення, що відповідає ключу. Зверніть увагу, як вони використовувались разом з iter для отримання початкових компонентів списку. Першим елементом є a, 10 замість c, 30 - див. Пояснення нижче.

Функція члена “begin () const”

Функція-член “begin () const” повертає ітератор, який вказує на перший елемент списку, коли оголошення набору починається з const (для константи). За цієї умови значення у списку, на яке посилається повернутий ітератор, не може бути змінено ітератором. Наступний приклад ілюструє його використання для набору:

const набір setObj (6, 10, 2, 8, 4);
встановити:: const_iterator iter = setObj.begin ();
кут << *iter << '\n';

Зверніть увагу на те, як метод begin () використовувався з setObj та оператором крапок. Жодна “const” не була введена відразу після start (). Однак "const" передує декларації. iter - це повернутий константний ітератор, який відрізняється від звичайного ітератора. Крім того, зверніть увагу на те, як це було оголошено. * є непрямим оператором; як використовується з iter, він повертає перший елемент набору. Перший елемент - 2 замість 6 - див. Пояснення нижче.

Наступний приклад ілюструє використання функції “begin () const” для карти:

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

Зверніть увагу, як метод begin () був використаний з mapObj та оператором крапок. Жодна “const” не була введена відразу після start (). Однак "const" передує декларації. iter - це повернутий константний ітератор, який відрізняється від звичайного ітератора. Крім того, зверніть увагу на те, як це було оголошено. "Перший", як тут використовується, відноситься до ключа; "Другий", як тут використовується, відноситься до значення, що відповідає ключу. Зверніть увагу, як вони використовувались разом з iter для отримання початкових компонентів списку. Першим елементом є a, 10 замість c, 30 - див. Пояснення нижче.

Функція члена end ()

Функція-член end () повертає ітератор, який вказує відразу після кінця списку. Наступний приклад ілюструє це для набору:

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

Зверніть увагу на те, як end () використовувався з setObj та оператором точки. iter - це повернутий об'єкт ітератора. Крім того, зверніть увагу на те, як це було оголошено. * є непрямим оператором; як використовується з iter, він повертає останній + 1 елемент набору. На комп'ютері автора цей останній + 1 елемент - 5, якого немає в списку. Отже, обережно, щоб не використовувати цей елемент.

Наступний приклад ілюструє використання функції end () для карти:

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

Зверніть увагу на те, як end () був використаний з mapObj та оператором точки. iter - це повернутий об'єкт ітератора. Крім того, зверніть увагу на те, як це було оголошено. * є непрямим оператором; як використовується з iter, він повертає останній + 1 елемент карти. На комп'ютері автора цей останній + 1 елемент - , 0, якого немає в списку. Отже, обережно, щоб не використовувати цей елемент.

Функція члена “end () const”

Функція-член “end () const” повертає ітератор, який вказує відразу після кінця списку, коли оголошення набору починається з const (для константи). За цієї умови значення у списку, на яке посилається повернутий ітератор, не може бути змінено ітератором. Наступний приклад ілюструє його використання для набору:

const набір setObj (6, 10, 2, 8, 4);
встановити:: const_iterator iter = setObj.кінець ();
кут << *iter << '\n';

Зверніть увагу на те, як end () використовувався з setObj та оператором точки. Жодна “const” не була введена відразу після закінчення (). Однак "const" передує декларації. iter - це повернутий об'єкт ітератора. Крім того, зверніть увагу на те, як це було оголошено. * є непрямим оператором; як використовується з iter, він повертає останній + 1 елемент набору.

Наступний приклад ілюструє використання функції “end () const” для карти:

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

Зверніть увагу на те, як end () використовувався з mapObj та оператором крапок. Жодна “const” не була введена відразу після закінчення (). Однак "const" передує декларації. iter - це повернутий константний ітератор, який відрізняється від звичайного ітератора. Також уважно стежте за тим, як це було оголошено.

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

Встановити

З набором елемент зчитується за допомогою оператора опосередкування. Перші два елементи набору читаються в наступному прикладі:

встановити setObj (6, 10, 2, 8, 4);
встановити:: ітератор iter = setObj.begin ();
кут << *iter << '\n';
++ітер;
кут << *iter << '\n';

Результат - 2, а потім 4 - див. Пояснення нижче. Щоб вказати на наступний елемент списку, ітератор збільшується.

Примітка: Елемент не можна змінити за допомогою оператора непрямого введення для набору. Наприклад, "* iter = 9;" неможливо.

карта

Карта складається з пар ключ / значення. Значення можна прочитати за допомогою відповідного ключа та змінити за допомогою того самого ключа. Наступний сегмент коду ілюструє це:

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

Результат:

20
55

Точковий оператор тут не використовувався. Натомість використовувався оператор квадратних дужок, який приймає ключ як вміст.

Порядок елементів у наборі або на карті:

Елементи можна вставляти в набір у будь-якому порядку. Однак після вставки набір переставляє свої елементи за зростанням. За зростанням - це порядок за замовчуванням. Якщо потрібен низхідний порядок, тоді набір повинен бути оголошений, як у наступному прикладі:

встановити > setObj (6, 10, 2, 8, 4);

Отже, після типу, напр.g., int, для шаблону є кома, після якої йде „більший”У кутових дужках.

Елементи можна вставляти на карту в будь-якому порядку. Однак після вставлення карта переставляє свої елементи у порядку зростання за ключем (лише), зберігаючи зв'язок між кожним ключем та його значенням. За зростанням - це замовлення за замовчуванням; якщо потрібен низхідний порядок, то карту потрібно оголосити, як у наступному прикладі:

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

Отже, після пари типів, напр.g., “Char, int”, для шаблону є кома, після якої йде “більший”У кутових дужках.

Обхід множини

Цикл while або for-loop з ітератором можна використовувати для обходу набору. У наступному прикладі використовується цикл for для обходу набору, налаштованого за спаданням:

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

кут << *iter << ";

Результат:

10 8 6 4 2

Збільшення ітератора вказує його на наступний елемент.

Об’їзд карти

Цикл while або for-loop з ітератором можна використовувати для обходу карти. У наступному прикладі використовується цикл for для обходу карти, налаштованої за спаданням:

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

кут << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Результат:

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

Збільшення ітератора вказує його на наступний елемент. «Перший» у коді відноситься до ключа, а «другий» - до відповідного значення. Зверніть увагу, як ці значення були отримані для вихідних даних.

Інші часто використовувані функції членів:

Розмір () Функція

Ця функція повертає ціле число, яке є кількістю елементів у списку. Подайте приклад:

встановити > setObj (6, 10, 2, 8, 4);
кут << setObj.size() << '\n';

Вихід - 5.

Приклад карти:

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

Вихід - 5.

Функція вставки ()

встановити

набір не дозволяє дублювати. Отже, будь-який вставлений копія мовчки відхиляється. З набором аргументом функції insert () є значення, яке потрібно вставити. Значення встановлюється в положення, при якому порядок у наборі залишається зростаючим або спадним. Приклад:

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

кут << *iter << ";

Результат:

2 4 6 8 9 10 12

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

карта

карта не дозволяє дублювати за ключем. Отже, будь-який вставлений копія мовчки відхиляється. На карті аргументом функції insert () є пара ключ / значення в фігурних дужках. Елемент вкладається в позицію за допомогою ключа, при якому порядок на карті залишається зростаючим або спадаючим. Приклад:

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

Результат:

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

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

Функція empty ()

Ця функція повертає true, якщо список порожній, і false, якщо інакше. Подайте приклад:

встановити setObj (6, 10, 2, 8, 4);
bool ret = setObj.порожній ();
кут << ret << '\n';

Результатом є 0 для false, тобто набір тут не порожній.

Приклад карти:

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

Результатом є 0 для false, тобто карта тут не порожня.

Функція стирання ()

встановити

Розглянемо такий сегмент коду:

встановити setObj (10, 20, 30, 40, 50);
встановити:: ітератор iter = setObj.begin ();
встановити:: ітератор itr = setObj.стирати (ітер);
кут << "new size: " << setObj.size() << '\n';
кут << "next value: " << *itr << '\n';
itr = setObj.стирати (itr);
кут << "new size: " << setObj.size() << '\n';
кут << "next value: " << *itr << '\n';

Результат:

новий розмір: 4
наступне значення: 20
новий розмір: 3
наступне значення: 30

Функція erase () приймає ітератор, який вказує на елемент як аргумент. Після стирання елемента функція erase () повертає ітератор, який вказує на наступний елемент.

карта

Розглянемо такий сегмент коду:

карта mapObj ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
карта:: ітератор iter = mapObj.begin ();
карта:: ітератор itr = mapObj.стирати (ітер);
кут << "new size: " << mapObj.size() << '\n';
кут << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapObj.стирати (itr);
кут << "new size: " << mapObj.size() << '\n';
кут << "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.clear ();
кут << setObj.size() << '\n';

Вихід - 0.

приклад карти:

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

Вихід - 0.

Висновок:

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

Як зафіксувати та транслювати ігровий сеанс на Linux
Раніше грати в ігри вважалося лише хобі, але з часом ігрова індустрія спостерігала величезний ріст з точки зору технологій та кількості гравців. Аудит...
Найкращі ігри для гри з відстеженням рук
Нещодавно Oculus Quest представив чудову ідею відстеження рук без контролерів. Завдяки постійно зростаючій кількості ігор та заходів, які виконують пі...
Як показати накладання екранного меню в повноекранному додатку та іграх для Linux
Гра у повноекранні ігри або використання додатків у повноекранному повноекранному режимі може відключити від відповідної системної інформації, видимої...