我想创建带有三个参数的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的原因)。以及之后如何插入值。
谢谢转发。
使用QHash <int, QHash<QString, float> > myhash;
,您可以简单地设置值:
myhash[42]["fortytwo"] = 42.42;
您可以使用相同的语法来访问元素,但请注意,当使用非常量operator[]
进行访问时,这些条目实际上将在散列中创建。因此,通常最好使用value()
方法:
if (myhash.value(43).value("fortytwo") >= 42) { /*...*/ }
注意,对于QHash
和QMap
,访问不在映射中的密钥是可以的,在这种情况下返回默认构造值。上面第一个表示和空散列,第二个表示值0.0f
。
将此方法与另一个答案中使用QPair
的方法进行比较,它具有特殊的优势,即如果对您的用例很重要,您可以轻松地按"行"访问元素(只需确保嵌套的哈希顺序正确)。此外,使用此方法,您可以对不同的维度使用不同的容器,例如,如果您需要对一个维度进行排序,请使用QMap
(按键排序),对不需要排序的维度使用QHash
(更高效)。此外,您可以轻松地拥有任意数量的维度,只需添加更多嵌套容器即可。
另一方面,如果键在逻辑上是一对从不分离的值,并且数据不是真正(从编程的角度来看)组织为二维表,那么使用QPair
作为键可能更好。
与问题无关:为了提高效率,在Qt 5和C++11中,可以使用QStringLiteral("fortytwo")
在编译时创建QString
。
使用QPair作为密钥:
QHash<QPair<int,QString>,float> myhash;
插入值:
myhash.insert(QPair<int,QString>(1,"string1"),12.);
或
QPair<int,QString> p(1,"string1");
myhash[p] = 12.