доступ к элементу QMap по его значению, а не по ключу

я хочу получить доступ к QMap по его значению, но я не хочу перебирать его и находить элемент с таким же значением и использовать его ключ, есть ли способ найти ключ QMap по его содержимому? мой код:

    QMap<int, QVector<QString> >::iterator it;
QMap <QString, int> m_all_data;

я хочу получить доступ к элементу m_all_data со значением моего ключа iterator;


person mari    schedule 29.04.2014    source источник
comment
нет, надо повторить   -  person BЈовић    schedule 29.04.2014
comment
возможный дубликат Как найти соответствующее значение ключа из строки, вставленной в QMap?   -  person lethal-guitar    schedule 29.04.2014


Ответы (3)


Ты можешь использовать:

const Key QMap::key ( const T & value ) const 

который возвращает первый ключ со значением значения или

QList<Key> QMap::keys ( const T & value ) const

который возвращает список, содержащий все ключи на карте в порядке возрастания.

Но это медленно (линейное время), потому что внутренняя структура данных QMap оптимизирована для быстрого поиска по ключу, а не по значению.

person Nejat    schedule 29.04.2014

Вы можете использовать QMap::values (http://qt-project.org/doc/qt-4.8/qmap.html#values), чтобы получить значения.

Это даст вам QList, по которому вы можете выполнить итерацию, и для данного значения вы можете получить ключ, используя QMap::key (http://qt-project.org/doc/qt-4.8/qmap.html#key), чтобы получить ключ для заданного значения.

person Ferenc Deak    schedule 29.04.2014
comment
Это создаст временный контейнер. Хороший ответ от @Nejat - person DrumM; 18.12.2018

Вы можете поддерживать второй QMap с итераторами, указывающими на первую карту, т.е.

QMap<QString, int> m_all_data;
QMap<int, QList<QMap<QString, int>::iterator> > m_data_by_int;

Обратите внимание, что каждое значение int будет отображаться в список итераторов, поскольку может быть несколько записей сопоставления с одним и тем же значением. Использование итераторов позволяет избежать дублирования данных QString. Однако вам нужно убедиться, что две карты синхронизированы, поэтому, возможно, лучше всего обернуть две карты в класс «двунаправленной карты».

person Frerich Raabe    schedule 29.04.2014