gpt4 book ai didi

qt - 使用多个键实现类似 QHash 的查找

转载 作者:行者123 更新时间:2023-12-04 13:59:38 25 4
gpt4 key购买 nike

我试图找到实现使用多个键返回一个值的类似 QHash 的查找表的最佳方法。我已经读到 Boost 库具有类似的功能,但如果可能,我想避免这种情况。

我想做的一个例子如下(显然下面的伪代码是不可能的):

//First key (int) - Engine cylinders
//Second key (int) - Car weight
//Value (int) - Top speed
MyLookup<int, int, int> m_Lookup
m_Lookup.insert(6, 1000, 210);
m_Lookup.insert(6, 1500, 190);
m_Lookup.value(6, 1000); //Returns 210

我的第一个(也是非常缓慢的)想法是创建一个 Struct,然后遍历一个列表,直到找到符合条件的项目。
Struct Vehicle {
int cyl;
int weight;
int speed'
}

QList<Vehicle> carList; //Assume this is populated
for(i = 0; i < carList.length; ++i) {
if(carList[i].cyl == 6 && carList[i].weight == 1000) {
return carList[i].speed; } }

我的另一个想法是将两个键连接成一个键,并在需要时实现几个函数来组合和分离这两个键。虽然这会起作用,并且可能比完整迭代快很多,但它似乎有点被黑客攻击了。
QHash<QString, int> m_Lookup;
m_Lookup.insert("6|1000", 210);

有没有人知道尝试实现这一目标的更好方法?

最佳答案

选项1

使用 QPair作为你的 key :

QHash<QPair<int, int>, int> m_Lookup;

m_Lookup.insert(QPair<int, int>(6, 1000), 210);
m_Lookup.insert(QPair<int, int>(6, 1500), 190);

qDebug("Value is %d", m_Lookup.value(QPair<int, int>(6, 1000)));

选项 2

创建一个类来表示您想要的车辆特性(完整的等式/不等式运算符)并创建 qHash 的实现为您的类(class):
class Vehicle
{
public:
Vehicle(short cylinders, short weight)
: m_Cylinders(cylinders), m_Weight(weight) { }

short cylinders() const { return m_Cylinders; }
short weight() const { return m_Weight; }

bool operator==(const Vehicle& other) const
{ return (m_Cylinders == other.m_Cylinders && m_Weight == other.m_Weight); }
bool operator!=(const Vehicle& other) const
{ return !operator==(other); }

private:
short m_Cylinders;
short m_Weight;
};

inline uint qHash(const Vehicle& key)
{
uint k = static_cast<uint>(key.cylinders()) << 16 | static_cast<uint>(key.weight());
return k;
}

int main(int argc, char** argv)
{
QHash<Vehicle, int> m_Lookup;

m_Lookup.insert(Vehicle(6, 1000), 210);
m_Lookup.insert(Vehicle(6, 1500), 190);

qDebug("Value is %d", m_Lookup.value(Vehicle(6, 1000)));

return 0;
}

关于qt - 使用多个键实现类似 QHash 的查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12522858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com