Qt/C++散列

Qt/C++散列,c++,qt,perl,C++,Qt,Perl,我正在将一个Perl程序转换为Qt/C++。大多数代码都直接转换为C++或Qt函数。但是,我不确定如何迁移散列的Perl散列 下面是一个多级哈希的例子,我用它来组织一些数据 $series{$uid}{$studynum}{$seriesnum}{'exportseriesid'}=$exportseriesid; $series{$uid}{$studynum}{$seriesnum}{'seriesid'}=$seriesid; $series{$uid}{$studynum}{$serie

我正在将一个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-cfg; int n=cfg[threads].toInt;

C++中是否有类似的方法或使用QHASH?< /P> 更新:

我最终使用了嵌套的qmap。当对QMap进行迭代时,它会自动按键排序,而QHash则不会。下面是我最终使用的代码

/*创建多级散列[uid][study][series][attribute']*/ QMap s; /*遍历UID*/ forQMap::迭代器a=s.begin;a!=s、 结束++a{ QString uid=a.key; /*反复浏览研究报告*/ forQMap::迭代器b=s[uid]。开始;b!=s[uid]。结束;++b{ int studynum=b.key; /*反复浏览序列号*/ forQMap::迭代器c=s[uid][studynum]。开始;c!=s[uid][studynum]。结束;++c{ int seriesnum=c.key; int exportseriesid=s[uid][studynum][seriesnum][exportseriesid].toInt; /*等等*/ } } }
您可以这样使用QHash:

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

这适用于具有所需级别计数的哈希。

您可以像这样使用QHash:

QHash<QString, QHash<QString, QString>> two_level_hash;
two_level_hash["first_level"]["second_level"] = "your data";
这适用于具有所需级别计数的散列。

我不熟悉perl,但从外观上看,我怀疑您需要这样的内容:

结构属性路径{ QString-uid; QString studynum;//或您喜欢的其他类型 QString seriesnum;//或其他您喜欢的类型 QString名称; } uint qHashconst属性路径&p,uint seed=0 { auto h=qHashp.uid,seed; h=qHashp.studynum,h; h=qHashp.seriesnum,h; h=qHashp.name,h; 返回h; } QHash-cfg; 我不熟悉perl,但从外观上看,我怀疑您需要这样的东西:

结构属性路径{ QString-uid; QString studynum;//或您喜欢的其他类型 QString seriesnum;//或其他您喜欢的类型 QString名称; } uint qHashconst属性路径&p,uint seed=0 { auto h=qHashp.uid,seed; h=qHashp.studynum,h; h=qHashp.seriesnum,h; h=qHashp.name,h; 返回h; } QHash-cfg;
哈希/字典的直接等价物是。然后可以嵌套它们,就像在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;
}
在某些用例中,这可能会或可能不会表现不佳。您可能需要一个结构来分组值。有关更复杂、更仔细的结构,请参见,例如


最后,我真的建议将多级哈希实现为一个类。在脚本语言中,当链接数据变得难以处理时,这也是一个好主意:作为类重新编写。

哈希/字典的直接等价物是。然后可以嵌套它们,就像在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;
}
在某些用例中,这可能会或可能不会表现不佳。您可能需要一个结构来分组值。有关更复杂、更仔细的结构,请参见,例如


最后,我真的建议将多级哈希实现为一个类。在脚本语言中,当链接数据变得难以处理时,这也是一个好主意:将其作为类重新写入。

QHash是一个哈希映射,它在内部使用哈希函数来组织数据。它不是用来计算散列的。查看qcryptographicshash中的哈希函数。我不知道Perl代码是做什么的,所以我不知道这是否是您想要的。QHash是一种哈希映射,它在内部使用哈希函数来组织数据。它不是用来计算散列的。查看qcryptographicshash中的哈希函数。我不知道Perl代码是做什么的,所以我不知道这是否是您想要的。它将允许您在结构中具有可变级别。这正是我所寻找的,我最终使用了QMap,因为键是自动排序的。对于所有级别,键不需要是相同的数据类型,但是对于每个级别的所有项目,键都需要相同。所以所有级别1都需要是QString,所有级别2都需要是integer,等等。最后的值也需要相同,所以我将其作为QString保留。我得想想你
t如何在QMAP上迭代。我已经在上面的代码中添加了我现在正在使用的内容。这是我一直在寻找的,我最终使用了QMap,因为密钥是自动排序的。对于所有级别,键不需要是相同的数据类型,但是对于每个级别的所有项目,键都需要相同。所以所有级别1都需要是QString,所有级别2都需要是integer,等等。最后的值也需要相同,所以我将其作为QString保留。我必须弄清楚如何迭代QMAP。我已经在上面的代码中添加了我现在使用的内容。