成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

解析 Qt 模板庫 詳細(xì)介紹

移動開發(fā)
本文介紹了Qt 模板庫,很詳細(xì)的闡述了模板庫的用法,現(xiàn)在看內(nèi)容。

Qt 模板庫詳細(xì)介紹是本文要介紹的內(nèi)容吧,QT4引入了一組名為郁金香(Tulip)的容器類,用來取代老的 QCollection(QT2.3)基于指針(pointer-based)的 容器類和QTL(QT3)基于值(value-based)的容器類。

  1. Qt3模板庫(QTL)       是一套提供對象容器的模板。請看Qt模板庫  
  2. QMap                 提供基于值的一個字典的模板類  
  3. QMapConstIterator    QMap的常量迭代器  
  4. QMapIterator         QMap的迭代器  
  5. QPair                提供基于值的一對元素的模板類  
  6. QValueList           提供基于值的一個雙向鏈表的模板類  
  7. QValueListConstIterator    QValueList的常量迭代器  
  8. QValueListIterator    QValueList的迭代器  
  9. QValueStack          提供基于值的一個堆棧模板類  
  10. QValueVector         提供基于值的一個動態(tài)數(shù)組模板類  

Qt模板庫(QTL)是一套提供對象容器的模板。如果你的編譯器不能用到一個適當(dāng)?shù)腟TL實現(xiàn),QTL可以替代它。它提供了對象的列表、對象的矢量(Vector 動態(tài)數(shù)組)、從一種類型到其它的映射(或字典),并且有關(guān)聯(lián)的迭代器(iterator)和算法。一個容器是可以包含和管理其它對象的一個對象并且提供迭代器來允許被包含的對象能夠被訪問。

QTL類的命名約定與其他Qt類一致(比如,count()、isEmpty())。它們也提供額外的函數(shù)來兼容STL算法,比如size()和empty()。程序員也可以像使用STL的map一樣來使用它們。

與STL相比,QTL僅僅包含了STL容器應(yīng)用程序接口的最重要的特性,沒有平臺差異,通常要慢一些并且經(jīng)常擴(kuò)展為更少的對象代碼。

如果你不能復(fù)制你所想要存儲的對象,你***使用QPtrCollection和它的朋友。它們就是被設(shè)計用來正確地處理這些類型的指針語義。這將適用于比如所有繼承QObject的類。QObject沒有一個復(fù)制構(gòu)造函數(shù),所以把它們作為值來使用是不可能的。你也許可以選擇存儲QObject的指針到QValueList,但是直接使用QPtrList看起來是對這類應(yīng)用程序領(lǐng)域的更好的選擇。QPtrList,像所有其它的基于QPtrCollection的容器,提供了比一個速度優(yōu)化了的基于值的容器更多健全的檢查。

如果你有一些實現(xiàn)值語義的對象,并且在你的目標(biāo)平臺沒有可用的STL,Qt模板庫就可以替代它。值語義至少需要以下這些:

一個復(fù)制構(gòu)造函數(shù),

一個賦值操作符和

一個默認(rèn)構(gòu)造函數(shù),比如一個沒有任何參數(shù)的構(gòu)造函數(shù)。

注意一個快速的復(fù)制構(gòu)造函數(shù)對于容器的總性能是完全至關(guān)重要的,因為許多復(fù)制操作將會發(fā)生。

如果你打算排序你的數(shù)據(jù),那么你必須在你的數(shù)據(jù)類中實現(xiàn)operator<()。

基于值的類的候選對象有QRect、QPoint、QSize、QString和所有簡單的C++類型,比如int、bool和double。

Qt模板庫是因為速度而被設(shè)計。迭代器是非常快的。為了實現(xiàn)這樣的性能,所以就比基于QPtrCollection的類做了更少的錯誤檢查。一個QTL容器,比如,沒有跟蹤任何關(guān)聯(lián)的迭代器。這樣就在比如刪除項目的時候沒有自動地執(zhí)行有效性檢查,但無論如何,它提供了很快很好的性能。

  1. operator<()

自然地,這些排序模板在常量迭代器下不能工作。

  1. QString second( "Einstein" );  
  2. QString name( "Albert" );  
  3. qSwap( second, name );  
  4. QValueList<int> l;  
  5. l.push_back( 1 );   
  6. l.push_back( 1 );   
  7. l.push_back( 1 );   
  8. l.push_back( 2 );   
  9. int c = 0;  
  10. qCount( l.begin(), l.end(), 1, c ); // c == 3  
  11. QValueList<int> l;  
  12. l.push_back( 1 );   
  13. l.push_back( 1 );   
  14. l.push_back( 1 );   
  15. l.push_back( 2 );   
  16. QValueListIterator<int> it = qFind( l.begin(), l.end(), 2 );  
  17. QValueVector<int> v(3);  
  18. qFill( v.begin(), v.end(), 99 ); // v包含99, 99, 99  
  19. QValueVector<int> v1(3);  
  20. v1[0] = 1;  
  21. v1[2] = 2;  
  22. v1[3] = 3;  
  23. QValueVector<int> v2(5);  
  24. v1[0] = 1;  
  25. v1[2] = 2;  
  26. v1[3] = 3;  
  27. v1[4] = 4;  
  28. v1[5] = 5;  
  29. bool b = qEqual( v1.begin(), v2.end(), v2.begin() );  
  30. // b == TRUE  
  31. QValueList<int> l;  
  32. l.push_back( 100 );  
  33. l.push_back( 200 );  
  34. l.push_back( 300 );  
  35. QTextOStream str( stdout );  
  36. qCopy( l.begin(), l.end(), QTextOStreamIterator(str) );  
  37. QValueVector<int> vec(3);  
  38. vec.push_back( 100 );  
  39. vec.push_back( 200 );  
  40. vec.push_back( 300 );  
  41. QValueVector<int> another;  
  42. qCopyBackward( vec.begin(), vec.end(), another.begin() );  
  43. // “another”現(xiàn)在包含100、200、300  
  44. // 無論如何元素都被一次性復(fù)制  
  45. // 是按倒序排列的(300、200、100) 

另外,你可以把任何一個Qt模板庫的迭代器作為OutputIterator使用。只需要注意迭代器的右面現(xiàn)在存在的元素和你所想要插入的一樣多。下面這個例子就說明了這些:

  1. QStringList l1, l2;  
  2. l1 << "Weis" << "Ettrich" << "Arnt" << "Sue";  
  3. l2 << "Torben" << "Matthias";  
  4. qCopy( l2.begin(), l2.end(), l1.begin() );  
  5. QValueVector<QString> v( l1.size(), "Dave" );  
  6. qCopy( l2.begin(), l2.end(), v.begin() ); 

這段代碼結(jié)束后,列表l1包含“Torben”、“Matthias”、“Arnt”和“Sue”,前面的內(nèi)容被覆蓋了。矢量v包含“Torben”、“Matthias”、“Dave”和“Dave”,也是前面的內(nèi)容被覆蓋了。

如果你寫了新的算法,請考慮把它們寫成模板函數(shù),這樣就可以使它們能夠用在盡可能多的容器上了。在上一個例子中,你可以很容易地使用qCopy()打印出一個標(biāo)準(zhǔn)C++數(shù)組:

  1. int arr[] = { 100, 200, 300 };  
  2. QTextOStream str( stdout );  
  3. qCopy( arr, arr + 3, QTextOStreamIterator( str ) );流   
  4. QDataStream str(...);  
  5. QValueList<QRect> l;  
  6. // ……在這里填充這個列表  
  7. str << l

容易可以這樣被再一次地讀入:

  1. QValueList<QRect> l;  
  2. str >> l; 

這些也同樣適用于QStringList、QValueStack和QMap。

小結(jié):Qt 模板庫詳細(xì)介紹的內(nèi)容就介紹到這里,希望本文對你有幫助!

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-23 09:00:04

QT QODBC 數(shù)據(jù)庫

2011-06-21 14:01:07

QT 界面庫 Embedded

2011-07-07 14:14:41

PHP模版

2011-08-29 10:22:48

QtWebkit 模塊HTML文檔

2011-06-22 17:09:50

QT 進(jìn)程 通信

2011-07-07 16:15:20

Smarty

2011-06-29 14:56:28

Qt Creator 快捷捷

2011-06-22 09:40:32

QT 模板庫 模板

2023-12-05 16:01:12

模板方法設(shè)計模式算法結(jié)構(gòu)

2023-11-16 09:01:37

Hadoop數(shù)據(jù)庫

2011-06-09 11:11:35

QT 靜態(tài)庫 動態(tài)庫

2011-06-22 14:30:44

QT 多線程 線程

2011-06-24 11:25:30

Qt Qt 4.6.2 VS 2005

2011-06-27 09:36:58

Ubuntu Qt Creator

2011-07-07 08:49:14

iPhone Push Notificati

2011-03-21 13:21:23

數(shù)據(jù)庫開發(fā)規(guī)范

2009-12-04 15:28:36

PHP JSON類庫

2011-06-21 18:02:14

Qt 動態(tài) 鏈接庫

2011-03-15 09:14:29

2011-07-14 13:50:09

ThreadLocal
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久久久久久久一区二区 | 国产精品资源在线观看 | 久久久av| 国产精品一区二区三区在线 | 欧美4p| 国产成人免费视频 | 精品欧美一区二区在线观看视频 | 草比av| 精品久久精品 | 精品九九九 | 狠狠色狠狠色综合日日92 | 怡红院成人在线视频 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 欧美夜夜| 欧美精品一区二区三区在线四季 | 天天操天天摸天天爽 | 亚洲欧美精品 | 天天曰夜夜操 | 午夜电影网站 | 日韩精品成人一区二区三区视频 | 成人免费淫片aa视频免费 | 国产精品久久在线 | 一级毛片视频 | 国产精品久久久久久影视 | 欧美寡妇偷汉性猛交 | 国产91九色| 午夜欧美一区二区三区在线播放 | 精品网| 欧美日韩高清在线观看 | 激情视频中文字幕 | 国产精品二区三区 | 一区二区三区欧美在线观看 | 亚洲大片 | 在线国产中文字幕 | 夜夜爽99久久国产综合精品女不卡 | 欧美国产精品久久久 | 黄色一级片视频 | 91精品国产91综合久久蜜臀 | 国产97在线视频 | 成人一区二区三区在线观看 | 高清一区二区视频 |