如何用QHash创建三维数组?

时间:2014-03-03 20:08:49

标签: qt 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的原因))上面的数组。以及如何在之后插入值。

谢谢。

2 个答案:

答案 0 :(得分:2)

使用QHash <int, QHash<QString, float> > myhash;,您只需执行此操作即可设置值:

myhash[42]["fortytwo"] = 42.42;

您可以使用相同的语法来访问元素,但请注意,当使用非const operator[]访问时,这些条目实际上将在哈希中创建。因此,使用value() method

通常会更好
if (myhash.value(43).value("fortytwo") >= 42) { /*...*/ }

请注意,对于QHashQMap,访问不在地图中的键是正常的,在这种情况下会返回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.