QT:用QSet儲存自定義結構體的問題
阿新 • • 發佈:2019-01-07
前幾天要用QSet作為儲存一個自定義的結構體(就像下面這個程式一樣),結果死活不成功。。。
以後寫程式碼時,一定不能想當然了啊,切記!!!
後來還跑到論壇上問人了,丟臉丟大了。。。
事先說明:以下這個例子是錯誤的
[cpp] view plaincopyprint?- #include <QtCore>
- struct node
- {
- int cx, cy;
- bool operator < (const node &b) const
- {
- return cx < b.cx;
- }
- };
- int main(int argc, char *argv[])
- {
-
QCoreApplication app(argc, argv);
- QSet<node> ss;
- QSet<node>::iterator iter;
- node temp;
- int i, j;
- for(i=0,j=100;i<101;i++,j--)
- {
- temp.cx = i;
- temp.cy = j;
- ss.insert(temp);
- }
- for(iter=ss.begin();iter!=ss.end();++iter)
-
qDebug() << iter->cx << " "
- return 0;
- }
後來經過高手提醒,再經過自己看文件,才發現QSet和STL的set是有本質區別的,雖然它們的名字很像,前者是基於雜湊表的,後者是紅黑樹的變種。。。。
QT文件中清楚地寫著: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.
簡而言之,就是:
QSet是基於雜湊演算法的,這就要求自定義的結構體Type必須提供:
1. bool operator == (const Type &b) const
2. 一個全域性的uint qHash(Type key)函式
廢話說完了,上正確的程式碼:
[cpp] view plaincopyprint?- #include <QtCore>
- struct node
- {
- int cx, cy;
- bool operator < (const node &b) const
- {
- return cx < b.cx;
- }
- bool operator == (const node &b) const
- {
- return (cx==b.cx && cy==b.cy);
- }
- };
- uint qHash(const node key)
- {
- return key.cx + key.cy;
- }
- int main(int argc, char *argv[])
- {
- QCoreApplication app(argc, argv);
- QSet<node> ss;
- QSet<node>::iterator iter;
- node temp;
- int i, j;
- for(i=0,j=100;i<101;i++,j--)
- {
- temp.cx = i;
- temp.cy = j;
- ss.insert(temp);
- }
- for(iter=ss.begin();iter!=ss.end();++iter)
- qDebug() << iter->cx << " " << iter->cy;
- return 0;
- }
以後寫程式碼時,一定不能想當然了啊,切記!!!