偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

QT核心編程之Qt模板庫(1)

移動(dòng)開發(fā)
Qt Extended 選擇了幾個(gè)可用的軟件,提供給Qt 優(yōu)化軟件開發(fā),與嵌入式linux 設(shè)備,每一個(gè)模塊都是使用一些庫,插件,應(yīng)用程序預(yù)計(jì)服務(wù)器的組件, 可以被其他的模塊來使用。

本文介紹的是QT核心編程之Qt模板庫QT核心編程我們要分幾個(gè)部分來介紹,想?yún)⒖几鄡?nèi)容,請看末尾的編輯推薦進(jìn)行詳細(xì)閱讀,先來看本篇內(nèi)容。

Qt模板庫QT Template Library 簡稱QTL)是一套提供對象容器的模板。如果你的編譯器沒有適當(dāng)?shù)腟TL(標(biāo)準(zhǔn)模板庫)可用,QTL將被代替使用。QTL提供了對象的鏈表、對象的矢量(動(dòng)態(tài)數(shù)組)、從一個(gè)類型到另一個(gè)類型的映射(或稱為字典)和相關(guān)的迭代器和算法。一個(gè)容器是包含和管理其它對象的一個(gè)對象,并且提供迭代器對被包含的對象進(jìn)行訪問。 Qt模板類說明如表2。

QT核心編程之Qt模板庫

表2 Qt模板類說明

QTL類的命名約定與其他Qt類一致(比如,count()、isEmpty())。它們還提供額外的函數(shù)來兼容STL算法,比如size()和empty()??梢韵袷褂肧TL的函數(shù)map一樣來使用它們。

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

如果你不想拷貝存儲(chǔ)對象,你最好使用QPtrCollection及派生類。它們就是被設(shè)計(jì)用來處理各種類指針的。QObject沒有拷貝構(gòu)造函數(shù),因此QObject不能作為一個(gè)值使用。但可以存儲(chǔ)指向QObject的指針到QValueList。當(dāng)然,直接使用QPtrList更好。 QPtrList像所有其它的基于QPtrCollection的容器一樣,提供了比速度優(yōu)化了、基于值的容器更多健全的檢查。

如果你有一些使用值的對象,并且在你的目標(biāo)平臺(tái)沒有可用的STL,Qt模板庫就可以替代它。使用值的對象至少需要一個(gè)拷貝構(gòu)造函數(shù)、一個(gè)賦值操作符和一個(gè)默認(rèn)構(gòu)造函數(shù)(如:一個(gè)沒有任何參數(shù)的構(gòu)造函數(shù))。

注意一個(gè)快速的拷貝構(gòu)造函數(shù)對于容器的高性能是關(guān)鍵的,因?yàn)樵S多拷貝操作將會(huì)發(fā)生。如果你想排序你的數(shù)據(jù),你必須在你的數(shù)據(jù)類中實(shí)現(xiàn)operator<()。

Qt模板庫是為高性能而設(shè)計(jì),迭代器是非常快的。為了實(shí)現(xiàn)這樣的性能,Qt模板庫比基于QPtrCollection的集合類做更少的錯(cuò)誤檢查。一個(gè)QTL容器,例如:QTL容器沒有跟蹤任何相關(guān)的迭代器。這樣在諸如刪除條目時(shí)沒有執(zhí)行有效性檢查,但它提供了很好的執(zhí)行性能。

1、迭代器(Iterators)

Qt模板庫打交道的是值對象,而不是指針對象。迭代器是最好的遍歷容器方法。遍歷一個(gè)容器可使用像下面的循環(huán):

typedef QValueList<int> List;List l;for( List::Iterator it = l.begin(); it != l.end(); ++it )     printf( "Number is %i\n", *it );
begin()返回第一個(gè)元素的迭代器,end()返回的是最后一個(gè)元素之后的一個(gè)迭代器。end()標(biāo)明的是一個(gè)無效的位置,它永遠(yuǎn)不能被解除引用。它只是任何一次迭代的終止條件,迭代可以從begin()或end()開始。同樣的概念也適用于其它容器類,例如,用于QMap和QValueVector 的迭代方法如下:

typedef QMap<QString,QString> Map;Map map;for( Map::iterator it = map.begin(); it != map.end(); ++it )    printf( "Key=%s Data=%s\n", it.key().ascii(), it.data().ascii() ); typedef QValueVector<int> Vector;Vector vec;for( Vector::iterator it = vec.begin(); it != vec.end(); ++it )    printf( "Data=%d\n", *it );

2、算法

Qt模板庫定義了大量操作容器的算法。這些算法用模板庫函數(shù)實(shí)現(xiàn),還提供了有迭代器的容器的通用代碼。例如:qHeapSort()和qBubbleSort()提供了著名的堆排序和冒泡排序算法。你可以象下面這樣使用它們:

  1. typedef QValueList<int> List;List l;  
  2. << 42 << 100 << 1234 << 12 << 8;qHeapSort( l );  
  3.  List l2;  
  4. l2 << 42 << 100 << 1234 << 12 << 8;  
  5. List::Iterator b = l2.find( 100 );  
  6. List::Iterator e = l2.find( 8 );  
  7. qHeapSort( b, e );  
  8.  double arr[] = { 3.2, 5.6, 8.9 };  
  9. qHeapSort( arr, arr + 3 ); 

第一個(gè)例子對整個(gè)列表排序。第二個(gè)例子對兩個(gè)迭代器之間的所有元素排序,即100、1234和12。第三個(gè)例子表明迭代器是作為指針使用的。

一些常用的模板函數(shù)說明如下:

(1)函數(shù)qSwap()用來交換兩個(gè)變量的值,例如:

  1. QString second( "Einstein" );  
  2.     QString name( "Albert" );  
  3. qSwap( second, name ); 

(2)函數(shù)qCount()用于統(tǒng)計(jì)容器中一個(gè)值出現(xiàn)的次數(shù)。例如:

  1. QValueList<int> l;  
  2.     l.push_back( 1 );        //放入1到l鏈表中  
  3.       l.push_back( 1 );  
  4.               l.push_back( 1 );  
  5.               l.push_back( 2 );  
  6.               int c = 0;qCount( l.begin(), l.end(), 1, c );  
  7.  //統(tǒng)計(jì)1的個(gè)數(shù)c, c = 3 

(3)函數(shù)qFind()用于查找容器中一個(gè)值的第一次出現(xiàn)位置。例如:

  1. QValueList<int> l;  
  2.     l.push_back( 1 );   
  3.              l.push_back( 1 );  
  4.               l.push_back( 1 );  
  5.               l.push_back( 2 );            //查找2所在的位置  
  6.     QValueListIterator<int> it = qFind( l.begin(), l.end(), 2 ); 

(4)函數(shù)qFill()用于將一個(gè)值拷貝填充到一個(gè)范圍。例如:

QValueVector<int> v(3);qFill( v.begin(), v.end(), 99 ); //將99填充整個(gè)v數(shù)組, v包含99, 99, 99

(5)函數(shù)qEqual()用來比較兩個(gè)范圍的元素是否相等,兩個(gè)范圍的元素個(gè)數(shù)不一定相等。只要第一個(gè)范圍的元素與第二個(gè)范圍的對應(yīng)元素都相等時(shí),就認(rèn)為這兩個(gè)范圍相等。例如:

  1. QValueVector<int> v1(3);  
  2.    v1[0] = 1;  
  3.     v1[2] = 2;  
  4.     v1[3] = 3;   
  5.     QValueVector<int> v2(5);  
  6.     v1[0] = 1;   
  7.    v1[2] = 2;  
  8.     v1[3] = 3;   
  9.    v1[4] = 4;    v1[5] = 5;  
  10.      bool b = qEqual( v1.begin(), v2.end(), v2.begin() );  
  11.     // b == TRUE 

(6)函數(shù)qCopy()用于拷貝一個(gè)范圍的元素到輸出迭代器,例如:

  1. QValueList<int> l;  
  2.     l.push_back( 100 );   
  3.    l.push_back( 200 );   
  4.    l.push_back( 300 );  
  5.     QTextOStream str( stdout );  //拷貝l中所有元素到輸出迭代器QTextOStreamIterator   
  6.    qCopy( l.begin(), l.end(), QTextOStreamIterator(str) ); 

(7)函數(shù)qCopyBackward()用于拷貝一個(gè)容器或者它的一部分到一個(gè)輸出迭代器,拷貝的次序是從后面開始,例如:

  1. QValueVector<int> vec(3);  
  2.     vec.push_back( 100 );  
  3.     vec.push_back( 200 );  
  4.     vec.push_back( 300 );   
  5.    QValueVector<int> another;  // “another”包含的是按倒序排列的(300、200、100)  
  6.     qCopyBackward( vec.begin(), vec.end(), another.begin() ); 

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

  1. int arr[] = { 100, 200, 300 };  
  2.    QTextOStream str( stdout );  
  3.     qCopy( arr, arr + 3, QTextOStreamIterator( str ) ); 

3、數(shù)據(jù)流串行化

所有提到的容器(如:QValueList 、QStringList、QValueStack和QMap等)都可被相應(yīng)的流操作符串行化。下面是一個(gè)例子。

  1. QDataStream str(...);   
  2.    QValueList<QRect> l;    // ……在這里填充這個(gè)列表  
  3.     str << l

容器還能象下面這樣被再一次讀入:

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

小結(jié):QT核心編程之Qt模板庫的內(nèi)容介紹完了,希望本篇能夠幫助你有效學(xué)習(xí),更多內(nèi)容,在編輯推薦進(jìn)行參考。

【編輯推薦】

QT核心編程之集合類 (2)

QT核心編程之Qt線程 (3)

QT核心編程之鼠標(biāo)拖放 (4)

QT核心編程之鍵盤焦點(diǎn) (5)

QT核心編程之會(huì)話管理 (6)

QT核心編程之調(diào)試技術(shù) (7)

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

2011-06-22 10:12:08

Qt 線程

2011-06-22 10:20:11

QT 鼠標(biāo) 拖放

2011-06-22 10:45:21

QT 調(diào)試

2011-06-22 09:58:04

QT 集合類

2011-06-22 10:27:32

QT 鍵盤 焦點(diǎn)

2011-06-22 10:39:56

QT 會(huì)話管理

2011-06-29 15:02:25

Qt 模板庫

2011-06-21 15:31:04

Qt 數(shù)據(jù)庫 SQL

2011-06-17 14:12:32

Qt

2011-08-30 14:15:34

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

2011-08-30 14:59:34

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

2011-07-05 14:46:34

2011-06-10 12:44:09

2011-06-13 16:51:19

Qt Socket

2011-06-24 15:30:22

QT 皮膚 QSS

2011-06-23 09:00:04

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

2011-06-21 13:52:18

Qt 界面

2011-06-08 14:39:06

Qt 教程

2011-08-30 13:33:29

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

2011-08-30 13:49:57

Qt數(shù)據(jù)庫QTableView
點(diǎn)贊
收藏

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