Всемогутнє безліч STL

Наступний клас, який ми збираємося досліджувати в нашому огляді STL – клас set (безліч) Цей клас являє собою реалізацію математичного поняття множини Безліч містить поодинокі елементи даного виду в ньому не може бути двох і більше елементів з однаковими значеннями Для використання цього класу вам потрібно підключити в проект заголовний файл :

#include &ltset&gt

Як я говорив, в безлічі зберігається не більше одного елемента з даними значенням Тому зручно використовувати безліч для зберігання списку яких речей, наприклад опцій програми, які потрібно перевіряти на наявність якого-небудь елементу Безліч також можна використовувати для перевірки орфографії та синтаксису Безлічі можна обєднати або брати їх перетин В обєднанні будуть знаходиться (в єдиному примірнику) всі елементи, що зустрічаються хоча б в одному з множин, а в перетині – елементи, що знаходяться одночасно у всіх пересічних множин

Уявіть, що вам потрібно зберігати всі слова, які користувач шукав у даному документі Це стандартна ситуація для вікна діалогу пошуку слів, в якому зазвичай знаходиться комбінований список, що містить у своїй випадаючому частини кілька останніх слів, за якими проводився пошук Вам не потрібно зберігати одне і те ж слово багато разів, так що ви можете використовувати безліч (а не масив або список), щоб бути впевненим у єдиності елемента

Давайте подивимося на методи, наявні в класі set, а потім поговоримо про їх використання У табл 55 наведені основні методи класу set в STL

Таблиця 55 Важливі методи класу set

Повертає початкову позицію безлічі (перший елемент)

Повертає останню позицію безлічі (останній елемент)

Повертає кількість елементів у множині, що підходять під заданий критерій

Вказує, є (TRUE) чи ні (FALSE) елементів у множині

Додати елемент в безліч, якщо це можливо Якщо такий елемент вже є, то новий доданий НЕ БУДЕ

Видаляє елемент з безлічі, якщо він там є Якщо такого елемента немає, то з безліччю нічого не відбувається

Повертає кількість елементів у множині

Повертає перший же елемент, відповідний під заданий критерій або порожній елемент (NULL),

якщо такого елемента немає

Для звичайних множин те ж, що і find Для мультимножин повертає перше входження, підходяще під заданий критерій

Для звичайних множин те ж, що і find Для мультимножин повертає перший з кінця входження, підходяще під заданий критерій

Повертає останній елемент

Повертає перший елемент

Перевіряє, чи не є безліч підмножиною іншого

Повертає обєднання двох множин

Повертає перетин двох множин

Повертає різницю двох множин (елементи одного безлічі, не присутні в іншому)

Урізує безліч до одного значення

Повертає кількість елементів, що задовольняють заданій умові

Обмінює елементи (відразу все) між множинами

Копіює елементи з одного безлічі в інше (робить точну копію)

Ось приклад використання множини У даному прикладі ми отримуємо від користувача значення (рядки) і намагаємося додати їх у безліч Якщо значення не додається жодного, ми виводимо повідомлення про помилку і продовжуємо роботу Процес повторюється, поки користувач не введе спеціальне значення (DONE), яке означає, що введення даних завершений Тоді ми виводимо список значень, які були додані в безліч Для створення цієї програми виберіть у CBuilder новий проект консольного застосування і введіть наступний код у вихідний файл (project1cpp):

#include &ltstdioh&gt

#include &ltstringh&gt

#include &ltstdlibh&gt

#include &ltset&gt

#include &ltstring&gt

int main(void)

{

/ / Визначаємо використовуваний обєкт безліч

std::set&ltstd::string, less&ltstd::string&gt &gt setString

/ / В циклі намагаємося додати елементи,

/ / Введені користувачем

int bDone = FALSE

while  (bDone )

{

/ / Отримуємо інформацію від користувача

printf (Введіть значення для пошуку

(DONE для виходу): )

/ / Зберігаємо результат в рядку char szBuffer [256] gets (szBuffer)

/ / Перевіряємо, чи не час виходити

if  (stricmp(szBuffer, &quotdone&quot) )

{

bDone = TRUE continue

}

/ / Намагаємося додати елемент в безліч int bOkToAdd = setStringinsert (szBuffer) if (bOkToAdd == FALSE)

{

printf (Не додається:

такий елемент вже є \ n )

}

}

/ / Коли введення завершений, виводимо всі елементи

std::set&ltstd::string, std::less&ltstd::string&gt &gt::

iterator setIterator setIterator = setStringbegin()

/ / Проходимо за всіма значеннями

while  (setIterator = setStringend() )

{

printf (Елемент:% s \ n, (* setIterator) c_str ())

}

return 0

}

У даному прикладі є кілька цікавих моментів По-перше, тут не застосовується конструкція using namespace std, яку використовували аж до цієї точки при роботі з STL Для цього є причини: по-перше, вираз using застосовувати не обовязково, це просто більш зручний спосіб розпізнавання областей видимості Вам дійсно потрібно навчитися працювати з областями namespace, які ми розглянемо докладніше нижче

Другим цікавим моментом є те, що безліч – не більше ніж звичайна структура даних Ви можете додавати в нього дані і визначати ітератор (iterator) для нього Це важливо, тому що занадто багато програмістів, судячи з усього, вважають, що безліч можна використовувати тільки для перевірки, чи є в ньому певний елемент Клас iterator працює з безліччю точно також, як і з будь іншою структурою в класах STL

І, нарешті, останній момент полягає в тому, що ми використовували саму структуру даних для перевірки коректності введення В основному класи, що визначають структури даних (list, vector і тд) не мають ніяких вбудованих перевірок Користувач може набрати одну і ту ж рядок два рази, і класи list і vector радісно помістять обидва примірники в кінець списку (масиву) У класах ж set і map (який ми розглядали в попередньому прикладі) зберігаються тільки унікальні значення Також як і у класу map, у класу set є кровний брат – клас multiset (мультімножество), в якому можна зберігати кілька однакових елементів Але таке диво використовується вкрай рідко, так як для подібних речей краще підходять інші структури даних, наприклад список (list)

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*