如何用 QHash 创建三维数组?

Posted

技术标签:

【中文标题】如何用 QHash 创建三维数组?【英文标题】:How to create three dimensional array with QHash? 【发布时间】:2014-03-03 20:08:48 【问题描述】:

我想用三个参数创建 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 的原因))。以及之后如何插入值。

谢谢转发。

【问题讨论】:

你的问题是二维的,第三个值是二维表单元格中的值。 【参考方案1】:

使用QHash &lt;int, QHash&lt;QString, float&gt; &gt; myhash;,您可以简单地执行以下操作来设置值:

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

您可以使用相同的语法来访问元素,但请注意,当使用非 const operator[] 访问时,这些条目实际上将在散列中创建。所以通常最好使用value() method:

if (myhash.value(43).value("fortytwo") >= 42)  /*...*/ 

注意对于QHashQMap,访问不在map中的key是可以的,在这种情况下会返回default constructed值。上面首先表示空哈希,其次表示值0.0f


要将其与其他答案中使用 QPair 的方法进行比较,这具有特殊的优势,即您可以通过“行”轻松访问元素,如果这对您的用例很重要(只要确保您有嵌套的以正确的顺序散列)。此外,使用这种方法,您可以为不同的维度使用不同的容器,例如,如果您需要对一个维度进行排序,请使用 QMap(按键排序),QHash(更有效)用于不需要排序的维度。此外,您可以轻松拥有任意数量的维度,只需添加更多嵌套容器即可。

另一方面,如果键在逻辑上是一对从不分离的值,并且数据不是真的(从编程角度)组织为二维表,那么使用@ 987654336@ for key 可能更好。


与问题无关:为了提高效率,在 Qt 5 和 C++11 you could use QStringLiteral("fortytwo") 中已经在编译时创建了 QString

【讨论】:

非常感谢您的详细回答。现在我可以正确地选择对我有益的东西了。【参考方案2】:

使用 QPair 作为密钥:

QHash<QPair<int,QString>,float> myhash;

插入值:

myhash.insert(QPair<int,QString>(1,"string1"),12.);

QPair<int,QString> p(1,"string1");

myhash[p] = 12.

【讨论】:

您好,感谢您的回答。你能告诉我如何在 myhash 中插入值吗? @user3185491:我添加了插入示例。

以上是关于如何用 QHash 创建三维数组?的主要内容,如果未能解决你的问题,请参考以下文章

三维数组

如何用C#构建三维空间

遍历三维数组

请问如何用matlab画三维点,已知x,y,z的坐标,在三维坐标系上显示

如何在C++中使用动态三维数组

三维数组的计算方法