На этом шаге рассмотрим cловари QMap<K,T>, QMultiMap<K,T>.
Словари, в принципе, похожи на обычные, используемые в повседневной жизни. Они хранят элементы одного и того же типа, индексируемые ключевыми значениями. Главное достоинство словаря в том, что он позволяет быстро получать значение, ассоциированное с заданным ключом. Ключи должны быть уникальными (рис. 1а), за исключением мультисловаря, который допускает дубликаты (рис. 1б).
Рис.1. Словарь (а) и мультисловарь (б)
В контейнеры этого типа заносятся элементы вместе с ключами, по которым их можно найти и которыми могут выступать значения любого типа. В случае со словарем QMap<K,T> необходимо следить за тем, чтобы не было занесено двух разных элементов с одинаковым ключом, ведь в таком случае один из этих элементов невозможно будет отыскать. Каждый ключ словаря QMap<K,T> должен быть уникален.
При создании объекта класса QMap<K,T> нужно передать его размер в конструктор. Этот размер не является, как это принято в других контейнерных классах, размером, ограничивающим максимальное количество элементов, а представляет собой количество позиций. Количество позиций должно быть больше количества элементов, ожидаемых для хранения, иначе поиск элементов в словаре будет проводиться недостаточно эффективно. Желательно, чтобы это значение относилось к разряду простых чисел, т. к. в этом случае размещение элементов будет более удобным. Таблица 1 содержит некоторые из методов класса QMap<K,T>.
Таблица 1. Некоторые методы контейнера QMap<K,T>
Метод | Описание |
---|---|
lowerBound() | Возвращает итератор, указывающий на первый элемент с заданным ключом |
toStdMap() | Возвращает стандартный словарь STL с элементами, находящимися в объекте QMap<T> |
upperBound() | Возвращает итератор, указывающий на последний элемент с заданным ключом |
Одним из самых частых способов обращения к элементам словаря является использование
ключа в операторе []. Но можно обойтись и без него, т. к. ключ и значение можно получить с помощью методов итератора key() и value(), например:
QCoreApplication a(argc, argv); QMap<QString, QString> mapPhbook; mapPhbook["Olga"] = "+79128795566"; mapPhbook["Gleb"] = "+79195489785"; mapPhbook["Oleg"] = "+79125487898"; QMap<QString, QString>::iterator it = mapPhbook.begin(); for (;it != mapPhbook.end(); ++it) { qDebug() << "Name: " << it.key() << " Phone: " << it.value(); }
Рис.2. Результат работы программы
Файлы приложения можно взять Предыдущий шаг
Содержание
Следующий шаг