Класс iterator
Класс iterator объявлен в классе QHash.Класс QHash::iterator предоставляет итератор в стиле STL для QHash и QMultiHash. Подробнее...
Открытые функции
| iterator() | |
| const Key & | key() const |
| T & | value() const |
| bool | operator!=(const iterator &other) const |
| bool | operator!=(const const_iterator &other) const |
| T & | operator*() const |
| iterator | operator+(int j) const |
| iterator & | operator++() |
| iterator | operator++(int) |
| iterator & | operator+=(int j) |
| iterator | operator-(int j) const |
| iterator & | operator--() |
| iterator | operator--(int) |
| iterator & | operator-=(int j) |
| T * | operator->() const |
| bool | operator==(const iterator &other) const |
| bool | operator==(const const_iterator &other) const |
Подробное описание
QHash содержит как итераторы в стиле STL, так и итераторы в стиле Java. Итераторы в стиле STL более низкого уровня и сложнее в использовании; с другой стороны, они немного быстрее и, для разработчиков, знакомых со STL, обладают преимуществом понятности.
QHash<Key, T>::iterator позволяет перебирать QHash (или QMultiHash) и изменять значение (но не ключ), связанное с конкретным ключом. Если вы хотите перебрать константный QHash, используйте QHash::const_iterator. Обычно рекомендуется использовать QHash::const_iterator и на неконстантном QHash, если вы не хотите изменять QHash через итератор. Константные итераторы немного быстрее и могут улучшить читаемость кода.
Конструктор QHash::iterator по умолчанию создаёт неинициализированный итератор. Необходимо его инициализировать с помощью функции QHash::begin(), QHash::end() или QHash::find() перед началом перебора. Вот типичный цикл, который печатает все пары (ключ, значение) в хэше:
QHash<QString, int> hash;
hash.insert("January", 1);
hash.insert("February", 2);
...
hash.insert("December", 12);
QHash<QString, int>::iterator i;
for (i = hash.begin(); i != hash.end(); ++i)
cout << i.key() << ": " << i.value() << Qt::endl; В отличие от QMap, которая упорядочивает элементы по ключу, QHash хранит элементы в произвольном порядке. Единственная гарантия заключается в том, что элементы с одинаковым ключом (вставленные с помощью QHash::insertMulti()) будут появляться последовательно, от последнего к первому.
Рассмотрим несколько примеров того, что можно сделать с QHash::iterator, но нельзя с QHash::const_iterator. Вот пример, который увеличивает каждое значение в QHash на 2:
QHash<QString, int>::iterator i;
for (i = hash.begin(); i != hash.end(); ++i)
i.value() += 2; Вот пример удаления всех элементов, ключи которых начинаются с символа подчёркивания:
QHash<QString, int>::iterator i = hash.begin();
while (i != hash.end()) {
if (i.key().startsWith('_'))
i = hash.erase(i);
else
++i;
} Вызов QHash::erase() удаляет элемент, на который указывает итератор, из хэша и возвращает итератор на следующий элемент. Вот другой способ удаления элемента во время перебора:
QHash<QString, int>::iterator i = hash.begin();
while (i != hash.end()) {
QHash<QString, int>::iterator prev = i;
++i;
if (prev.key().startsWith('_'))
hash.erase(prev);
} Может показаться заманчивым написать такой код:
// WRONG
while (i != hash.end()) {
if (i.key().startsWith('_'))
hash.erase(i);
++i;
} Однако это может привести к сбою ++i, потому что i является висящим итератором после вызова erase().
Можно использовать несколько итераторов для одного хэша. Однако помните, что любые изменения, произведённые непосредственно в QHash, могут существенно изменить порядок хранения элементов в хэше, так как они могут заставить QHash перестроить свою внутреннюю структуру данных. Есть одно исключение: QHash::erase(). Этот метод можно безопасно вызывать во время перебора, и он не повлияет на порядок элементов в хэше. Если вам нужно сохранить итераторы на длительный период времени, рекомендуется использовать QMap, а не QHash.
Предупреждение: Итераторы неявно совмещенных контейнеров работают не совсем как итераторы STL. Следует избегать копирования контейнера, пока итераторы активны для этого контейнера. Для получения дополнительной информации, прочитайте Проблема итераторов неявно совмещенных контейнеров.
См. также QHash::const_iterator, QHash::key_iterator и QMutableHashIterator.
Документация по членам-функциям
bool iterator::operator!=(const const_iterator &other) const
bool iterator::operator!=(const iterator &other) const
Возвращает true если other указывает на другой элемент, чем этот итератор; в противном случае возвращает false.
См. также operator==().
bool iterator::operator==(const const_iterator &other) const
bool iterator::operator==(const iterator &other) const
Возвращает true если other указывает на тот же элемент, что и этот итератор; в противном случае возвращает false.
См. также operator!=().
iterator::iterator()
Конструирует неинициализированный итератор.
Функции, такие как key(), value() и operator++(), не должны вызываться на неинициализированном итераторе. Используйте operator=() для присваивания значения перед использованием.
См. также QHash::begin() и QHash::end().
const Key &iterator::key() const
Возвращает ключ текущего элемента в виде константной ссылки.
Нет прямого способа изменить ключ элемента через итератор, хотя это можно сделать, вызвав QHash::erase() за которым следует QHash::insert() или QHash::insertMulti().
См. также value().
T &iterator::value() const
Возвращает изменяемую ссылку на значение текущего элемента.
Можно изменить значение элемента, используя value() в левой части оператора присваивания, например:
if (i.key() == "Hello")
i.value() = "Bonjour"; См. также key() и operator*().
T &iterator::operator*() const
Возвращает изменяемую ссылку на значение текущего элемента.
То же самое, что и value().
См. также key().
iterator iterator::operator+(int j) const
Возвращает итератор на элемент, расположенный в j позициях вперёд от этого итератора. (Если j отрицательно, итератор перемещается назад.)
Эта операция может быть медленной для больших значений j.
См. также operator-().
iterator &iterator::operator++()
Префиксный оператор ++ (++i) перемещает итератор к следующему элементу в хэше и возвращает итератор на новый текущий элемент.
Вызов этой функции для QHash::end() приводит к неопределённым результатам.
См. также operator--().
итератор iterator::operator++(int)
Это перегруженная функция.
Постфиксный оператор ++ (i++) перемещает итератор к следующему элементу в хэше и возвращает итератор на ранее текущий элемент.
итератор &iterator::operator+=(int j)
Перемещает итератор на j элементов. (Если j отрицательно, итератор перемещается назад.)
См. также operator-=() и operator+().
итератор iterator::operator-(int j) const
Возвращает итератор на элемент, находящийся на j позиций назад от текущего итератора. (Если j отрицательно, итератор перемещается вперёд.)
Эта операция может быть медленной для больших значений j.
См. также operator+().
итератор &iterator::operator--()
Префиксный оператор -- (--i) делает предыдущий элемент текущим и возвращает итератор, указывающий на новый текущий элемент.
Вызов этой функции для QHash::begin() приводит к неопределённым результатам.
См. также operator++().
итератор iterator::operator--(int)
Это перегруженная функция.
Постфиксный оператор -- (i--) делает предыдущий элемент текущим и возвращает итератор, указывающий на ранее текущий элемент.
итератор &iterator::operator-=(int j)
Перемещает итератор назад на j элементов. (Если j отрицательно, итератор перемещается вперёд.)
См. также operator+=() и operator-().
T *iterator::operator->() const
Возвращает указатель на значение текущего элемента.
См. также value().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qhash-iterator.html