我想用三个参数创建QHash:
QHash <int, QString, float> myhash;
我知道我必须使用嵌套的QHash,所以我做了:
QHash <int, QHash<QString, float> > myhash;
但我无法弄清楚如何将值插入myhash。 我试图创建另一个Qhash并将其插入到myhash中,但我没有任何意义,因为我只有一对数据的1对数据。 我最想要的是:
0, "string1", 1.5
1, "string2", 1.2 etc.
我如何有效地创建(在查找时间方面(我使用QHash的原因))上面的数组。以及如何在之后插入值。
谢谢。
答案 0 :(得分:2)
使用QHash <int, QHash<QString, float> > myhash;
,您只需执行此操作即可设置值:
myhash[42]["fortytwo"] = 42.42;
您可以使用相同的语法来访问元素,但请注意,当使用非const operator[]
访问时,这些条目实际上将在哈希中创建。因此,使用value()
method:
if (myhash.value(43).value("fortytwo") >= 42) { /*...*/ }
请注意,对于QHash
和QMap
,访问不在地图中的键是正常的,在这种情况下会返回default constructed值。首先是上面的意思是空哈希,第二个是值0.0f
。
要将此与其他答案中使用QPair
的方法进行比较,这有一个特别的优势,即如果对您的用例很重要,您可以轻松地通过“行”访问元素(只需确保您有嵌套的哈希以正确的顺序)。此外,使用此方法,您可以为不同的维度使用不同的容器,例如,如果您需要对要排序的一个维度使用QMap
(按键排序),并QHash
(更多高效的)不需要排序的维度。此外,您可以轻松地拥有任意数量的维度,只需添加更多嵌套容器。
另一方面,如果键在逻辑上是一对永远不会分离的值,并且数据不是真正(从编程角度来看)组织为二维表,那么使用{密钥的{1}}可能更好。
与问题无关:提高效率,在Qt 5和C ++ 11 you could use QStringLiteral("fortytwo")
中已经在编译时创建了QPair
。
答案 1 :(得分:1)
使用QPair作为您的钥匙:
QHash<QPair<int,QString>,float> myhash;
插入值:
myhash.insert(QPair<int,QString>(1,"string1"),12.);
或
QPair<int,QString> p(1,"string1");
myhash[p] = 12.