Qt / C ++ хэш хэшей - PullRequest
       8

Qt / C ++ хэш хэшей

1 голос
/ 13 мая 2019

Я конвертирую Perl-программу в Qt / C ++.Большая часть кода имеет прямое преобразование в функцию C ++ или Qt.Однако я не уверен, как перенести хэш Perl-хэшей.

Вот пример многоуровневых хэшей, которые я использую для организации некоторых данных

$series{$uid}{$studynum}{$seriesnum}{'exportseriesid'} = $exportseriesid;
$series{$uid}{$studynum}{$seriesnum}{'seriesid'} = $seriesid;
$series{$uid}{$studynum}{$seriesnum}{'subjectid'} = $subjectid;
$series{$uid}{$studynum}{$seriesnum}{'studyid'} = $studyid;
$series{$uid}{$studynum}{$seriesnum}{'modality'} = $modality;

Я использовалQHash для создания одноуровневых хэшей, таких как

QHash<QString, QString> cfg;
int n = cfg["threads"].toInt();

Существует ли метод, аналогичный C ++ или использующий QHash?

ОБНОВЛЕНИЕ:

Iв конечном итоге использовать вложенные QMaps.QMap автоматически сортируется по ключу при его итерации, а QHash нет.Вот код, который я в конечном итоге использовал

/* create a multilevel hash s[uid][study][series]['attribute'] */
QMap<QString, QMap<int, QMap<int, QMap<QString, QString>>>> s;

/* iterate through the UIDs */
for(QMap<QString, QMap<int, QMap<int, QMap<QString, QString>>>>::iterator a = s.begin(); a != s.end(); ++a) {
    QString uid = a.key();

    /* iterate through the studynums */
    for(QMap<int, QMap<int, QMap<QString, QString>>>::iterator b = s[uid].begin(); b != s[uid].end(); ++b) {
        int studynum = b.key();

        /* iterate through the seriesnums */
        for(QMap<int, QMap<QString, QString>>::iterator c = s[uid][studynum].begin(); c != s[uid][studynum].end(); ++c) {
            int seriesnum = c.key();

            int exportseriesid = s[uid][studynum][seriesnum]["exportseriesid"].toInt();

            /* etc... */
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 13 мая 2019

Прямой эквивалент хеша / словаря - unordered_map .Затем вы можете вкладывать их, как в примере с Perl.Это приводит к иерархии, которую может быть трудно поддерживать, так же, как это происходит в языках сценариев, когда она заходит слишком далеко.Основная идея

#include<iostream>
#include<string>
#include<unordered_map>

using std::string;
using std::cout;
using std::endl;

int main() 
{
    typedef std::unordered_map<string, int>    bottom;
    typedef std::unordered_map<string, bottom> nextlev;
    std::unordered_map<string, nextlev>        h3d;

    h3d["toplev"]["nextlev"]["seriesid"]  = 3;
    h3d["toplev"]["nextlev"]["subjectid"] = 11;

    for (auto k: h3d) {
        cout << k.first << " => " << endl;
        for (auto k2: k.second) {
            cout << "\t" << k2.first << " => " << endl;
            for (auto k3: k2.second)
                cout << "\t\t" << k3.first << " => " << k3.second << endl;
        }
    }   

    return 0;
}

Это может (или не может) работать плохо в некоторых случаях использования.Вы, вероятно, хотите struct для группировки значений.Более сложную и осторожную структуру см., Например, в этом посте .

Наконец, я бы порекомендовал реализовать этот многоуровневый хэш как класс.Это хорошая идея и для языка сценариев, когда связанные данные становятся громоздкими: переписать как класс.

3 голосов
/ 13 мая 2019

Вы можете использовать QHash следующим образом:

QHash<QString, QHash<QString, QString>> two_level_hash;
two_level_hash["first_level"]["second_level"] = "your data";

это работает для хэшей с желаемым количеством уровней.

0 голосов
/ 13 мая 2019

Я не знаком с perl, но, судя по всему, я подозреваю, что вам нужно что-то вроде этого:

struct PropertyPath {
    QString uid;
    QString studynum; // or other type of your preference 
    QString seriesnum;// or other type of your preference 
    QString name;
}

uint qHash(const PropertyPath& p, uint seed = 0)
{
    auto h = qHash(p.uid, seed);
    h = qHash(p.studynum, h);
    h = qHash(p.seriesnum, h);
    h = qHash(p.name, h);
    return h;
}

QHash<PropertyPath, QString> cfg;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...