Оператор QMap / QHash [] вернул ссылочную действительность - PullRequest
6 голосов
/ 30 октября 2011

Мне было интересно, как долго действительна ссылка на значение внутри контейнера Qt, особенно на QHash или QMap. Под действительным я подразумеваю, если гарантированно будет указывать на правильное местоположение внутри карты / хеша после вставки или удаления других элементов.

Давайте следующий код:

QHash<char,int> dict; // or QMap<char,int> dict;
dict.insert('a', 1);
int& val(dict['a']);

dict.insert('b', 2);

val = 3;             // < will this work or lead to a segfault

Будет ли установка значения в последней строке правильно обновлять значение, связанное с a до 3, или это приведет к segfault или будет неопределенным (так что иногда работают segfault, в зависимости от того, являются ли данные структура должна была быть внутренне реорганизована, как изменение размера массива хэш-таблиц). Одинаково ли поведение для QMap и QHash, или одно будет работать, а другое нет?

Ответы [ 2 ]

4 голосов
/ 31 октября 2011

Это полностью описано в документации & mdash; Вы, должно быть, пропустили это!

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

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

Это относится к QHashIterator и QMutableHashIterator, а также к голым ссылкам. Остерегайтесь неавторизованных ссылок, утверждающих обратное, полагаясь на детали реализации, которые могут измениться в любое время.

1 голос
/ 31 октября 2011

Нет ничего плохого в использовании ссылок на элементы QMap / QHash, если вы не удалите узел, на который ссылаетесь.Элементы контейнеров qt не перераспределяются каждый раз, когда вставляются новые элементы.Однако я не вижу веских причин для использования ссылок на элементы контейнера.

Для получения более подробной информации посмотрите эту превосходную статью о внутренней реализации контейнеров qt

...