1

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

谢谢转发。

4

2 回答 2

3

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

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

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

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

请注意,对于QHashand QMap,访问不在 map 中的键是可以的,在这种情况下返回默认构造值。上面首先表示空哈希,其次表示 value 0.0f


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

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


与问题无关:为了提高效率,在 Qt 5 和 C++11 中,您可以使用QStringLiteral("fortytwo")QString在编译时已经创建。

于 2014-03-04T06:31:52.427 回答
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.
于 2014-03-03T20:26:46.520 回答