Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QMap或QHash中的QSet_C++_Qt_Qt4_Comparison_Qmap - Fatal编程技术网

C++ QMap或QHash中的QSet

C++ QMap或QHash中的QSet,c++,qt,qt4,comparison,qmap,C++,Qt,Qt4,Comparison,Qmap,我有QMap我想把QSet作为它的关键,我不能这样做,因为QSet是不可比较的。 例如: QSet<int> intSet; QMap<QSet<int>, char> charSet; intSet.insert(1); intSet.insert(2); intSet.insert(3); charSet.insert(intSet, '6'); QSet-intSet; QMap字符集; 插入(1); 插入(2); 插入(3); 插入(intSet

我有
QMap
我想把
QSet
作为它的关键,我不能这样做,因为
QSet
是不可比较的。 例如:

QSet<int> intSet;
QMap<QSet<int>, char> charSet;

intSet.insert(1);
intSet.insert(2);
intSet.insert(3);

charSet.insert(intSet, '6');
QSet-intSet;
QMap字符集;
插入(1);
插入(2);
插入(3);
插入(intSet,'6');

有什么办法使它起作用吗?如果我从
QSet
继承并定义
操作符你似乎知道如何使它工作:定义
操作符假设你不担心性能(如果你使用容器作为键,我认为这是一个公平的假设),那么我会这样做

QSet<int> intSet;
intSet << 1 << 2 << 3 << 3 << 4;

QVector<int> intVector;
intVector.reserve(intSet.size());
qCopy(intSet.begin(), intSet.end(), std::back_inserter(intVector)); // QVector doesn't have a std::vector range constructor atm
qSort(intVector);

QHash<QVector<int>, char> charHash;
charHash[intVector] = '6';
QSet-intSet;

intSet似乎不需要值语义。为何不使用:

QHash<QSet<int> *, char> charSet;
//then to insert a set
charSet.insert(& intSet, '6');
QHash字符集;
//然后插入一个集合
插入(&intSet,'6');

但是,对于每个集合,只有一个字符对应于一个集合,所以为什么不扩展QSet并添加额外的成员呢?

您可以创建如下哈希方法

uint qHash(const QSet<int>& set) {
  uint seed = 0;

  for(int x : set) {
     seed ^= qHash(x) + 0x9e1559a9 + (seed << 6) + (seed >> 2);
  }
  return seed;
}
uint qHash(常量QSet&set){
uint种子=0;
for(int x:set){
seed^=qHash(x)+0x9e1559a9+(seed>2);
}
返回种子;
}
那么您的QMap将是这样的

QMap<uint, char> charSet;
QMap字符集;
其中uint是先前方法的结果


实际上,这种方法不是100%稳定的,这取决于你的散列函数。

你可能应该告诉我们你想用
QSet
作为键的意图。检查这个@birrree我有一个集合列表,我想到达特定的对象取决于每个集合。尽管这些集合的可能重复语义不兼容(当然,它们是否符合OP的要求是一个悬而未决的问题)。该问题要求容器将所有空集视为相等,只存储一个值。存储指针将为插入的每个不同空集存储一个值。@AndyRoss如果作者询问如何实现集合比较,我怀疑他是否需要此比较。集合比较可以在未定义的NUM中实现呃,当然。我非常担心性能,我认为它对我不起作用:(然后重点制作一个生成速度非常快的键。如果您定义了qHash函数,那么您可以直接在
qHash
中使用哈希结构,也就是说,您可以编写
qHash
。我对集合中的元素使用了qHash,其中qHash并没有定义为所有设置,但我可以看到您已经使用pr为整个
QSet
定义了qHashe定义的
qHash(int)
。顺便问一下,为什么要将
0x9e1559a9
添加到
种子
和shift
>2
?上述哈希函数不起作用。请不要使用它。请参阅以获得正确的
qHash(QSet)