Spec-Zone.ru › Qt 6.0

iterator Класс

класс QMultiHash::iterator

Класс QMultiHash::iterator предоставляет итератор в стиле STL для 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++()
iterator operator++(int)
T * operator->() const
bool operator==(const iterator &other) const
bool operator==(const const_iterator &other) const

Подробное описание

QMultiHash предоставляет как итераторы в стиле STL, так и итераторы в стиле Java. Итераторы в стиле STL более низкого уровня и более громоздки в использовании; с другой стороны, они немного быстрее и, для разработчиков, знакомых со STL, обладают преимуществом понятности.

QMultiHash<Key, T>::iterator позволяет перебирать QMultiHash и изменять значение (но не ключ) связанное с определённым ключом. Если вы хотите перебирать QMultiHash как константный, вы должны использовать QMultiHash::const_iterator. В целом, рекомендуется использовать QMultiHash::const_iterator и для неконстантных QMultiHash, если только у вас нет необходимости изменять QMultiHash через итератор. Константные итераторы немного быстрее и могут повысить читаемость кода.

Конструктор QMultiHash::iterator по умолчанию создаёт неинициализированный итератор. Вы должны инициализировать его с помощью функции QMultiHash, такой как QMultiHash::begin(), QMultiHash::end() или QMultiHash::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, который упорядочивает свои элементы по ключу, QMultiHash хранит свои элементы в произвольном порядке.

Давайте рассмотрим несколько примеров того, что мы можем сделать с QMultiHash::iterator, чего мы не можем сделать с QMultiHash::const_iterator. Вот пример, который увеличивает каждое значение, хранящееся в QMultiHash, на 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;
}

Вызов QMultiHash::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::reserve() или QHash::squeeze(), может сделать все итераторы, указывающие в хеш, недействительными. Итераторы гарантированно остаются действительными только до тех пор, пока QHash не вынужден увеличить/уменьшить свою внутреннюю хеш-таблицу. Использование любого итератора после того, как произошла перехеширование, приведёт к неопределённому поведению.

Однако вы можете безопасно использовать итераторы для удаления записей из хеша с помощью метода QHash::erase(). Этот метод можно безопасно вызывать во время итерации, и он не повлияет на порядок элементов в хеше.

Если вам нужно хранить итераторы в течение длительного периода времени, мы рекомендуем использовать QMultiMap вместо QHash.

Предупреждение: Итераторы неявно разделяемых контейнеров не работают точно как итераторы STL. Следует избегать копирования контейнера, пока активны итераторы на этом контейнере. Для получения дополнительной информации см. Проблему итераторов неявного совместного использования.

См. также QMultiHash::const_iterator, QMultiHash::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=() для присвоения значения перед использованием.

См. также QMultiHash::begin() и QMultiHash::end().

const Key &iterator::key() const

Возвращает ключ текущего элемента в виде ссылки на константу.

Нет прямого способа изменения ключа элемента через итератор, хотя это можно сделать, вызвав QMultiHash::erase() и QMultiHash::insert().

См. также value().

T &iterator::value() const

Возвращает изменяемую ссылку на значение текущего элемента.

Вы можете изменить значение элемента, используя value() в левой части присваивания, например:

if (i.key() == "Hello")
    i.value() = "Bonjour";

См. также key() и operator*().

T &iterator::operator*() const

Возвращает изменяемую ссылку на значение текущего элемента.

То же, что и value().

См. также key().

iterator &iterator::operator++()

Префиксный оператор ++ (++i) перемещает итератор к следующему элементу в хеше и возвращает итератор на новый текущий элемент.

Вызов этой функции для QMultiHash::end() приводит к неопределённым результатам.

iterator iterator::operator++(int)

Это перегруженная функция.

Постфиксный оператор ++ (i++) перемещает итератор к следующему элементу в хеше и возвращает итератор на ранее текущий элемент.

T *iterator::operator->() const

Возвращает указатель на значение текущего элемента.

См. также value().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qmultihash-iterator.html

Spec-Zone.ru

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