QSet使用及Qt自定義類型使用QHash等算法
阿新 • • 發佈:2017-12-07
算法 har 地址 node slc doc support ati tarray 版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址:
本文標題:QSet使用及Qt自定義類型使用QHash等算法 本文地址:http://techieliang.com/2017/12/580/ 文章目錄
本文標題:QSet使用及Qt自定義類型使用QHash等算法 本文地址:http://techieliang.com/2017/12/580/ 文章目錄
- 1. 介紹
- 2. 簡單範例
- 3. 自定義類型
1. 介紹
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().
2. 簡單範例
- QSet <QString> m_set;
- m_set.insert("1");
- m_set.insert("3");
- m_set.insert("2");//註意插入順序
- auto b_set = m_set.begin();
- qDebug()<<m_set.size();
- qDebug()<<*b_set++;
- qDebug()<<*b_set++;
- qDebug()<<*b_set++;//註意存儲順序
- m_set.insert("1");//插入重復的
- b_set = m_set.begin();
- qDebug()<<m_set.size();
- qDebug()<<*b_set++;
- qDebug()<<*b_set++;
- qDebug()<<*b_set++;
結果
- 3
- "1"
- "2"
- "3"
- 3
- "1"
- "2"
- "3"
3. 自定義類型
- #include <QCoreApplication>
- #include <QSet>
- #include <QDebug>
- 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<testCustomTypeByQSet> 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()<<m_set.size();
- 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<T1, T2> &key, uint seed = 0)
- uint qHash(const std::pair<T1, T2> &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, T> &key, uint seed = 0)
- uint qHash(const QSet<T> &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類。
轉載請以鏈接形式標明本文標題和地址:Techie亮博客 » QSet使用及Qt自定義類型使用QHash等算法QSet使用及Qt自定義類型使用QHash等算法