Реализация 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 ответ

Решение

Опция 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;
}
Другие вопросы по тегам