解析 Qt 模板庫(kù) 詳細(xì)介紹
Qt 模板庫(kù)詳細(xì)介紹是本文要介紹的內(nèi)容吧,QT4引入了一組名為郁金香(Tulip)的容器類(lèi),用來(lái)取代老的 QCollection(QT2.3)基于指針(pointer-based)的 容器類(lèi)和QTL(QT3)基于值(value-based)的容器類(lèi)。
- Qt3模板庫(kù)(QTL) 是一套提供對(duì)象容器的模板。請(qǐng)看Qt模板庫(kù)
- QMap 提供基于值的一個(gè)字典的模板類(lèi)
- QMapConstIterator QMap的常量迭代器
- QMapIterator QMap的迭代器
- QPair 提供基于值的一對(duì)元素的模板類(lèi)
- QValueList 提供基于值的一個(gè)雙向鏈表的模板類(lèi)
- QValueListConstIterator QValueList的常量迭代器
- QValueListIterator QValueList的迭代器
- QValueStack 提供基于值的一個(gè)堆棧模板類(lèi)
- QValueVector 提供基于值的一個(gè)動(dòng)態(tài)數(shù)組模板類(lèi)
Qt模板庫(kù)(QTL)是一套提供對(duì)象容器的模板。如果你的編譯器不能用到一個(gè)適當(dāng)?shù)腟TL實(shí)現(xiàn),QTL可以替代它。它提供了對(duì)象的列表、對(duì)象的矢量(Vector 動(dòng)態(tài)數(shù)組)、從一種類(lèi)型到其它的映射(或字典),并且有關(guān)聯(lián)的迭代器(iterator)和算法。一個(gè)容器是可以包含和管理其它對(duì)象的一個(gè)對(duì)象并且提供迭代器來(lái)允許被包含的對(duì)象能夠被訪問(wèn)。
QTL類(lèi)的命名約定與其他Qt類(lèi)一致(比如,count()、isEmpty())。它們也提供額外的函數(shù)來(lái)兼容STL算法,比如size()和empty()。程序員也可以像使用STL的map一樣來(lái)使用它們。
與STL相比,QTL僅僅包含了STL容器應(yīng)用程序接口的最重要的特性,沒(méi)有平臺(tái)差異,通常要慢一些并且經(jīng)常擴(kuò)展為更少的對(duì)象代碼。
如果你不能復(fù)制你所想要存儲(chǔ)的對(duì)象,你***使用QPtrCollection和它的朋友。它們就是被設(shè)計(jì)用來(lái)正確地處理這些類(lèi)型的指針語(yǔ)義。這將適用于比如所有繼承QObject的類(lèi)。QObject沒(méi)有一個(gè)復(fù)制構(gòu)造函數(shù),所以把它們作為值來(lái)使用是不可能的。你也許可以選擇存儲(chǔ)QObject的指針到QValueList,但是直接使用QPtrList看起來(lái)是對(duì)這類(lèi)應(yīng)用程序領(lǐng)域的更好的選擇。QPtrList,像所有其它的基于QPtrCollection的容器,提供了比一個(gè)速度優(yōu)化了的基于值的容器更多健全的檢查。
如果你有一些實(shí)現(xiàn)值語(yǔ)義的對(duì)象,并且在你的目標(biāo)平臺(tái)沒(méi)有可用的STL,Qt模板庫(kù)就可以替代它。值語(yǔ)義至少需要以下這些:
一個(gè)復(fù)制構(gòu)造函數(shù),
一個(gè)賦值操作符和
一個(gè)默認(rèn)構(gòu)造函數(shù),比如一個(gè)沒(méi)有任何參數(shù)的構(gòu)造函數(shù)。
注意一個(gè)快速的復(fù)制構(gòu)造函數(shù)對(duì)于容器的總性能是完全至關(guān)重要的,因?yàn)樵S多復(fù)制操作將會(huì)發(fā)生。
如果你打算排序你的數(shù)據(jù),那么你必須在你的數(shù)據(jù)類(lèi)中實(shí)現(xiàn)operator<()。
基于值的類(lèi)的候選對(duì)象有QRect、QPoint、QSize、QString和所有簡(jiǎn)單的C++類(lèi)型,比如int、bool和double。
Qt模板庫(kù)是因?yàn)樗俣榷辉O(shè)計(jì)。迭代器是非??斓摹榱藢?shí)現(xiàn)這樣的性能,所以就比基于QPtrCollection的類(lèi)做了更少的錯(cuò)誤檢查。一個(gè)QTL容器,比如,沒(méi)有跟蹤任何關(guān)聯(lián)的迭代器。這樣就在比如刪除項(xiàng)目的時(shí)候沒(méi)有自動(dòng)地執(zhí)行有效性檢查,但無(wú)論如何,它提供了很快很好的性能。
- operator<()
自然地,這些排序模板在常量迭代器下不能工作。
- QString second( "Einstein" );
- QString name( "Albert" );
- qSwap( second, name );
- QValueList<int> l;
- l.push_back( 1 );
- l.push_back( 1 );
- l.push_back( 1 );
- l.push_back( 2 );
- int c = 0;
- qCount( l.begin(), l.end(), 1, c ); // c == 3
- QValueList<int> l;
- l.push_back( 1 );
- l.push_back( 1 );
- l.push_back( 1 );
- l.push_back( 2 );
- QValueListIterator<int> it = qFind( l.begin(), l.end(), 2 );
- QValueVector<int> v(3);
- qFill( v.begin(), v.end(), 99 ); // v包含99, 99, 99
- QValueVector<int> v1(3);
- v1[0] = 1;
- v1[2] = 2;
- v1[3] = 3;
- QValueVector<int> v2(5);
- v1[0] = 1;
- v1[2] = 2;
- v1[3] = 3;
- v1[4] = 4;
- v1[5] = 5;
- bool b = qEqual( v1.begin(), v2.end(), v2.begin() );
- // b == TRUE
- QValueList<int> l;
- l.push_back( 100 );
- l.push_back( 200 );
- l.push_back( 300 );
- QTextOStream str( stdout );
- qCopy( l.begin(), l.end(), QTextOStreamIterator(str) );
- QValueVector<int> vec(3);
- vec.push_back( 100 );
- vec.push_back( 200 );
- vec.push_back( 300 );
- QValueVector<int> another;
- qCopyBackward( vec.begin(), vec.end(), another.begin() );
- // “another”現(xiàn)在包含100、200、300
- // 無(wú)論如何元素都被一次性復(fù)制
- // 是按倒序排列的(300、200、100)
另外,你可以把任何一個(gè)Qt模板庫(kù)的迭代器作為OutputIterator使用。只需要注意迭代器的右面現(xiàn)在存在的元素和你所想要插入的一樣多。下面這個(gè)例子就說(shuō)明了這些:
- QStringList l1, l2;
- l1 << "Weis" << "Ettrich" << "Arnt" << "Sue";
- l2 << "Torben" << "Matthias";
- qCopy( l2.begin(), l2.end(), l1.begin() );
- QValueVector<QString> v( l1.size(), "Dave" );
- qCopy( l2.begin(), l2.end(), v.begin() );
這段代碼結(jié)束后,列表l1包含“Torben”、“Matthias”、“Arnt”和“Sue”,前面的內(nèi)容被覆蓋了。矢量v包含“Torben”、“Matthias”、“Dave”和“Dave”,也是前面的內(nèi)容被覆蓋了。
如果你寫(xiě)了新的算法,請(qǐng)考慮把它們寫(xiě)成模板函數(shù),這樣就可以使它們能夠用在盡可能多的容器上了。在上一個(gè)例子中,你可以很容易地使用qCopy()打印出一個(gè)標(biāo)準(zhǔn)C++數(shù)組:
- int arr[] = { 100, 200, 300 };
- QTextOStream str( stdout );
- qCopy( arr, arr + 3, QTextOStreamIterator( str ) );流
- QDataStream str(...);
- QValueList<QRect> l;
- // ……在這里填充這個(gè)列表
- str << l;
容易可以這樣被再一次地讀入:
- QValueList<QRect> l;
- str >> l;
這些也同樣適用于QStringList、QValueStack和QMap。
小結(jié):Qt 模板庫(kù)詳細(xì)介紹的內(nèi)容就介紹到這里,希望本文對(duì)你有幫助!




















