Кабель – це не випадкова метафора для ітераторів, оскільки саме ітератори здійснюють зв’язок між алгоритмами і контейнерами. Зосередимо увагу на двох кінцях уявного кабеля: контейнерах і алгоритмах.
Монтаж кабеля в контейнерний кінець
Якщо обмежитися розглядом лише основних контейнерів STL, доведеться констатувати той факт, що можна обійтися тільки двома категоріями ітераторів. Як показано в таблиці 9.7, векторам і чергам з двостороннім доступом взагалі все одно, який ітератор використовується, а списки, множини, мультимножини, відображення і мультивідображення сприймають все, крім ітераторів довілнього доступу.
Таблиця 9.7
Типи ітераторів, що підтримуються контейнерами
Тип ітератора
| Вектор
| Список
| Черга з двостороннім
доступом
| Множина
| Мультимножина
| Відображення
| Мультивідображення
|
Довільного доступу
| *
|
| *
|
|
|
|
|
Двонапрямлений
| *
| *
| *
| *
| *
| *
| *
|
Прямий
| *
| *
| *
| *
| *
| *
| *
|
Вхідний
| *
| *
| *
| *
| *
| *
| *
|
Вихідний
| *
| *
| *
| *
| *
| *
| *
|
Тепер розберемося. як же STL підключає правильний ітератор до контейнера? При визначенні ітератора потрібно вказати, для якого типу контейнера його слід використовувати. Наприклад, якщо ми визначили список значень типу int
list <int> ilist;//список int
тоді для того, щоб визначити ітератор для нього, потрібно написати:
list<int>::iteratot iter; //ітератор для цілочисельного списку
Після цього STL автоматично робить ітератор двонапрямленим, оскільки саме такий ітератор потрібний контейнеру типу «список». Ітератор для вектора чи черги з двостороннім доступом автоматично робиться ітератором довільного доступу.
Така автоматизація процесу досягається за рахунок того, що клас ітератора конкретного класу є спадкоємцем класу більш загального ітератора. Ітератори для векторів і черг з двостороннім доступом є спадкоємцями класу random_access_iterator, а ітератори для списків – спадкоємцями класу bidirectional_iterator.
Зараз ми розглянемо, як до контейнерів приєднуються «кінці» наших «кабелів»-ітераторів. Кабель насправді не вставляється в контейнер. Фігурально висловлюючись, він намертво на нього прикручений Вектори і черги з двостороннім доступом прикручені до ітераторів довільного доступу, а списки та інші асоціативні контейнери завжди прикручені до двонапрямлених ітераторів.