Далі ми розглянемо два спеціалізовані типи ітераторів: адаптери ітераторів, які можуть у досить незвичайний спосіб міняти поведінку звичайних ітераторів, та потокові ітератори, завдяки яким вхідні і вихідні потоки можуть поводитися як ітератори.
Адаптери ітераторів
В STL розрізняють три варіанти модифікації звичайного ітератора. Це зворотній ітератор, ітератор вставки та ітератор неініціалізованого зберігання. Зворотній ітератор дозволяє проходити контейнер у зворотньому напрямку. Ітератор вставки створений для зміни поведінки різних алгоритмів таких як copy() та merge(), так щоб вони саме вставляли дані, а не перезаписували існуючі. Ітератор неініціалізованого зберігання дозволяє зберігати дані в ділянці пам’яті, яка ще не ініціалізована. Він використовується у досить специфічних випадках, тому ми його не розглядатимемо.
Зворотні ітераоти
Припустімо, нам потрібно здійснювати ітерацію по контейнеру у зворотньому порядку. В такому випадку використовують зворотні ітератори. В програмі 15.21 показане застосування цього спеціалізованого ітератора для виведення вмісту списку у зворотньому порядку.
//зворотній ітератор
#include<iostream>
#include<conio>
#include<list>
using namespace std;
int main()
{int arr[]={2,4,6,8,10};
list<int>thelist;
for(int j=0;j<5;j++)
thelist.push_back(arr[j]);//перенести вміст масиву в список
list<int>::reverse_iterator rewit;//зворотній ітератор
rewit=thelist.rbegin(); //реверсна ітерація
while(rewit!=thelist.rend()) //по списку
cout<<*rewit++<<" "; //з виводом на екран
cout<<endl;
getch();
return 0;
}
Програма 15.21
При використанні зворотнього ітератора слід використовувати методи rbegin() та rend(). Цікаво, що проходження ітератора почнеться з кінця, при цьому викликається метод rbegin(). До того ж, значення ітератора потрібно інкрементувати при русі від елемента до елемента. При використанні reverse_ iterator ми рухаємося від rbegin() до rend(), інкрементується ітератор.