Удаление из QVector

Автор: | 23 июля, 2019

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