Удаление нескольких элементов из 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();
