QList是一種表示鏈表的模板類。
QList<T>是Qt的一種泛型容器類。它以鏈表方式存儲一組值,并能對這組數(shù)據(jù)進行快速索引,
還提供了快速插入和刪除等操作。
QList、QLinkedList和QVector提供的操作極其相似:
* 對大多數(shù)操作來說,我們用QList就可以了。其API是基于索引(index)的,因此用起來比QLinkedList更方便(QLinkedList的API是基于迭代器的)。QList比QVector更快,這是由它
們在內(nèi)存中的存儲方式?jīng)Q定的。
* 需要使用QLinkedList的地方:
* 需要使用QVector的地方:元素的儲存位置彼此相鄰。
QList<T>表示為一組指向被存儲元素的數(shù)組。(例外,如果T本身就是指針類型,或者是size不
大于指針類型的基本類型,或者是Qt的共享類,那么QList<T>會直接在指針數(shù)組中存儲這些元素
。)元素個數(shù)小于1000的QList能夠很快地實現(xiàn)在鏈表中間插入操作,以及快速的查找操作。此
外,由于QList在鏈表兩端都預先分配了內(nèi)存,因此實現(xiàn)prepend()和append()操作都很快。
注意:對于size比指針大的共享類,使用QVector會更好。
以下是兩個分別存儲int型數(shù)據(jù)和QDate類型數(shù)據(jù)的鏈表:
QList<int> intList;
QList<QDate> dateList;
對于字符串鏈表,Qt提供了QStringList類。它繼承自QList,但還提供了一些其他便于使用字符
串的函數(shù):QStringList::join()、QStringList::find()、QStringList::split()。
QList以鏈表形式存儲一組元素。默認為空鏈表,我們可以使用<<操作符添加元素:
QList<QString> list;
list << "one" << "two" << "three"; // list: ["one", "two", "three"]
QList提供了一系列添加、移動、刪除元素的操作:insert(), replace(), removeAt(), swap()
。此外,它還提供了便于操作的函數(shù):append(), prepend(), removeFirst(), removeLast()。
QList與C++中數(shù)組的索引方式一樣,都是從0開始的。我們可以使用[]操作符來訪問位于索引值
處的元素。對于非const鏈表,操作符[]返回的是該元素的引用,并且返回值可以用途左操作數(shù)。
if ( list[0] == "Bob" )
list[0] = "Robert";
由于QList是以指針數(shù)組的形式實現(xiàn)的,該操作能夠很快地實現(xiàn)(時間復雜度為常數(shù))。對于只讀
訪問,我們可以用at()函數(shù)實現(xiàn)訪問:
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提供了以下操作來實現(xiàn)此功能:takeAt()、takeFirst()、takeLast()。以下是一個示例:
QList<QWidget *> list;
...
while ( !list.isEmpty() )
deleta list.takeFirst();
由于QList在鏈表兩端都預先分配了緩存以應對鏈表兩端的快速添加操作,這樣就使得在QList的
兩端插入或刪除元素變得非常地快。
如果需要找出某個值在鏈表中出現(xiàn)的位置,我們可以使用indexOf()、lastIndexOf()函數(shù)來實現(xiàn)。
前者進行前向查找,而后者則進行反向查找。兩者都會在找到匹配元素后返回該元素的索引值。若
沒有找到匹配元素,則返回-1。例如:
int i = indexOf("Jane");
if ( i!=-1 )
cout << "First occurance of Jane is at position" << i << endl;
如果僅僅是想判斷鏈表中是否包含某一值,我們可以使用函數(shù)contains()。如果希望知道某一值在
鏈表中的出現(xiàn)次數(shù),使用count()函數(shù)。如果要替換掉鏈表中所有值與某一值相同的元素,使用
replace()。
QList的值必須是可數(shù)的類型。這包含了我們常用的大多數(shù)類型。但是,如果我們存儲QWidget類型
的話,編譯器也不會通知我們出錯了。但是,我們應該使用QWidget *,而不是QWidget。此外,一
些函數(shù)還作出了其它限制,比如:indexOf()和lastIndexOf()操作要求值的類型能進行“==”操作。
與其他容器一樣,QList也提供了Java形式的迭代器(QListIterator和QMutableListIterator)。
以及STL形式的迭代器(QList::const_iterator和QList::iterator)。實際上,由于可通過索引值
來訪問元素,我們很少使用這些迭代器。使用索引值訪問元素的速度與迭代器相差無幾。
為了提高效率,QList的成員函數(shù)在使用前并不會驗證其參數(shù)是否有效。除isEmpty()函數(shù)外,其它
成員函數(shù)都會假定該容器為非空容器;使用索引值(index)進行操作的成員函數(shù)都會假定其索引值參
數(shù)是在有效范圍內(nèi)的。這就意味著,QList在有些時候會出錯。如果在編譯時,我們定義了QT_NO_DEBUG
,編譯過程中就不會檢測這些錯誤。如果沒有定義QT_NO_DEBUG,我們可以利用Q_ASSERT()或者
Q_ASSERT_X()加上一些合理的信息來實現(xiàn)錯誤檢測。
我們可以在調(diào)用其他函數(shù)之前先調(diào)用isEmpty()函數(shù)判斷鏈表是否為空,以避免對空鏈表進行錯
誤操作。而對于以索引值index為參數(shù)的成員函數(shù),我們還需要判斷該索引值是否位于有效范圍
內(nèi)。QList是一種表示鏈表的模板類。
QList<T>是Qt的一種泛型容器類。它以鏈表方式存儲一組值,并能對這組數(shù)據(jù)進行快速索引,
還提供了快速插入和刪除等操作。
QList、QLinkedList和QVector提供的操作極其相似:
* 對大多數(shù)操作來說,我們用QList就可以了。其API是基于索引(index)的,因此用起來比QLinkedList更方便(QLinkedList的API是基于迭代器的)。QList比QVector更快,這是由它
們在內(nèi)存中的存儲方式?jīng)Q定的。
* 需要使用QLinkedList的地方:
* 需要使用QVector的地方:元素的儲存位置彼此相鄰。
QList<T>表示為一組指向被存儲元素的數(shù)組。(例外,如果T本身就是指針類型,或者是size不
大于指針類型的基本類型,或者是Qt的共享類,那么QList<T>會直接在指針數(shù)組中存儲這些元素
。)元素個數(shù)小于1000的QList能夠很快地實現(xiàn)在鏈表中間插入操作,以及快速的查找操作。此
外,由于QList在鏈表兩端都預先分配了內(nèi)存,因此實現(xiàn)prepend()和append()操作都很快。
注意:對于size比指針大的共享類,使用QVector會更好。
以下是兩個分別存儲int型數(shù)據(jù)和QDate類型數(shù)據(jù)的鏈表:
QList<int> intList;
QList<QDate> dateList;
對于字符串鏈表,Qt提供了QStringList類。它繼承自QList,但還提供了一些其他便于使用字符
串的函數(shù):QStringList::join()、QStringList::find()、QStringList::split()。
QList以鏈表形式存儲一組元素。默認為空鏈表,我們可以使用<<操作符添加元素:
QList<QString> list;
list << "one" << "two" << "three"; // list: ["one", "two", "three"]
QList提供了一系列添加、移動、刪除元素的操作:insert(), replace(), removeAt(), swap()
。此外,它還提供了便于操作的函數(shù):append(), prepend(), removeFirst(), removeLast()。
QList與C++中數(shù)組的索引方式一樣,都是從0開始的。我們可以使用[]操作符來訪問位于索引值
處的元素。對于非const鏈表,操作符[]返回的是該元素的引用,并且返回值可以用途左操作數(shù)。
if ( list[0] == "Bob" )
list[0] = "Robert";
由于QList是以指針數(shù)組的形式實現(xiàn)的,該操作能夠很快地實現(xiàn)(時間復雜度為常數(shù))。對于只讀
訪問,我們可以用at()函數(shù)實現(xiàn)訪問:
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提供了以下操作來實現(xiàn)此功能:takeAt()、takeFirst()、takeLast()。以下是一個示例:
QList<QWidget *> list;
...
while ( !list.isEmpty() )
deleta list.takeFirst();
由于QList在鏈表兩端都預先分配了緩存以應對鏈表兩端的快速添加操作,這樣就使得在QList的
兩端插入或刪除元素變得非常地快。
如果需要找出某個值在鏈表中出現(xiàn)的位置,我們可以使用indexOf()、lastIndexOf()函數(shù)來實現(xiàn)。
前者進行前向查找,而后者則進行反向查找。兩者都會在找到匹配元素后返回該元素的索引值。若
沒有找到匹配元素,則返回-1。例如:
int i = indexOf("Jane");
if ( i!=-1 )
cout << "First occurance of Jane is at position" << i << endl;
如果僅僅是想判斷鏈表中是否包含某一值,我們可以使用函數(shù)contains()。如果希望知道某一值在
鏈表中的出現(xiàn)次數(shù),使用count()函數(shù)。如果要替換掉鏈表中所有值與某一值相同的元素,使用
replace()。
QList的值必須是可數(shù)的類型。這包含了我們常用的大多數(shù)類型。但是,如果我們存儲QWidget類型
的話,編譯器也不會通知我們出錯了。但是,我們應該使用QWidget *,而不是QWidget。此外,一
些函數(shù)還作出了其它限制,比如:indexOf()和lastIndexOf()操作要求值的類型能進行“==”操作。
與其他容器一樣,QList也提供了Java形式的迭代器(QListIterator和QMutableListIterator)。
以及STL形式的迭代器(QList::const_iterator和QList::iterator)。實際上,由于可通過索引值
來訪問元素,我們很少使用這些迭代器。使用索引值訪問元素的速度與迭代器相差無幾。
為了提高效率,QList的成員函數(shù)在使用前并不會驗證其參數(shù)是否有效。除isEmpty()函數(shù)外,其它
成員函數(shù)都會假定該容器為非空容器;使用索引值(index)進行操作的成員函數(shù)都會假定其索引值參
數(shù)是在有效范圍內(nèi)的。這就意味著,QList在有些時候會出錯。如果在編譯時,我們定義了QT_NO_DEBUG
,編譯過程中就不會檢測這些錯誤。如果沒有定義QT_NO_DEBUG,我們可以利用Q_ASSERT()或者
Q_ASSERT_X()加上一些合理的信息來實現(xiàn)錯誤檢測。
我們可以在調(diào)用其他函數(shù)之前先調(diào)用isEmpty()函數(shù)判斷鏈表是否為空,以避免對空鏈表進行錯
誤操作。而對于以索引值index為參數(shù)的成員函數(shù),我們還需要判斷該索引值是否位于有效范圍
內(nèi)。
聯(lián)系客服