// Демонстрация итераторов произвольного доступа:
int a[3] = {5, 8, 2};
vector<int> v(a, a+3);
vector<int>::iterator iv = v.beginf), ivl;
ivl = iv + 1;
bool bl = iv < ivl;
// В двух последних строчках + и < допустимы, поскольку
// iv и ivl - итераторы произвольного доступа.
// Демонстрация двунаправленных итераторов:
list<int> w(a, a+3);
list<int>::iterator iw = w.beginf), iwl;
iwl = iw + 1; // Ошибка
bool b2 = iw < iwl; // Ошибка
//В двух последних строчках + и < недопустимы, поскольку
// iw и iwl - двунаправленные итераторы.
// Следующие две строчки, напротив, являются правильными:
iwl = iw ;
bool ЬЗ = iw == iwl;
Какие категории итераторов требуются для алгоритмов
Алгоритм find (рассмотренный в разделе 1.5) из всех операций над итераторами требует исключительно те, которые определены для входных итераторов, потому что ему достаточно только читать элементы последовательности, исполняя, например, операцию присваивания х = *i. Поэтому в вышеприведенной
таблице find служит примером для входных итераторов в столбце Каким алгоритмом используется.
Вспомним, как мы использовали алгоритм сору (также упомянутый в рассмотренной таблице) в разделе 1.6:
copy (v. begin () , v.end(), L.beginO);
Чтобы увидеть, как это согласуется с нашей таблицей, заметим, что приемник копирования L является списком, который определяет итераторы, относящиеся к двунаправленной категории. Для L достаточно использовать выходные итераторы, но двунаправленные итераторы поддерживают все операции выходных итераторов, так что проблем не возникает. Так как алгоритм сору требует выходной итератор в качестве третьего аргумента, он не будет применять операторы —, +, -, <
<< назад вперед >>