如何使用QHash创建三维数组



我想创建带有三个参数的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) { /*...*/ }

注意,对于QHashQMap,访问不在映射中的密钥是可以的,在这种情况下返回默认构造值。上面第一个表示和空散列,第二个表示值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.

相关内容

  • 没有找到相关文章

最新更新