[轉載]Qlist的用法

QList是一種表示鏈表的模板類。數組

QList是Qt的一種泛型容器類。它以鏈表方式存儲一組值,並能對這組數據進行快速索引,還提供了快速插入和刪除等操做。緩存

QList、QLinkedList和QVector提供的操做極其類似:app

* 對大多數操做來講,咱們用QList就能夠了。其API是基於索引(index)的,所以用起來比QLinkedList更方便(QLinkedList的API是基於迭代器的)。QList比QVector更快,這是由它們在內存中的存儲方式決定的。函數

* 須要使用QLinkedList的地方:指針

* 須要使用QVector的地方:元素的儲存位置彼此相鄰。繼承

 

QList表示爲一組指向被存儲元素的數組。(例外,若是T自己就是指針類型,或者是size不大於指針類型的基本類型,或者是Qt的共享類,那麼QList會直接在指針數組中存儲這些元素。)元素個數小於1000的QList可以很快地實如今鏈表中間插入操做,以及快速的查找操做。此外,因爲QList在鏈表兩端都預先分配了內存,所以實現prepend()和append()操做都很快。索引

注意:對於size比指針大的共享類,使用QVector會更好。three

 

如下是兩個分別存儲int型數據和QDate類型數據的鏈表:內存

QList intList;rem

QList dateList;

對於字符串鏈表,Qt提供了QStringList類。它繼承自QList,但還提供了一些其餘便於使用字符串的函數:QStringList::join()、QStringList::find()、QStringList::split()。

 

QList以鏈表形式存儲一組元素。默認爲空鏈表,咱們可使用<<操做符添加元素:

QList list;

list << "one" << "two" << "three"; // list: ["one", "two", "three"]

QList提供了一系列添加、移動、刪除元素的操做:insert(), replace(), removeAt(), swap()

。此外,它還提供了便於操做的函數:append(), prepend(), removeFirst(), removeLast()。

QList與C++中數組的索引方式同樣,都是從0開始的。咱們可使用[]操做符來訪問位於索引值處的元素。對於非const鏈表,操做符[]返回的是該元素的引用,而且返回值能夠用途左操做數。

if ( list[0] == "Bob" )

   list[0] = "Robert";

因爲QList是以指針數組的形式實現的,該操做可以很快地實現(時間複雜度爲常數)。對於只讀訪問,咱們能夠用at()函數實現訪問:

for ( int i=0; i!=list.size(); ++i )

{

   if ( list.at(i) == "Jane" )

   { cout << "Found Jane at position:" << i<< endl;}

}

at()操做比操做符[]更快,由於它不須要深度複製(deep copy)。

QList的一個經常使用操做是,從鏈表中取出一個元素(元素再也不在鏈表之中),並對該元素進行操做。

QList提供瞭如下操做來實現此功能:takeAt()、takeFirst()、takeLast()。如下是一個示例:

QList list;

...

while ( !list.isEmpty() )

   deleta list.takeFirst();

因爲QList在鏈表兩端都預先分配了緩存以應對鏈表兩端的快速添加操做,這樣就使得在QList的

兩端插入或刪除元素變得很是地快。

若是須要找出某個值在鏈表中出現的位置,咱們可使用indexOf()、lastIndexOf()函數來實現。

前者進行前向查找,然後者則進行反向查找。二者都會在找到匹配元素後返回該元素的索引值。若

沒有找到匹配元素,則返回-1。例如:

int i = indexOf("Jane");

if ( i!=-1 )

   cout << "First occurance of Jane is at position" << i << endl;

 

若是僅僅是想判斷鏈表中是否包含某一值,咱們可使用函數contains()。若是但願知道某一值在

鏈表中的出現次數,使用count()函數。若是要替換掉鏈表中全部值與某一值相同的元素,使用

replace()。

 

QList的值必須是可數的類型。這包含了咱們經常使用的大多數類型。可是,若是咱們存儲QWidget類型

的話,編譯器也不會通知咱們出錯了。可是,咱們應該使用QWidget *,而不是QWidget。此外,一

些函數還做出了其它限制,好比:indexOf()和lastIndexOf()操做要求值的類型能進行「==」操做。

 

與其餘容器同樣,QList也提供了Java形式的迭代器(QListIterator和QMutableListIterator)。

以及STL形式的迭代器(QList::const_iterator和QList::iterator)。實際上,因爲可經過索引值

來訪問元素,咱們不多使用這些迭代器。使用索引值訪問元素的速度與迭代器相差無幾。

 

爲了提升效率,QList的成員函數在使用前並不會驗證其參數是否有效。除isEmpty()函數外,其它

成員函數都會假定該容器爲非空容器;使用索引值(index)進行操做的成員函數都會假定其索引值參

數是在有效範圍內的。這就意味着,QList在有些時候會出錯。若是在編譯時,咱們定義了QT_NO_DEBUG

,編譯過程當中就不會檢測這些錯誤。若是沒有定義QT_NO_DEBUG,咱們能夠利用Q_ASSERT()或者

Q_ASSERT_X()加上一些合理的信息來實現錯誤檢測。

 

咱們能夠在調用其餘函數以前先調用isEmpty()函數判斷鏈表是否爲空,以免對空鏈表進行錯

誤操做。而對於以索引值index爲參數的成員函數,咱們還須要判斷該索引值是否位於有效範圍

內。 

 

 

 

 

 

QList list;

 

   list<<1<<2<<3<<4<<5<<6<<7<<8;

 

 

 

QList的插入

 

    void append(const T&value)            在QList尾部插入value

 

    void append(const TQList&value)       在QList尾部插入QList&value

 

    void insert ( int i, const T & value )      在QList其中某個位置插入value,假如沒 聲明i ,i 默認size()及在最後插入value

 

    iterator insert ( iterator before, const T & value )    在迭代器的前個位置插入value並返回當前迭代器的位置

 

 

 

QList的刪除

 

     void clear ()   刪除QList的內容

 

     iterator erase ( iterator pos )     刪除迭代器位置的值,返回下個迭代器位置

 

     iterator erase ( iterator begin, iterator end )  刪除一塊的迭代器begin和end的值,返回下一個迭代器

 

            QList::iterator i;

 

            i=list.begin();

 

            i++;

 

            i=list.erase(i,i+2);

 

             for(i=list.begin();i!=list.end();i++)

 

            {

 

                qDebug()<<(*i);

 

            }

 

  

 

      int removeAll ( const T & value )    刪除返回刪除個數    

 

 QList list;

 list << "sun" << "cloud" << "sun" << "rain";

 list.removeAll("sun");

 // list: ["cloud", "rain"]

 

      void removeAt ( int i )      刪除某個值

 

      void removeFirst ()        刪除最前一個值

 

      void removeLast ()         刪除最後一個值

 

      bool removeOne ( const T & value )     刪除value中的一個

 

 

 

 QList list;

 list << "sun" << "cloud" << "sun" << "rain";

 list.removeOne("sun");

 // list: ["cloud", ,"sun", "rain"]

相關文章
相關標籤/搜索