MyTetra Share
Делитесь знаниями!
Как правильно удалять элементы из QVector или из QList в момент обхода массива (списка)
Время создания: 28.11.2017 14:20
Текстовые метки: c++, си++, Qt, QList, QVector, удаление, элементы, массив, несколько, цикл, перебор, перебрать, QMutableVectorIterator, QMutableListIterator, итерации
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Принципы написания кода
Запись: xintrea/mytetra_syncro/master/base/15118680080lhnxjydiq/text.html на raw.github.com

Для правильного удаления нескольких элементов из массива или списка надо пользоваться итераторами. Другими методами (например, простым циклом с индексом) сделать такое удаление будет очень проблематично.


В Qt есть два вида итераторов: с доступом на чтение и с доступом на чтение-запись. Первые называются так:



QVectorIterator

QListIterator



А вторые называются так:



QMutableVectorIterator

QMutableListIterator



То есть, устрашающее слово Mutable в названии говорит лишь о том, что элемент, на который будет указывать итератор, может изменяться или даже удаляться. Ничего сверхестественного такое название не предполагает.


Теперь пример кода, который все объясняет. В коде задается массив, массив обходится, и из него удаляются элементы со значениями 20, 40, 70.



QVector<int> a;

a << 0 << 10 << 20 << 30 << 40 << 50 << 60 << 70 << 80 << 90;

qDebug() << a;


QMutableVectorIterator<int> i(a);

while(i.hasNext()) {

int currentValue=i.next();


qDebug() << currentValue;


if(currentValue==20)

i.remove();


if(currentValue==40)

i.remove();


if(currentValue==70)

i.remove();

}


qDebug() << a;



Вывод этого кода будет таким:



QVector(0, 10, 20, 30, 40, 50, 60, 70, 80, 90)

0

10

20

30

40

50

60

70

80

90

QVector(0, 10, 30, 50, 60, 80, 90)



Видно, что элементы корректно удалились.


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования