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



>我正在尝试找到实现类似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作为密钥:

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 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;
}

相关内容

  • 没有找到相关文章

最新更新