學習QT之QString詳解

2021-10-03 10:12:07 字數 3341 閱讀 8464

qstring類儲存16位unicode值,提供了豐富的操作、查詢和轉換函式。該類還進行了使用隱式共享、高效的記憶體分配策略等多方面的優化。

字串的操作

函式說明

在乙個字串的末尾追加另乙個字串

str.sprintf("%s",「helloworld」)

給字串賦值為helloworld

str=qstring("%1 is good").arg(「bike」)

arg()函式佔位後填

str.insert(1,「hello」)

在字串第二個字元處插入"hello"

str.prepend(「hello」)

在源字串的開頭插入另乙個字串

str.replace()

用指定的字串代替原字串中的某些字串

qstring::trimmed()

移除字串兩端的空白字元

qstring::simplified()

移除字串兩端的空白字元,使用單個空白字元" "代替字串**現的空白字元

字串的查詢

函式說明

str.startwith(』@』,qt::casesensitive)

是否以特定字元開頭

str.endwith(』#』,qt::casesensitive)

是否以特定字元結尾

str.indexof(』*』,qt::casesensitive)

返回字串中特定字元的索引

str.contains(『welcome』,qt::casesensitive)

查詢字串中是否包含特定字串

字串的轉換

函式說明

str.toint(&ok,16) //16為進製,預設為10

將字串轉換為整型值

str.toascii()

返回乙個ascii編碼的8位字串

str.latin1()

返回乙個latin-1編碼的8位字串

str.toutf8() //utf-8是ascii碼的超集

返回乙個utf-8編碼的8位字串

str.tolocal8bit()

返回乙個系統本地編碼的8位字串

null字串和空字串的區別:乙個null字串就是使用qstring的預設建構函式或者使用"(const char*)0"作為引數的建構函式建立的qstring字串物件;而乙個空字串是乙個大小為0的字串。乙個null字串一定是乙個空字串,而乙個空字串未必是乙個null字串。

隱式共享又稱回寫複製。當兩個物件共享同乙份資料(通過淺拷貝實現資料塊的共享)時,如果資料不改變,則不進行資料的複製。而當某個物件需要改變資料時,則進行深拷貝。

程式在處理共享物件時,使用深拷貝和淺拷貝這兩種方法複製物件。所謂深拷貝,是指生成物件的乙個完整的複製品,執行乙個深拷貝的代價是比較昂貴的,要占用更多的記憶體和cpu資源;而淺拷貝的效率則很高,它僅需設定乙個指向共享資料塊的指標及修改引用計數的值。

隱式共享可以降低對記憶體和cpu資源的使用率,提高程式的執行效率。它使得在函式(如引數、返回值)中使用值傳遞更有效率。

qstring類採用隱式共享計數,將深拷貝和淺拷貝郵寄地結合起來,下面通過乙個例子來說明。

qstring str1="data";

qstring str2=str1; //(a)

str2[3]='e'; //(b)

str2[0]='f'; //(c)

str1=str2; //(d)

(a)qstring str2=str1:將該字串物件str1賦值給另乙個字串str2(由qstring的複製建構函式完成str2的初始化),此時,str2=「data」。在對str2賦值的時候,將發生一次淺拷貝,導致兩個qstring物件都指向同乙個資料結構。該資料結構除儲存字串"data"外,還儲存了乙個引用計數器,以記錄字串資料的引用次數。在這裡,因為str1和str2指向同乙個資料結構,所有計數器的值為2。

(b)str2[3]=『e』:對qstring物件str2的修改將會導致一次深拷貝,使得str2物件指向乙個新的、不同於str1所指的資料結構(該資料結構的引用計數為1,因為只有str2指向這個資料結構),同時修改原來的str1指向的資料結構,設定它的引用計數為1(此時,只有qstring物件str1指向該資料結構)。雞兒在這個str2指向的、新的資料結構上完成資料的修改。引用計數為1意味著這個資料沒有被共享。此時,str2=「date」,str1=「data」。

(c)str2[0]='f『:進一步對qstring物件str2進行修改,但這個操作不會引起任何形式的複製,因為str2指向的資料結構沒有被共享。此時,str2=「fate」,str1=「data」。

(d)str1=str2:將str2賦值給str1。此時,str1將它指向的資料結構的引用計數器的值修改為0,也就是說,沒有qstring物件再使用這個資料結構了。因此,str1指向的資料結構會從記憶體中釋放掉。該操作的結果是,qstring物件str1和str2都指向字串為"fate"的資料結構,該資料結構的引用計數為2。

qt中支援隱式共享的類,還包括:

所有的容器類。

qbytearray、qbrush、qpen、qpalette、qbitmap、qimage、qpixmap、qcursor、qdir、qfont和qvariant等。

qstring在乙個連續的記憶體塊中儲存字串資料。當字串的長度不斷增長是,qstring需要重新分配記憶體空間,以便有足夠的控制項儲存增加的字串。qstring使用的記憶體分配策略如下:

每次分配4個字元空間,直到大小為20。

在20~4084之間,qstring分配的記憶體塊大小以2倍的速度增長。

從4084開始,每次以2048個字元大小(4096位元組,即4kb)的步長增長。

下面舉例說明qstring在後台是如何執行的:

qstring test()

說明:首先定義乙個qstring物件str,然後為它追加9000個字元。根據qstring的記憶體分配策略。這個迴圈操作將導致14次記憶體重分配:4、8、16、20、52、116、244、500、1012、2036、4084、6132、8180、10228。最後一次記憶體重分配操作後,qstring物件str具有乙個10228個unicode字元大小的記憶體塊(20456位元組),其中9000個字元空間被使用(18000位元組)。

Qt學習筆記1 QString

每乙個gui程式都需要string,這些string可以用在介面上的提示語,也可以用作一般的資料結構。c 語言提供了兩種字串的實現 c風格的字串,以 0 結尾 std string,即標準模版庫中的類。qt則提供了自己的字串實現 qstring。qstring以16位uniode進行編碼。我們平常用...

QT學習 QString的arg方法

自 在qt的qstring中,arg方法類似於c中的printf中使用的格式輸出符 只是有點類似 在qt5的幫助文件中,有如下幾種用法 使用arg str1,str2,str3 這種方法進行替換。使用arg str1 arg str2 arg str3 這種方法進行替換。使用arg int,int,...

Qt之QString字串分割 擷取

在做專案中不可避免的會使用到一串字串中的一段字元,因此常常需要擷取字串。有兩種方式可以解決這個問題 方法一 qstring分割字串 qstring date dateedit.tostring yyyy mm dd qstringlist list date.split qstring字串分割函式方...