Перебір ітераторів функцією advance()
На цьому кроці ми розглянемовикористання функціїadvance().
Стандартна бібліотекаC++містить три допоміжні функції для роботи з ітераторами:advance(), distance()таiter_swap(). Перші дві функції надають для будь-якого ітератора можливості, якими зазвичай мають лише ітератори довільного доступу: переміщення ітератора відразу кілька елементів вперед (чи тому) і обчислення різниці між ітераторами. Третя допоміжна функція змінює місцями елементи, на які посилаються два ітератори.
Перебір ітераторів функцією advance()
Функціяadvance()переміщає ітератор, що передається їй як аргумент. При цьому зсув може проводитися у прямому (або зворотному) напрямку відразу на декілька елементів:
Переміщує ітератор введення pos наnелементів уперед (або назад). Для двонаправлених ітераторів та ітераторів довільного доступу значенняnможе бути негативним (переміщення у зворотному напрямку).
Dist- тип шаблону. Зазвичай є цілим типом, оскільки для нього викликаються такі операції, як
Зверніть увагу, що функціяadvance()не перевіряє вихід за межіend()(і не може перевіряти, оскільки в загальному випадку ітератор не має інформації про контейнер, з яким він працює) . Таким чином, виклик цієї функції може призвести до непередбачуваних наслідків через виклик оператора в кінці послідовності.
Щоб вільно змінювати типи контейнера та ітератора, використовуйте функціюadvance()замість оператора +=. Однак слід пам'ятати, що при цьому можливе непередбачене зниження швидкодії при переході на інші типи контейнерів, які не підтримують довільного ітераторадоступу (саме через зниження швидкодії оператор += застосовується лише ітераторів довільного доступу). Також пам'ятайте, що функціяadvance()не повертає значення, а оператор += повертає нову позицію і може входити до більш складного виразу. Приклад використання функціїadvance():
Викликиadvance()переводять ітератор на три елементи вперед і один елемент назад. Результат:
Мал.1. Результат роботи програми
Існують і інші застосування функції advance() . Наприклад, можна проігнорувати частину введення від ітераторів, які читають дані з вхідного потоку.
На наступному кроці ми розглянемофункціюdistance().