Qt 容器類

來源:互聯網
上載者:User

Sequentail Containers
QVector<T>

array-like data structure(在尾部插入資料時效率很高,而在中間和頭部插入資料時開銷很大)。
QVector提供了[]運算子
QVector可以用<<運算子代替append()函數。
QVector中的基本類型及指標被初始化為0。
QLinkedList<T>

QLinkedList不提供[]運算子,所以必須通過迭代器來對其進行遍曆。
QList<T>
array-list:綜合了QVector<T>和QLinkedList<T>最重要的優點: 支援[]運算子
在頭部或尾部的插入/刪除操作很迅速,而尺寸在1000以下時,在中間的插入/刪除操作也很迅速。
通常情況下,QList是最合適的通用型容器。
QStringList
: QList<QString>的子類,在Qt中的API中被廣泛使用
QStack<T> 和QQueue<
T>是Qt提供的兩個convenience
subclasses,QStack<T>實際上是一個額外提供了push(),pop()top()介面的QVector,而
QQueue<T>實際是一個額外提供了enqueue()和dequeue()和head()的QList。
容器中可以放置的類必須擁有default constructor、copy constructor 和 assignment operator(顯式定義或由編譯器產生)
注意,派生自QObject的類不符合上述要求,因為其不具備copy constructor和assignment operator;解決方案是在容器中儲存物件指標而不是對象本身。
容器中所存放的元素本身也可以是容器,即可以嵌套——不過需要注意將連續的角括弧用空格分隔開,以免編譯器誤認為>>運算子。
Iterator

Qt支援兩種風格的迭代器——
Java-style和STL-
style


Java-style的迭代器更容易使用,而STL-style的迭代器可以同Qt和STL中的演算法聯合使用,更為強大。
Java-style Iterator

每個sequential容器類,都有兩個Java-style的迭代器類型:唯讀迭代器和讀寫迭代器。

在使用Java-style的迭代器時,要清楚的第一件事情就是:迭代器並不直接指向容器中的元素,而是指向元素之前或之後的位置。迭代器被初始化時指向
容器中第一個元素之前;若迭代器的右側有元素存在,hasNext()函數返回true;next()函數返回位於迭代器右側的元素,並將迭代器向右方移
動一個元素的位置;hasPrevious()和previous()函數執行反方向的操作。
remove()函數總是刪除最近一次被跳過的那個元素。
setValue()函數總是對最近一次被跳過的那個元素執行更新操作
insert()函數在迭代器當前指向的位置處插入新元素,並將迭代器指向新元素及其後續元素之間的位置。
STL-style Iterator

每個sequential容器類,都有兩個STL-style的迭代器類型:Container<T>::iterator和Container<T>::const_iterator。

容器的begin()函數返回一個指向容器中頭部元素的iterator,而end()返回指向容器中尾部元素之後位置的iterator;
在容器為空白時,begin()和end()的結果相同。
通常通過調用isEmpty()來檢查容器是否為空白,而不是通過比較begin()和end()的結果。
可以對STL-style的iterator使用+、-、*這三個運算子,類似於指標的用法。

某些Qt函數的傳回值是容器類;如果需要使用STL-style的迭代器來對這樣的傳回值進行遍曆,必須儲存傳回值的一個副本,並在副本上完成遍曆,否則會可能會導致所謂的"dangling iterator"。
注意,若使用java-style的唯讀迭代器,在這種情況下會隱式的完成複製的工作,保證迭代器總是在副本上進行遍曆操作。
implicit sharing(copy on write)

Qt中的implicit sharing機制的美妙之處在於它鼓勵程式員在返回對象時採用傳值這種簡明的方式而不是引用或指標。
STL與此相反,鼓勵程式員使用non-const引用來傳遞vector以避免將函數傳回值的複製開銷。
Qt中所有的容器都採用了implicit sharing機制;此外很多其他類QByteArray,QBrush,QFont,QImage,QString也採用了該機制——這保證這些類在以傳值方式進行傳遞時有很高的效率,無論是作為參數還是函數傳回值。
在Qt提供的implicit sharing機制下,對vector或list執行唯讀操作時,採用at()而不是[]運算子是一個更好的選擇。
類似的,儘可能的使用constBegin()和constEnd()以避免不必要的拷貝操作。
foreach syntax

foreach在進入迴圈體時自動複製容器的副本並在此副本上進行迭代,因此如果迭代過程中有通過迭代器對容器的修改操作的話,並不會影響迴圈的進行,迴圈結束後容器的內容也不會發生變化。
當然,如果在foreach迴圈中直接使用[]運算子對容器進行寫操作的話,容器內容自然會發生變化。
foreach中支援break和continue語句
Associative Containers

QMap

QMap中的key-value對是升序排列的
插入和刪除操作中都可以使用[]運算子,其下標為key;為避免建立不必要的空值,推薦用vlaue()而不是[]從QMap中取值。
QMap<K,T>中的K和T除了要求具備預設建構函式、拷貝建構函式和賦值運算子外,K還必須支援operator <,因為這樣才能實現前面提到的升序排列。
keys() & values()
QMap的特性是單值;QMultiMap<K,T>則支援同一關鍵字下多值的存在,插入操作由insertMulti()完成
QHash

QHash提供的介面和QMap很相似
QHash<K,T>中的K要符合的其他需求:支援operator ==,並且K可用全域函數qHash()來計算hash value
QHash通常是單值的,而QMultiHash則通過insertMulti()支援多值插入。
QCache<K,T> & QSet<K>

遍曆associative containr的最簡單方法是使用Java-style的迭代器
foreach syntax也可用於assocaitive container
Generic Algorithms

標頭檔<QAlgorithms>中聲明了一組通用範本函數,用於實現作用於容器的基本演算法;多數演算法都通過STL-style的迭代器來完成。
STL標頭檔<algorithm>
中的函數,即可作用於Qt容器,也可作用於STL容器。
qFind(),qBinaryFind(),qFill(),qCopy(),qSort(),qStableSorg(),qDeleteAll(),qSwap()
需要注意的是,qDeleteAll()只對包含指標的容器有意義,該函數將釋放所有對象,但並不刪除容器中的指標。
Strings,Byte Arrays,and Variants

QString,QByteArray和QVariant這三個類和容器類有很多相似之處,在某些場合下可作為容器類的替代品;和容器類一樣,這三個類也應用了implicit sharing 機制
QString

QString中存放的是16-bit的Unicold值。
從概念上,QString可以看成是QVector<QChar>。
QString提供+/+=運算子以及append()函數用於合并字串
QString提供的sprintf()函數,與C++標準庫中的sprintf支援相同的參數格式。
QString提供的arg()函數,是比sprintf()更好的選擇,因為它保證型別安全,支援unicode。
QString::number(): number->string
QString::setNum(): number->string
反向的轉換介面:toInt(),toLongLong(),toDouble()等,這些函數都有一個選擇性參數——bool類型的指標,若轉換失敗則將該bool變數置為true,否則置false.
mid()函數返回指定區間內的子串;left()和right()函數則分別返回左子串和右子串
QString的indexOf()函數可用於文本匹配,返回所匹配子串的起始下標;匹配失敗時傳回值為-1。
startsWith()和endsWith()函數可用於判斷字串的首部和尾部是否符合某種模式。
QString在進行比較時是大小寫敏感的;當所比較的字串是使用者可見時,使用localeAwareCompare()通常是正確的選擇。
toLower() & toUpper()
replace() & remove() & insert()
trimmed() & simplified()——這兩個函數用於消去字串中的whitesapce(spaces,tabs,newlines等)
QString::split()將一個字串分割為子串,並返回由這些子串們組成的一個QStringList。
QStringList中的所有元素可以通過join()函數組成一個新的字串,join()的參數在合并時會被插入相鄰元素中間。
在大多數情況下,由const char * 至QString的轉換是自動的。
反方向的轉換,可通過toAscii()或toLatin1()來完成;這些函數返回一個QByteArray,其可以通過QByteArray
::data或QByteArray::constData()來轉換為const char * ;
為了簡化轉換,Qt提供了一個qPrintable()宏用於完成與toAscii()以及constData()相同的操作。
QByteArray
QByteArray提供的API與QString的很相似。
QByteArray的用處在於儲存原始2進位資料及8-bit編碼的字串。

通常選擇QString而不是QByteArray來儲存文本資訊,因為QString支援Unicode。
QByteArray會自動在最後一個元素之後補上‘/0',這樣使得將QByteArray傳遞給需要const char *的函數變得很容易。
QByteArray支援'/0',允許儲存任意的2進位資料。
QVariant

QVariant類可用於存放很多Qt類型的值,並且還可以存放容器。
QVariant在 item view class,database model 和QSetting中被廣泛的使用著。
利用QVariant和嵌套,可以建立非常複雜的資料結構。
QVariant的便利性是以效能和代碼的可讀性為代價的。
QVariant被Qt的meta-object system所使用,因此是Qtcore module的組成部分。
QVariant也可以支援使用者自訂的資料類型,前提是該類型具有defalut constructor和copy constructor。要實現對使用者自訂類型的支援,需要使用宏Q_DECLARE來註冊該類型。
全域函數:qVariantFromValue(),qVariantValue<T>(),qVariantCanConvert<T>()

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.