zoukankan      html  css  js  c++  java
  • QSet使用及Qt自定义类型使用QHash等算法

    博客地址已更改,文章数量较多不便批量修改,若想访问源文请到 coologic博客 查阅,网址:www.coologic.cn

    如本文记录地址为 techieliang.com/A/B/C/ 请改为 www.coologic.cn/A/B/C/ 即可查阅

    版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
    本文标题:QSet使用及Qt自定义类型使用QHash等算法     本文地址:http://techieliang.com/2017/12/580/

    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. 简单范例

    1. QSet <QString> m_set;
    2. m_set.insert("1");
    3. m_set.insert("3");
    4. m_set.insert("2");//注意插入顺序
    5. auto b_set = m_set.begin();
    6. qDebug()<<m_set.size();
    7. qDebug()<<*b_set++;
    8. qDebug()<<*b_set++;
    9. qDebug()<<*b_set++;//注意存储顺序
    10. m_set.insert("1");//插入重复的
    11. b_set = m_set.begin();
    12. qDebug()<<m_set.size();
    13. qDebug()<<*b_set++;
    14. qDebug()<<*b_set++;
    15. qDebug()<<*b_set++;

    结果

    1. 3
    2. "1"
    3. "2"
    4. "3"
    5. 3
    6. "1"
    7. "2"
    8. "3"

    3. 自定义类型

    1. #include <QCoreApplication>
    2. #include <QSet>
    3. #include <QDebug>
    4. class testCustomTypeByQSet {
    5. public:
    6. testCustomTypeByQSet(int v):m_value(v){};
    7. int value() const{
    8. return m_value;
    9. }
    10. bool operator == (const testCustomTypeByQSet &t) const {
    11. return (m_value==t.value());
    12. }
    13. private:
    14. int m_value;
    15. };
    16. uint qHash(const testCustomTypeByQSet &key, uint seed = 0) {
    17. return key.value();
    18. }
    19. int main(int argc, char *argv[]) {
    20. QCoreApplication a(argc, argv);
    21. QSet<testCustomTypeByQSet> m_set;
    22. m_set.insert(testCustomTypeByQSet(1));
    23. m_set.insert(testCustomTypeByQSet(3));
    24. m_set.insert(testCustomTypeByQSet(2));
    25. m_set.insert(testCustomTypeByQSet(7));
    26. m_set.insert(testCustomTypeByQSet(-1));
    27. auto b_set = m_set.begin();
    28. qDebug()<<m_set.size();
    29. qDebug()<<(*b_set++).value();
    30. qDebug()<<(*b_set++).value();
    31. qDebug()<<(*b_set++).value();
    32. qDebug()<<(*b_set++).value();
    33. qDebug()<<(*b_set++).value();
    34. return 0;
    35. }

    结果

    1. 5
    2. -1
    3. 1
    4. 2
    5. 3
    6. 7

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

    1. uint qHash(const QXmlNodeModelIndex &index)
    2. uint qHash(const QUrl &url, uint seed = 0)
    3. uint qHash(const QDateTime &key, uint seed = 0)
    4. uint qHash(const QDate &key, uint seed = 0)
    5. uint qHash(const QTime &key, uint seed = 0)
    6. uint qHash(const QPair<T1, T2> &key, uint seed = 0)
    7. uint qHash(const std::pair<T1, T2> &key, uint seed = 0)
    8. uint qHash(char key, uint seed = 0)
    9. uint qHash(uchar key, uint seed = 0)
    10. uint qHash(signed char key, uint seed = 0)
    11. uint qHash(ushort key, uint seed = 0)
    12. uint qHash(short key, uint seed = 0)
    13. uint qHash(uint key, uint seed = 0)
    14. uint qHash(int key, uint seed = 0)
    15. uint qHash(ulong key, uint seed = 0)
    16. uint qHash(long key, uint seed = 0)
    17. uint qHash(quint64 key, uint seed = 0)
    18. uint qHash(qint64 key, uint seed = 0)
    19. uint qHash(float key, uint seed = 0)
    20. uint qHash(double key, uint seed = 0)
    21. uint qHash(const QChar key, uint seed = 0)
    22. uint qHash(const QByteArray &key, uint seed = 0)
    23. uint qHash(const QBitArray &key, uint seed = 0)
    24. uint qHash(const QString &key, uint seed = 0)
    25. uint qHash(const QStringRef &key, uint seed = 0)
    26. uint qHash(QLatin1String key, uint seed = 0)
    27. uint qHash(const T *key, uint seed = 0)
    28. uint qHash(const QHash<Key, T> &key, uint seed = 0)
    29. uint qHash(const QSet<T> &key, uint seed = 0)
    30. uint qHash(const QVersionNumber &key, uint seed = 0)
    31. uint qHash(const QSslCertificate &key, uint seed = 0)
    32. uint qHash(QSslEllipticCurve curve, uint seed = 0)
    33. uint qHash(const QSslError &key, uint seed = 0)
    34. uint qHash(const QGeoCoordinate &coordinate, uint seed = 0)

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

    转载请以链接形式标明本文标题和地址:Techie亮博客 » QSet使用及Qt自定义类型使用QHash等算法
  • 相关阅读:
    JDBC数据库连接池的实现
    在java项目中引入dll文件
    动态调用WebService(支持SaopHeader)
    获取CPU,硬盘,网卡信息
    js调用本地程序
    ClickOnce发布的一点小经验总结
    为程序设置快捷键
    构建返回友好信息的WebService
    使用DataReader分页的测试
    【bug】internal class GetCountOfEntitiesByCriterionHibernateCallback : IHibernateCallback<int>
  • 原文地址:https://www.cnblogs.com/techiel/p/7999389.html
Copyright © 2011-2022 走看看