Удаление нескольких элементов из QVector при помощи итератора QMutableVectorIterator
Создаем итератор для обхода вектора. Итератор установлен в начале вектора (перед первым элементом).
Фрагмент кода для демонстрации:
QVector<int> vector; vector << 0 << 11 << 33 << 53 << 8 << 3 << 42 << 4 << 80 << 2; qDebug() << vector; QMutableVectorIterator<int> i(vector); while(i.hasNext()) { int currentValue=i.next(); if(currentValue>10) i.remove(); } qDebug() << vector;
В итоге удалятся все элементы больше 10.
В QVector есть и итераторы в стиле Java, и итераторы в стиле STL. Итераторы в стиле Java являются более высокоуровневыми и более простыми в использовании, чем итераторы в стиле STL, с другой стороны, они немного менее эффективны. Альтернативой использованию итераторов является использование позиций индекса.
Большинство функций-членов QVector принимают индекс в качестве первого параметра, что позволяет получать доступ, вставлять и удалять элементы без использования итераторов. QMutableVectorIterator <T> позволяет перебирать QVector <T> и изменять вектор. Если не нужно изменять вектор, можно использовать более быстрый QVectorIterator <T>. Конструктор QMutableVectorIterator принимает QVector в качестве аргумента. После построения итератор находится в самом начале списка (перед первым элементом).
Функция next() возвращает следующий элемент в векторе и продвигает итератор. В отличие от итераторов в стиле STL, итераторы в стиле Java указывают между элементами, а не непосредственно на элементы. Первый вызов next() переводит итератор в положение между первым и вторым элементом и возвращает первый элемент; второй вызов next() продвигает итератор на позицию между вторым и третьим элементом, возвращая второй элемент и так далее.
Для перебора в обратном порядке:
QMutableVectorIterator<int> i(vector); i.toBack(); while (i.hasPrevious()) qDebug() << i.previous();