русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Відповідність алгоритмів контейнерам


Дата додавання: 2014-04-22; переглядів: 987.


Кабель – це не випадкова метафора для ітераторів, оскільки саме ітератори здійснюють зв’язок між алгоритмами і контейнерами. Зосередимо увагу на двох кінцях уявного кабеля: контейнерах і алгоритмах.

 

Монтаж кабеля в контейнерний кінець

Якщо обмежитися розглядом лише основних контейнерів STL, доведеться констатувати той факт, що можна обійтися тільки двома категоріями ітераторів. Як показано в таблиці 9.7, векторам і чергам з двостороннім доступом взагалі все одно, який ітератор використовується, а списки, множини, мультимножини, відображення і мультивідображення сприймають все, крім ітераторів довілнього доступу.

Таблиця 9.7

Типи ітераторів, що підтримуються контейнерами

Тип ітератора Вектор Список Черга з двосто­роннім доступом Множина Мульти­множина Відобра­ження Мульти­відобра­ження
Довільного доступу *   *        
Двонапрям­лений * * * * * * *
Прямий * * * * * * *
Вхідний * * * * * * *
Вихідний * * * * * * *

Тепер розберемося. як же STL підключає правильний ітератор до контейнера? При визначенні ітератора потрібно вказати, для якого типу контейнера його слід використовувати. Наприклад, якщо ми визначили список значень типу int

list <int> ilist;//список int

тоді для того, щоб визначити ітератор для нього, потрібно написати:

list<int>::iteratot iter; //ітератор для цілочисельного списку

Після цього STL автоматично робить ітератор двонапрямленим, оскільки саме такий ітератор потрібний контейнеру типу «список». Ітератор для вектора чи черги з двостороннім доступом автоматично робиться ітератором довільного доступу.

Така автоматизація процесу досягається за рахунок того, що клас ітератора конкретного класу є спадкоємцем класу більш загального ітератора. Ітератори для векторів і черг з двостороннім доступом є спадкоємцями класу random_access_iterator, а ітератори для списків – спадкоємцями класу bidirectional_iterator.

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

 


<== попередня лекція | наступна лекція ==>
Недоліки звичайних вказівників | Монтаж «кабеля» в алгоритм


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн