QHash итерации QPair

QHash<QPair<QString N_id, QString A_id>, QString name> info

У меня есть этот QHash, и у меня есть значения N_id и имени для определенного индекса, как я могу получить значение соответствующего A_id. Я пытаюсь использовать итератор в стиле STL. Я могу изменить QHash на QMap при необходимости, но я не могу использовать:

QHash<QPair<QString N_id, QString name>, QString A_id>

Редактировать: N_id и A_id вместе образуют уникальный ключ в моем случае.

1

Решение

Я думаю, что главная проблема здесь в том, что QHash, будучи хеш-таблицей, ищет значения путем хеширования ключей. Следовательно, он должен завершить ключ, чтобы иметь возможность искать значение; «частичного» ключа не будет достаточно — тогда не будет никакого конкретного объекта для хеширования. Аналогичная проблема возникает с картой: для навигации по BST необходим полный объект, чтобы проводить сравнения и принимать решения влево / вправо. Таким образом, если не считать возврата к чертежной доске и пересмотра вашего подхода, я бы сказал, поддерживать обратную карту, будь то QHash или QMapс отображением name -> pair(n_id, a_id), Недостатком является то, что вам придется синхронизировать эти два.

Однако с существующей структурой данных я бы выполнил запрос, подобный следующему:

#include <algorithm>

QHash<QPair<QString, QString>, QString> info;
QString a_n_id {/*...*/}; // the target N_id
QString a_name {/*...*/}; // the target name
/* ... */
const auto keyList = info.keys(a_name); // QList<QPair<QString, QString> >
std::find_if(keyList.begin(), keyList.end(),
[&](decltype(info)::key_type& key) { return key.first == a_n_id; });

Увидеть этот вопрос в случае decltype(info)::value_type отказывается строить на Microsoft VS.

Это, конечно, будет линейным, поскольку, как я уже сказал, для хэша нужен полный объект, чтобы иметь возможность выполнять поиск, поэтому мы не можем использовать поиск по логарифмической сложности в этом случае.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]