while (i.hasPreviousO) { if (i.previousO < 0.0) i.removeО;
}
Аналогично допускающие запись итераторы в стиле Java имеют функцию set-ValueO, которая модифицирует последний пройденный элемент. Ниже показано, как можно заменить отрицательные числа их абсолютным значением:
QMutableListIterator<double> i(list); while (i.hasNextO) {
int val = i.nextO;
if (val < 0.0)
i.setValue(-val);
}
Кроме того, можно вставлять элемент в текущую позицию итератора с помощью функции insert(). После этого итератор перемещается в позицию между новым элементом и следующим за ним.
Кроме итераторов в стиле Java каждый класс последовательных контейнеров С<Т> имеет итераторы в стиле STL двух типов: С<Т>:: iterator и С<Т>: :const_iterator. Они отличаются тем, что итератор const_iterator не позволяет модифицировать данные.
Функция контейнера begin() возвращает итератор в стиле STL, ссылающийся на первый элемент контейнера (например, list[0]), в то время как функция контейнера end () возвращает итератор, ссылающийся на элемент «после последнего элемента» (например, list[5] для списка размером 5). Если контейнер пустой, функции beg in () и end() возвращают одинаковое значение. Это может использоваться для проверки наличия хотя бы одного элемента в контейнере, хотя для этой цели более удобно пользоваться функцией isEmpty().

Рис. 11.5. Допустимые позиции итераторов в стиле STL
Синтаксис применения итераторов в стиле STL моделирует синтаксис применения указателей С++. Мы можем использовать операторы ++ и -- для перехода на следующий или предыдущий элемент, а также унарный оператор * для извлечения значения элемента из позиции текущего итератора. Для вектора vector<T> типы итераторов iterator и const_iterato г определяются просто как typedef для Т * и const Т *. (Так можно делать, поскольку QVector<T> хранит свои элементы в последовательных адресах памяти.)
В показанном ниже примере каждое значение в списке QList<double> заменяется своим абсолютным значением:
QList<double>::iterator i = list.begin(); while (i ! = list.endO) { *i = qAbs(*i);
++i;
}
Несколько функций Qt возвращают контейнер. Если мы хотим в цикле обработать такое возвращенное значение функции, используя итератор в стиле STL, мы должны сделать копию контейнера и в цикле обрабатывать эту копию
<< назад вперед >>