QVector со структурой - производительность + лучшие практики

У меня есть набор из примерно 150 переменных, которые могут иметь различный тип (double, bool, array). Этот набор переменных мне нужно упаковать в QVector. Поскольку переменные типа меняются, я подумал об использовании QVariant. Пока это мой дизайн. Что я не уверен, так это производительность + механизм поиска myVariables.

enum class VariableEnums{
  VAR1,
  VAR2,
  VAR3
};

struct myVariable{
  VariableEnums var;
  QVariant value;
};

QVector<myVariable> myVariables;

Идея в том, что myVariables будет отправлено в несколько модулей. Каждый модуль найдет определенную переменную и обновит некоторую другую переменную. Таким образом, один модуль может обновить переменную, которая будет использоваться другим модулем. Что касается поиска конкретной переменной, я могу думать только следующее:

foreach(myVariable *myVar, myVariables{
   if(myVar->var == VariableEnums::VAR1){
    //......
    continue;
   }
}

Есть ли более эффективный способ сделать это? Я мог бы использовать indexOf, но я не уверен, как использовать его со структурой.

спасибо, м

2 ответа

Решение

После некоторого профилирования оказалось, что QVector со структурой перечислений была самой быстрой комбинацией. QVector

Я пробовал QHash, QMap и для держателей данных QString и QVariant

тест:

...searching in dataset size:  1090000 
testing < QVector<struct enum> > case time (ms): 242 
testing < QVector<struct QString> > case time (ms): 1220 
testing < QMap<enum, QVariant> > case time (ms): 3458 
testing < QHash<enum, QVariant> > case time (ms): 2167 

Вы можете рассмотреть возможность использования мультикарты вместо QVector. С помощью multimap вы можете отобразить ваши переменные следующим образом:

Сырое представление:

{
    VAR1, a
    VAR1, b
    VAR2, c
    VAR1, d
    VAR3, e
    etc...
}

Затем вы можете использовать функцию multimap::equal_range(), чтобы получить набор переменных с одинаковым "ключом", например, переменные с ключом "VAR1".

Я не уверен, есть ли QMultimap, но есть определенно QMap, который я не смотрел. Но если не просто использовать стандартную мультикарту C++.

Другие вопросы по тегам