QList<QVariant>
のキーとして使用する必要がありますstd::unordered_map
。これの目的は、一意のキー列にインデックスを作成することにより、データ テーブルの検索を最適化することです。
だから私はこのコードを作りました。完全ではありませんが、テーブル キー列で発生するいくつかの基本的なデータ型を示します。
#include <unordered_map>
#include <string>
//std::hash
#include <functional>
//std::size_t
#include <cstddef>
// Hashing method for QVariantList
namespace std {
template <>
struct hash<QList<QVariant>>
{
std::size_t operator()(const QList<QVariant>& k) const
{
using std::size_t;
using std::hash;
using std::string;
size_t hash_num = 0;
Q_FOREACH(var, k) {
// Make hash of the primitive value of the QVariant
switch(var.type()) {
case QVariant::String : {
hash_num = hash_num^hash<string>(var.toString().toStdString());
break;
}
case QVariant::Char :
case QVariant::ULongLong :
case QVariant::UInt :
case QVariant::LongLong :
case QVariant::Int : {
hash_num = hash_num^hash<long long>(var.toLongLong());
break;
}
case QVariant::Double : {
hash_num = hash_num^hash<double>(var.toDouble());
break;
}
}
}
return hash_num;
}
};
}
明らかに、私はすべてが好きではありませんswitch
。これは非常に長く醜いコードであり、基本的な型しか説明していません。QVariant
の内部データに割り当てられたメモリ データのハッシュを作成したいと思います。または、さらに良い - Qt のハッシュ方法を使用します。
QVariant をプリミティブ型に変換せずにハッシュする半信頼できる*方法はありますか?
*複雑なオブジェクトが QVariant の背後に隠れている可能性があることは理解していますが、これが衝突につながるケースは非常にまれであるため、気にする必要はありません。