C++中,如何在標準庫的std::string和常用庫(Qt,VC等)的QString之間進行選擇?
01-05
使用標準庫函數能提高代碼獨立性,但是使用常用庫函數更"接地氣",例如標準庫中的string和Qt中的QString(或者VC里的CString),他們都有類似的公用方法,但是我們在什麼情況下進行相應的選擇呢?
就拿Qt來說吧,使用Qt庫的時候,我們可以使用QString,讀取文件、傳入某些函數參數時候會更方便;但是也可以使用標準庫的std::string,能讓代碼更具有獨立性,以後移植到非Qt框架會更容易一些。
假設題主的意思是:在寫GUI程序的時候,如果GUI庫和STL都提供了某個功能(比如容器字元串),應該如何在兩個庫之間選擇?
我的做法是分層,比如分為frontend+core。開發core的時候只用STL,保證平台可移植性,並且編譯為動態庫。開發GUI frontend的時候與UI庫緊密結合,盡量不用STL,和core交接的地方一律進行數據類型轉換,不要顧慮轉換開銷。
BTW 這樣的話一般在開發GUI frontend之前會先寫CLI frontend,試驗core的功能。如果你確定要用 Qt 了,那完全可以用 Qt 那套基礎設施,比標準庫的好用不少,就算不用 GUI,就帶上 QtCore 也沒多大。做選擇的時候有時候要避免過度思考,用 Qt 寫的為什麼要移植到標準 C++?Qt已經可以保證在大多數平台可用了。
所有這類選擇性的問題,
我的答案都是一樣的:
喜歡哪個就用哪個。QString和std::string根本是兩個東西……QString才是字元串處理,內部同一編碼為Unicode,只要字元串轉成QString就沒任何擔憂了std::string那個渣渣,只是個封裝成class的char數組罷了……對照Qt頂多就是QByteArray,還沒那個好用
假如某個功能與GUI是緊密關聯的,比如說一個音樂播放器的歌詞顯示窗口,當然是用QString了,因為這個功能幾乎是不可能重用的,遷移到其他GUI框架的代價也非常高。
假如是可以獨立出來的,比如說一個音樂播放器的ID3標籤處理類,那麼可以用const wchar_t *作為與外界交互的介面,QString/std::wstring之類的統統不要用,這樣這個類可以在任意環境下重用。PS. 很多時候,字元串一旦創建,就不再修改的了,所以這時用std::string也是不必要的。Qt和STL根本就不是一個層次的東西,談不上在它們之間如何選擇。你可以說:在VC STL和stlport之間如何選擇,或者Qt和wxWidget之間如何選擇,這才是一個層次東西。
如果你不是寫 GUI 程序,那麼不要用Qt,在非GUI領域Qt不具備優勢,反而帶來移植的麻煩。
如果寫GUI程序,那麼Qt是為數不多的選擇之一,甚至可能是最好的選擇。隨便。當然我建議,給控制項傳值的,如果創建後不用修改,用QString。其他一律用std::string。
看你喜好,如果只是標準模板庫方面,網上有對QTL和STL有較詳細的比較、、
原文為英文,需翻牆,地址:
http://marcmutz.wordpress.com/effective-qt/containers/ 我試著翻譯了些,但是現在還沒翻譯完畢:[翻譯]理解Qt容器:STL VS QTL(一)——特性總覽[翻譯]理解Qt容器:STL VS QTL(二)——迭代器如果有興趣可以一起下面的翻譯完畢、、個人觀點:現在QtCore 模塊很給力了,單獨一個qtcore的dll也很小(5.x依賴icu,你可以自己編譯不用這個依賴)、、、Qtcore相對stl是stl里的qtcore幾乎都有。stl對於字元串的處理較弱,api很多也沒Qt的優美、、std::string,std::wstring和QString相比個人以為有個很鬱悶的地方,就是std::string和std::wstring沒有規定編碼,每個平台和每個編譯器實現均不一,在跨平台的時候有的時候這個編碼很坑,還有std::string對於漢子這些雙位元組的處理有時有點鬱悶、、QString內部是用的UTF-16,全平台都一樣的、、個人傾向,如果涉及Qt了就全部Qt了,就是一般的程序沒有特殊要求也用QTL代替STL的、、優勢太多了、、至於效率。幾乎無差別的、、根據需求吧公司項目使用Qt做的,前段時間在做一個列印模塊的時候,列印的字元需要嚴格對齊,結果發現一個問題QString的length(),size()函數對字元串計算長度,無論中文還是英文,都是1個字長度為1,(「中文」長度2,"Ch"長度也是2)但是很明顯,列印出來的效果一個中文字元的是兩個英文字元的寬度。唯一的解決辦法就是用QString::toStdString來轉換成string……
std::string和QByteArray對等。大多數情況用後者更好。至於QString是unicode編碼的字元串。問這個問題說明兩點:1,實踐中確實碰到了需要糾結的情況。2,對這兩個東西理解不到位。
如果你寫的東西別人會用到,你不確定用到的人有怎麼樣的環境,用char*。如果你能確定使用者一定在C++環境下,用std::string。如果是自己擼個小工具什麼的,不涉及到代碼復用,那就QString。如果是大型工具,建議GUI和邏輯分離,不建議使用QString這種GUI庫中的邏輯代碼,char*,std::string都是更好的選擇,boost可以做編碼、易用性上的彌補。
推薦閱讀:
※微軟vector類中resize函數的實現對比linux是不是不夠好?
※**p[] 和*(*p)[] 有什麼區別?
※C語言和C++的基礎知識區別大嗎?
※為什麼這段 c++ 代碼需要加這對括弧才正確運行,是編譯器問題嗎?