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一起形成唯一键。

最佳答案

我认为这里的主要问题是作为哈希表的QHash通过对键进行哈希查找值。因此,它需要完成密钥才能查找值。一个“部分”键是不够的-那时将没有具体的对象可以哈希。 map 也会出现类似的问题:要浏览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上构建,请参见this question

这当然是线性的,因为,正如我已经说过的那样,散列需要完整的对象才能执行查找,因此在这种情况下我们不能使用对数复杂度查找。

关于c++ - QPair迭代的QHash,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35432452/

10-11 16:31