C 自己寫乙個更好的 string 需要什麼步驟?

時間 2021-05-29 22:56:31

1樓:陳林熙

至於需要什麼步驟,重要的馬上動手.std::string問題太多,不同方面,不同層面,很難一一具表.

不過我的Str是從Ctnr繼承的,我就說一點廢話,字串是一種串.

2樓:wankang

不建議自己寫乙個 String 類。

首先,你的所謂「更好」的標準是什麼?別告訴我是為了沒人批評。。。說具體一點,不要泛泛而談

其次,你了解別人設計的優點和缺點是什麼嗎?

第三,如果你已經了解了缺點,在設計和使用的時候,繞開缺點不就可以了嗎,為啥一定要自己去造乙個輪子

舉例:曾經遇到的 String 的麻煩,以及繞開或者解決的辦法:

跨執行緒使用問題---使用 char * 進行引數傳遞介面中使用會出現問題---介面中使用 char * 或者 const char *

3樓:黃亮anthony

我是同意那句話的。

如果放在通用的場景下,很難做到。平衡各方的需求非常難,會變成乙個效能蹺蹺板。

也就是說沒有特殊要求的情況下,原生的是最好的,或者說價效比最高。

但是在特定庫的場景下,自己寫乙個實現,優化80%的操作非常有可能。

4樓:原子筆

從樓上這麼多站在自己的立場自己的主要用途自己的看法來提的建議來看,我看樓主還是學學樓上這些人:」寫乙個僅合適自己的應用場景的string「就夠了。。沒看到大家都特別自私的嗎,

5樓:邱昊宇

首先好好看下 Unicode 到底意味著什麼。

儘管你可以用 char、char32_t 等等作為底層實現,但要注意你要實現的是「字串」而不是「char 串」、「UTF-8 串」、「UTF-32 串」、「Unicode 碼位串」。

看到很多回答都提到把 UTF-32 編碼單元當作字元,且不提 UTF-32 編碼單元只是目前與 Unicode 碼位一一對應,Unicode 碼位本身與字元也並不是一一對應的。比如「ò」和「o」是同乙個字元,但是前者只佔乙個 Unicode 碼位(U+00F2),後者則是由兩個字元拼接而成的(乙個普通的「o」(U+006F)和乙個特殊的組合字元(U+0300)。光這一點就能引出子串、查詢、歸一化等問題。

Unicode 裡還有一些奇怪的機制(比如很多為了奇怪語種搞出的特性,還有比如為了支援國旗以及政治正確 emoji 搞出來的么蛾子)。如果你想實現乙個「更好」的字串類,在動手之前好好研究下應該是必要的。

6樓:Glavo

字串不是關鍵,關鍵是你要提供完善的處理字串的方法。從最簡單的流讀入,到處理編碼之類的,還有正則等等,這些操作沒有就太難受了

7樓:暮無井見鈴

說下個人的 YY 。

這裡的 view/mut_view 是給全部完整物件型別的。char_array 給字元型別,coded_*** 由上述東西與 code_traits 組合。

函式能用 view 的就用 view ,刪了複製建構函式,改用 view 做中介。以免搞出複製障礙、過載之類的破事。

有的場合酌情考慮用 mut_view 。

view 和 char_array 不要 Traits 。char_array 幾乎就是是去掉 Trairs 的「純粹」 std::basic_string ,盡量考慮用一堆編碼無關的介面。

去掉雞肋的 char_traits ,換用 code_traits 。

再加上 coded_(mut_)view 和 coded_string 這些分別給 (mut_)view 和 char_array 套上編碼特性的類。

coded_string 裡搞編碼轉換/to_upper/驗證合法之類的。對 UTF 之間轉換特化下,其他以 native_code 為中介轉換。

char_array 是容器,而 coded_string 不是, coded_string 原則上不能單字元修改,沒有 operator 。兩者間需要一些顯式轉換。

最後用的字串類就是 coded_string 和 char_array ,兩者分別處理 code points 和 code units 。當然 coded_view 和 view 可能更常用。

進一步的要求可以在上面的設施中上做文章,譬如拿 bidirect_vec> 做(無所有權的)連線專用字串等等( bidirect_vec 是 vector 改成適合雙端擴充套件的版本)

或許可以拿 shared_ptr 搞個 shared_view ,然後用 bidirect_vec> 做共享所有權的連線專用字串。

如果模板有個以字串字面量為實參的簡便途徑,再考慮 regex 和 format ……

8樓:

我覺得std::string幾乎是最好的通用設計了欽點編碼這是玩不轉的,編碼不止常用的,那些GBK系列咋辦?

你不管以前資料的相容?

變長字符集和非變長的很多介面的複雜度都會不同不可變的話,記憶體和效率損失,上層反覆呼叫某些藉口就GG了既然說通用,我建議搞乙個text,處理實際你們的文字編碼等各種問題說到底,C++程式設計師就得為特殊的需求反覆造輪子,逃不過的宿命23333

9樓:

請參考exceptional cpp style,專門有對std.string的介面優化

事實上,部分std委員會的人好像對string確實不太滿意,太大了。

10樓:胖財

別把string設計成字元的容器,不論是陣列還是序列。理由不僅是encoding,更重要的是string作為容器的結構並不符合它的普遍應用場景:讀取和連線。

我們多久才會用到一次修改內容甚至是in-place sorting?

string_view是另一層套在已有系統上的hack solution,如果說string應該怎麼設計,我傾向於string就應該是現在的string_view。

string應當對編譯時字串做優化:有極其多字串本質上就是編譯時定義的,而且終其一生不會改變。

string應當對連線進行優化:用鍊錶連線已有的靜態和動態字串,並有選擇地對小字串動態歸併進small string optimization buffer。而不是:

為了資料連續性不斷進行記憶體分配和拷貝。

11樓:d41d8c

1.別依賴char_traits

2.少宣告成員函式,別過度使用成員模板,能宣告成

int compare(basic_string_view sv) const noexcept;

就不要寫成

int compare(basic_string_view sv) const noexcept;

int compare(size_type pos1, size_type n1, basic_string_view sv) const;

template

int compare(size_type pos1, size_type n1, const T& t,

size_type pos2, size_type n2 = npos) const;

int compare(const basic_string& str) const noexcept;

int compare(size_type pos1, size_type n1, const basic_string& str) const;

int compare(size_type pos1, size_type n1, const basic_string& str,

size_type pos2, size_type n2 = npos) const;

int compare(const charT* s) const;

int compare(size_type pos1, size_type n1, const charT* s) const;

int compare(size_type pos1, size_type n1, const charT* s, size_type n2) const;

更不要搞成

template

int compare(const T& t) const;

template

int compare(size_type pos1, size_type n1, const T& t) const;

template

int compare(size_type pos1, size_type n1, const T& t,

size_type pos2, size_type n2 = npos) const;

int compare(const basic_string& str) const noexcept;

int compare(size_type pos1, size_type n1, const basic_string& str) const;

int compare(size_type pos1, size_type n1, const basic_string& str,

size_type pos2, size_type n2 = npos) const;

int compare(const charT* s) const;

int compare(size_type pos1, size_type n1, const charT* s) const;

int compare(size_type pos1, size_type n1, const charT* s, size_type n2) const;

3.提供個返回string_view的substr/slice成員函式

如何自己寫乙個 C 的圖形庫

ACE 你到底要實現圖形介面庫,還是圖形庫?如果你想做的很徹底,就要懂作業系統的知識了,類似win32視窗這種都是windows作業系統提供的,這個級別的圖形庫我也不知道怎麼實現,可以參考linux原始碼 大概率就是提供了一組函式直接操作顯示卡 如果不是那麼徹底,就以Qt為標準,只是對系統API的一...

如何用 c 語言寫乙個扔色子的程式?

GsyPs 既然問題描述要求各面的值。1 隨機朝向天的點數 2 水平方向選擇一點為參考,隨機0到360度隨機一下角度,即可確定剩下四面的朝向。3 printf 列印出來 偏扁豆 想了乙個真隨機 建乙個rpc伺服器,server端弄個worker池,每個worker負責聯絡乙個知乎的閒人負責現實中擲色...

如何使用c語言寫乙個簡單的小遊戲?

傻傻狗 高二圖一樂寫的小迷宮,想要簡單小遊戲就給你這個唄,通過這個也可以延伸一點的。比如 加入關卡設計,推箱子,貪吃蛇。或者同樣是迷宮再複雜一點隨機生成地圖然後搜尋演算法確定可行性呀,或者先生成路線,再根據想要的路線隨機生成地圖呀。都可以的。include include include int m...