В нынешнем варианте программа findl основана на векторе, а поскольку вектор работает с итераторами произвольного доступа, запись *(г- 1) не создаст проблем. Однако проблемы появятся, если слово vector везде, где оно встречается в программе, заменить на list. В этом случае пе­ременная i станет двунаправленным итератором, для которого выражение i - 1 не является допустимым. Другими словами, программа findl переста­нет компилироваться, если мы одновременно заменим vector на list, а *—i на *(г - 1). Точно так же и для итераторов, определенных классом list, недо­ступна операция сравнения «меньше чем». Это иллюстрирует коммента­рий в следующем фрагменте:

// Демонстрация итераторов произвольного доступа:

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 достаточно использо­вать выходные итераторы, но двунаправленные итераторы поддерживают все операции выходных итераторов, так что проблем не возникает. Так как алгоритм сору требует выходной итератор в качестве третьего аргумента, он не будет применять операторы —, +, -, <


<< назад вперед >>