Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Відповідність алгоритмів контейнерамСодержание книги
Поиск на нашем сайте
Кабель – це не випадкова метафора для ітераторів, оскільки саме ітератори здійснюють зв’язок між алгоритмами і контейнерами. Зосередимо увагу на двох кінцях уявного кабеля: контейнерах і алгоритмах.
Монтаж кабеля в контейнерний кінець Якщо обмежитися розглядом лише основних контейнерів STL, доведеться констатувати той факт, що можна обійтися тільки двома категоріями ітераторів. Як показано в таблиці 9.7, векторам і чергам з двостороннім доступом взагалі все одно, який ітератор використовується, а списки, множини, мультимножини, відображення і мультивідображення сприймають все, крім ітераторів довілнього доступу. Таблиця 9.7 Типи ітераторів, що підтримуються контейнерами
Тепер розберемося. як же STL підключає правильний ітератор до контейнера? При визначенні ітератора потрібно вказати, для якого типу контейнера його слід використовувати. Наприклад, якщо ми визначили список значень типу int list <int> ilist;//список int тоді для того, щоб визначити ітератор для нього, потрібно написати: list<int>::iteratot iter; //ітератор для цілочисельного списку Після цього STL автоматично робить ітератор двонапрямленим, оскільки саме такий ітератор потрібний контейнеру типу «список». Ітератор для вектора чи черги з двостороннім доступом автоматично робиться ітератором довільного доступу. Така автоматизація процесу досягається за рахунок того, що клас ітератора конкретного класу є спадкоємцем класу більш загального ітератора. Ітератори для векторів і черг з двостороннім доступом є спадкоємцями класу random_access_iterator, а ітератори для списків – спадкоємцями класу bidirectional_iterator. Зараз ми розглянемо, як до контейнерів приєднуються «кінці» наших «кабелів»-ітераторів. Кабель насправді не вставляється в контейнер. Фігурально висловлюючись, він намертво на нього прикручений Вектори і черги з двостороннім доступом прикручені до ітераторів довільного доступу, а списки та інші асоціативні контейнери завжди прикручені до двонапрямлених ітераторів.
Монтаж «кабеля» в алгоритм Кожному алгоритму, залежно від того, чим він займається, потрібний свій тип ітератора. Якщо потрібно звертатися до довільних елементів ітератора, потрібний ітератор довільного доступу. Якщо ж потрібно просто пересуватися від елемента до елемента, то підійде менш потужний прямий ітератор. В таблиці 10.8 показані приклади алгоритмів та потрібних їм ітераторів. Таблиця 10.8 Типи ітераторів, потрібні певним алгоритмам
Попри те, що кожному алгоритму потрібний певний рівень можливостей, потужніші ітератори теж працюватимуть нормально. Алгоритму replace() потрібний прямий ітератор, але він працюватиме і з двонапрямленим ітератором, і з ітератором довільного доступу. Завдяки двом попереднім таблицям, можна встановити, з якими алгоритмами працює той чи інший ітератор. Наприклад, алгоритму sort() потрібний ітератор довільного доступу. Ітератор довільного доступу працює з векторами і чергами з двостороннім доступом. Отже, алгоритм sort() працюватиме лише з ними. Будь-який алгоритм, якому не потрібний ітератор довільного доступу, працюватиме з довільним типом контейнера STL, оскільки всі контейнери використовують двонапрямлені ітератори, які тільки на один рівень менш потужні, ніж ітератори довільного доступу. Якщо б у STL існували однозв’язні списки, то з ними можна було б користуватися прямими ітераторами, але не можна б було використовувати ітератор reverse(). Як бачимо, відносно мале число алгоритмів реально потребує алгоритмів довільного доступу. Тому більшість алгоритмів працюватиме з більшістю контейнерів.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2021-12-15; просмотров: 43; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.130.96 (0.006 с.) |