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"]