改進std::string

String

因爲std::string中有一些地方爲了保證空間與時間的平衡從而採用了在時間上較爲保守的方式 所以我在此基礎上略微的打破了這個平衡 使得更追求時間效率.

做了什麼

  1. char_traits<_CharT>中的比較方法較爲低效 爲逐字符比較 導致basic_string中find系方法較爲低效 爲O(n2), 遂改爲內部使用strstr()函數,也可改爲kmp,兩者效率差不多,以此提升字符串比較的效率.
  2. 在string的動態擴容中同樣對應着容量動態減小,標準庫中的做法是遇到容量減小時直接使用alloctor銷燬原來大塊內存,然後分配小塊內存,這樣會涉及多餘的內存分配,在我的實現中,爲了保證時間,取消的容量減小
  3. 在移動構造函數中同樣存在着上述問題 即減小容量的問題 在我的移動構造函數的實現中我取消了容量減小這一步 以追求更少的時間
  4. 標準庫中的shrink_to_fi實現幾乎是沒有意義的 僅有一種情況有意義 即length小於初始容量(短字符串優化)時會釋放alloctor中分配的內存, 但對於其他情況就沒有任何意義了 所以我簡單的對這個函數做了功能上的完善 即在length大於初始容量時這個函數可以做它該做的事情 即減少容量至length.(還在修改)
  5. 項目中實現了迭代器板塊(base_iterator, reverse_iterator),實現參考標準庫中實現,可把本項目中的迭代器操作直接放在標準庫中的泛型算法中進行使用.

需要改進之處

  1. 前期因爲時間緊張,在擴容中沒有使用移動,使得拷貝效率較低,這是改進的一個方向 但也並不困難
  2. 不能兼容string_view 那部分的元編程最近沒有時間深究
  3. 對於wstring,u16string, u32string還未編寫char_traits部分
  4. 中間有一陣腦子比較亂,對於_Return_pointer()這個操作在一些函數中分成了兩部寫 但這是沒有一點必要的,因爲初始化時靜態數組的值已經賦給了_True_value,這是一個重大的敗筆,大概有幾十處的使用錯誤,還未修改
  5. 未編寫輸入部分

結論

  1. 大致看了一遍string的源碼後我的感覺就是標準庫中的string操作大都是十分簡單的,但有一點不好實現,即輸入部分,標準庫中的實現是把所有的值放到輸入流中 然後從流中取出數據append到string中 再去動態擴容, 這個操作對於我們來說是不好實現的,所以string的一大左右就是無限制的輸入
  2. std::string沒有網上說的那麼不堪,至少實現的功能絕對是很好的,雖然功能很少,效率不高,可以的情況下使用string_view.
  3. 搞清楚了迭代器到底是什麼,那句廣義上的指針一點也沒錯,
  4. 善用標準庫.

下面是源碼的地址
String

歡迎大家提出意見和自己的想法 在評論區留下您的寶貴意見
也歡迎大家在我的源碼中貢獻您的代碼

發佈了111 篇原創文章 · 獲贊 69 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章