Контейнери STL: встановити і мультімножество. Частина 9




клас і встановити мультімножество C ++, STL контейнери, set multiset для початківцівДосить часто на практиці потрібно контролювати тільки приналежність тих чи інших об'єктів до деякій підмножині. Такі колекції і в класичній математиці називаються безліч, до якого конкретний об'єкт може або належати, чи ні. І бібліотека STL надає такий вид контейнерів, який так і називається - комплект<> (безліч).

Кожен елемент контейнера комплект<> містить тільки значення ключа (не кілька, як для карта<>), тому такий тип контейнера дуже ефективно реалізує операцію перевірки наявності значення в наборі. Цей контейнер надає багато спільних методів в порівнянні карта з<>, хоча вони тут мають деякі вироджені якості (і часом непотрібні):

  • операція вставки (метод вставити()) нового значення ключа до безлічі повертає пару типу <итератор, bool> (просто, як для карта<>). В этой паре второй компонент (second, типу bool) вказує на успішність операції: якщо це true, то перший компонент повертається результату (first) дає итератор нового доданого елемента. Але це досить безглузде повертається значення: якщо повертається true, то нове значення успішно додано до безлічі, якщо ж повертається false, то воно вже присутній в безлічі раніше - в обох випадках кінцевий стан безлічі буде ідентичним (тому на практиці значення, що повертається вставити() зазвичай навіть не перевіряють ... а багато хто і не знають, що там взагалі передбачено повертається значення взагалі);

  • Для цього контейнера реалізований метод count() (як для MultiMap<>), але, оскільки значення ключа може бути присутнім в множин тільки в одиничному екземплярі, метод count() може повернути тільки 0, якщо таке значення відсутній, і 1 коли таке значення присутній.

  • Для контейнера реалізований метод знайдений(), який повертає итератор элемента, якщо значення знайдено, і итератор зі значенням end() якщо значення відсутній в безлічі.

Для демонстрації сказаного створимо додаток, яке N раз (параметр, задається в команді запуску додатка) в циклі генерує псевдовипадкове число в фіксованому діапазоні [0…іт] і поміщає його в безліч. Понятно, що при зростанні N більше ніж lim (а тим більше при N набагато більше lim), каждое число диапазона [0…іт] буде генеруватися все більше і більше число раз:

клас і встановити мультімножество C ++, STL контейнери, set multiset для початківців
Аргумент команди у властивостях налагодження не заданий

клас і встановити мультімножество C ++, STL контейнери, set multiset для початківців
Аргумент команди у властивостях налагодження дорівнює 5
клас і встановити мультімножество C ++, STL контейнери, set multiset для початківців
Аргумент команди у властивостях налагодження дорівнює 100

Іншим близьким типом контейнера є мультімножество<>, що дозволяє кожному значенню ключа бути не унікальним, і перебувати в безлічі скільки завгодно раз. Ці два контейнера (комплект<> і мультімножество<>) настільки подібні, що в показаному вище додатку ми замінимо всього 2 рядки (метод count() для мультімножество<> возвращает число входжень значення в безліч):

Але поведінка додатки радикально змінюється (для порівняння поруч показані результати 2-х додатків в ідентичних умовах):

клас і встановити мультімножество C ++, STL контейнери, set multiset для початківців

Видим, що для мультимножини значення 1, 2, 13, 17… відсутні в контейнері, а значення 18, например, присутній в ньому 5 раз.

Нові уроки з програмування:

дата
сторінка
Контейнери STL: встановити і мультімножество. Частина 9
рейтинг
51зірка1зірка1зірка1зірка1зірка
Olej

Про Olej

Стаж практичних програмних розробок близько 40 лет. Викладач міжнародної софтверної компанії Global Logic. Постійний автор публікацій IBM Developer Works. Науковий редактор книжкового видавництва комп'ютерної літератури "Символ-Плюс", Санкт-Петербург.

залишити коментар

Код розміщуйте в тегах: <pre class="lang:C ++ декодуванням:true ">ВАШ КОД</заздалегідь>