У меня есть набор из примерно 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, но я не уверен, как использовать его со структурой.
Спасибо,
м.
Вы можете рассмотреть возможность использования мультикарты вместо QVector. С помощью multimap вы можете отобразить ваши переменные следующим образом:
Сырое представление:
{
VAR1, a
VAR1, b
VAR2, c
VAR1, d
VAR3, e
etc...
}
Затем вы можете использовать функцию multimap :: equal_range (), чтобы получить набор переменных с тем же «ключом», например, переменные с ключом «VAR1».
Я не уверен, есть ли QMultimap, но есть определенно QMap, который я не смотрел. Но если не просто использовать стандартную мультикарту c ++.
после некоторого профилирования оказалось, что 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