Spec-Zone.ru › Qt 5.14

Класс 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API