Действительны ли итераторы после сортировки или удаления элементов?Этот код - бомба замедленного действия? - PullRequest
2 голосов
/ 04 февраля 2012

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

Этот код будет аварийно завершен один раз?

QVector<Foo> container;

b = container.begin();
e = container.end();

while (container.count() > newCount)
{
    computeSomePropertyOfFoo(b, e);  // Computes property between b and e
    sortByThatProperty(b, e);        // sorts members between b and e
    container.erase(--e);
}

1 Ответ

6 голосов
/ 04 февраля 2012

Из Классы контейнеров Документация:

Классы итераторов

Итераторы предоставляют единые средства для доступа к элементам в контейнере. Контейнерные классы Qt предоставляют два типа итераторов: итераторы в стиле Java и итераторы в стиле STL. Итераторы обоих типов становятся недействительными, когда данные в контейнере модифицированы или отделены от неявно общих копий из-за вызова неконстантной функции-члена.

Так что да, ваш код неверен. Вы не должны «кэшировать» итераторы так, как вы это делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...