Qt/C++散列
我正在将一个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;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
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。我已经在上面的代码中添加了我现在使用的内容。