title: “ QSet使用及Qt自定义类型使用QHash等算法\t\t”
tags:

  • qhash
  • qset
  • qt
    url: 580.html
    id: 580
    categories:
  • Qt
    date: 2017-12-07 15:11:33

介绍

Qt提供的一个单值的数学集合的快速查找容器,使用方式与QList相同,但其内元素不会有重复。详细说明见 官方文档

注意,此容器实现方式是基于哈希表,而不是红黑树,若使用自定义类必须提供对应的hash函数: QSet‘s value data type must be an assignable data type. You cannot, for example, store a QWidget as a value; instead, store a QWidget *. In addition, the type must provide operator==(), and there must also be a global qHash() function that returns a hash value for an argument of the key’s type. See the QHash documentation for a list of types supported by qHash().

简单范例

QSet m_set;
m_set.insert(“1”);
m_set.insert(“3”);
m_set.insert(“2”);//注意插入顺序
auto b_set = m_set.begin();
qDebug()< qDebug()<<b_set++;
qDebug()<<
b_set++;
qDebug()<<b_set++;//注意存储顺序
m_set.insert(“1”);//插入重复的
b_set = m_set.begin();
qDebug()< qDebug()<<
b_set++;
qDebug()<<b_set++;
qDebug()<<
b_set++;

结果

3
“1”
“2”
“3”
3
“1”
“2”
“3”

自定义类型

include

include

include

class testCustomTypeByQSet {
public:
testCustomTypeByQSet(int v):m_value(v){};
int value() const{
return m_value;
}
bool operator == (const testCustomTypeByQSet &t) const {
return (m_value==t.value());
}
private:
int m_value;
};
uint qHash(const testCustomTypeByQSet &key, uint seed = 0) {
return key.value();
}
int main(int argc, char argv[]) {
QCoreApplication a(argc, argv);
QSet m_set;
m_set.insert(testCustomTypeByQSet(1));
m_set.insert(testCustomTypeByQSet(3));
m_set.insert(testCustomTypeByQSet(2));
m_set.insert(testCustomTypeByQSet(7));
m_set.insert(testCustomTypeByQSet(-1));
auto b_set = m_set.begin();
qDebug()< qDebug()<<(
b_set++).value();
qDebug()<<(b_set++).value();
qDebug()<<(
b_set++).value();
qDebug()<<(b_set++).value();
qDebug()<<(
b_set++).value();
return 0;
}

结果

5
-1
1
2
3
7

qt自身的类已经实现了对应的qHash,存储在QHash类中,详见官方文档

uint qHash(const QXmlNodeModelIndex &index)
uint qHash(const QUrl &url, uint seed = 0)
uint qHash(const QDateTime &key, uint seed = 0)
uint qHash(const QDate &key, uint seed = 0)
uint qHash(const QTime &key, uint seed = 0)
uint qHash(const QPair &key, uint seed = 0)
uint qHash(const std::pair &key, uint seed = 0)
uint qHash(char key, uint seed = 0)
uint qHash(uchar key, uint seed = 0)
uint qHash(signed char key, uint seed = 0)
uint qHash(ushort key, uint seed = 0)
uint qHash(short key, uint seed = 0)
uint qHash(uint key, uint seed = 0)
uint qHash(int key, uint seed = 0)
uint qHash(ulong key, uint seed = 0)
uint qHash(long key, uint seed = 0)
uint qHash(quint64 key, uint seed = 0)
uint qHash(qint64 key, uint seed = 0)
uint qHash(float key, uint seed = 0)
uint qHash(double key, uint seed = 0)
uint qHash(const QChar key, uint seed = 0)
uint qHash(const QByteArray &key, uint seed = 0)
uint qHash(const QBitArray &key, uint seed = 0)
uint qHash(const QString &key, uint seed = 0)
uint qHash(const QStringRef &key, uint seed = 0)
uint qHash(QLatin1String key, uint seed = 0)
uint qHash(const T *key, uint seed = 0)
uint qHash(const QHash &key, uint seed = 0)
uint qHash(const QSet &key, uint seed = 0)
uint qHash(const QVersionNumber &key, uint seed = 0)
uint qHash(const QSslCertificate &key, uint seed = 0)
uint qHash(QSslEllipticCurve curve, uint seed = 0)
uint qHash(const QSslError &key, uint seed = 0)
uint qHash(const QGeoCoordinate &coordinate, uint seed = 0)

同时也在对应类中做了“==”的重载操作符,比如QString类