QSet in QMap or QHash
QSet in QMap or QHash
我有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
继承并定义operator <
我应该如何实现它? 即:比较的逻辑应该是什么?
注意:我太在乎性能了
你似乎知道如何让它工作:定义一个operator<(const QSet<int>&)
函数(我不相信Qt要求你子类QSet来做这项工作,我知道STL没有)。
显然,在无序集合上实现比较器将是困难的。 我相信,这样做使它以恒定的时间运行是不可能的。 您可以尝试先检查大小,然后将两个内容作为列表进行排序和比较。
但从广义上讲:不要这样做。 这是一种虐待。 当然,对于集合的键,您可以使用一些不是可变数据结构的东西。 集合中整数的空间是否固定且较小(即总是在 0-1024 或其他范围内)? 然后尝试存储在 QByteArray 中的位掩码。 等。。。
你可以像这样创建一个哈希方法
uint qHash(const QSet<int>& set) {
uint seed = 0;
for(int x : set) {
seed ^= qHash(x) + 0x9e1559a9 + (seed << 6) + (seed >> 2);
}
return seed;
}
那么你的QMap将是这样的
QMap<uint, char> charSet;
其中 uint 是先前方法的结果。
实际上这种方式不是 100% 稳定 ,这取决于您的哈希函数。
似乎您不需要值语义。沃为什么不使用:
QHash<QSet<int> *, char> charSet;
//then to insert a set
charSet.insert(& 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';
这将非常缓慢地添加,但查找应该(相对)快。
不过,我建议你想出一个更好的钥匙。也许是一个具有固定数量的整数的简单类,您只需定义必要的运算符即可将其放入映射/哈希中。
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 模式"allocate memory or use existing data"
- N-API include an .so or dll
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 将 OR 逻辑运算符从 C++ 转换为 Fortran
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 如何使用 std::string 作为 QHash 的键?
- 我如何将 OR 与 if 语句一起使用字符串
- 在类中初始化 QHash
- 将 if 语句中的字符与 or 进行比较
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 如何覆盖 qHash() 函数?
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- "No such file or directory" C++标头问题
- 处理 std::enable_if<...中谓词的逻辑"OR">
- C++ 虽然语句不适用于字符串和"or"
- QSet in QMap or QHash