W aplikacji mam dane w postaci:
struct Data
{
QString scope;
QString name;
QVariant value;
};
typedef QString Scope;
QHash<Scope, QList<Data>> data;
Możemy do struktury dodawać nowe przestrzenie nazw a do nich zmienne z wartościami lub dodawać nowe zmienne do już istniejących przestrzeni nazw o ile nie występuje konflikt nazw.
Problem w tym że do jednoznacznego zdefiniowania zmiennej potrzebujemy zmiennych scope i name a więc w tym wypadku wyszukiwanie mogłoby wyglądać tak :
Data value(const QString &scope, const QString &name)
{
if( data.contains(scope) ) {
QList<Data> list = data.value(scope);
auto it = std::find_if(list.begin(), list.end(),
[&](const Data & d)->bool{ return d.name == name; });
return *it;
}
}
a gdyby strukture zdefiniować tak
typedef QString Name;
QHash<Scope, QHash<Name, Data>> data;
i wyszukiwanie wygląda już lepiej
Data value(const QString &scope, const QString &name)
{
if( data.contains(scope) ) {
if( data.value(scope).contains(name) )
return data.value(scope).value(name);
}
}
czy druga opcja jest najlepszą w tym wypadku? dublujemy trochę danych bo dla każdej struktury mamy dodatkowe 2 zmienne QString które są w QHash w celu identyfikacji.