任何人都知道爲什麼C++標準庫’ std::string
類(或更一般的std::basic_string
類模板)缺少普通的字符串功能,例如大寫字母,子字符串替換和修剪等,與例如QString Qt中的類還是Python字符串?缺少std :: string功能
回答
功能欠佳?被認爲是標準庫中的一個臃腫組件。您有一套完整的算法,它們在std::string
s上運行,所有標準算法。不要限制自己的成員函數,還有比這一個接口是更多...
-1謬誤。不相關功能的膨脹是功能差的證據,而不是反證據。 'std :: string'(或者更普遍的'std :: basic_string')作爲一個字符串*具有極其糟糕的功能*。嘗試簡單的事情,比如大寫一個字符串,或者用另一個替換所有出現的子字符串。更基本的,嘗試修剪一個字符串。 C++'std :: string'只適用於一種情況,這是一種*標準*的方式來傳遞字符串,即使它是不必要的低效和限制的目的。 –
@乾杯和hth。 - Alf:臃腫的功能並非無關緊要,它在字符串本身或標準庫中是重複的。在一個非常簡單的例子中,查看'size'和'length'的實例。這是將獨立字符串庫與_STL_組合在一起的結果。 –
@Cheers和hth。 - Alf:如果你已經瞭解了_Standard Library_,那麼你將會看到這個功能在那裏,只對每一種_Sequence_類型,而不僅僅是'basic_string'。例如''for_each(s.begin(),s.end(),toupper)'大寫整個字符串。 –
不能在最一般的意義上回答所有缺少的功能,但是......
兩個特點所提到的,修剪和大寫,都是與語言環境相關的。它們不僅是字符的功能,還有正在使用的編碼和語言。
std::string
並沒有真正處理這個問題。儘管在實踐中,每個人都使用ASCII來定義ASCII的空白字符,但這對於定義C++的標準化過程來說還不夠普遍。
這樣的操作是通過流(例如,從std::stringstream
中讀出以去除多餘空間)和區域設置對象(例如,通過std::tolower
訪問)獲得的。
我認爲沿着相同的路線,但如果你可以有單個字符的標準庫函數,爲什麼不把它們擴展到集合?我只想解決以下事實:a)標準還不完美,b)可能難以保證整個集合上的操作(例如'toupper')更難以定義(因爲某些字符可能是純粹的ASCII和一個字符串中的一些西裏爾字母 - 我還沒有完全想過這一點),而不是單個字符(在轉換之前您可以進行檢查,並據此採取行動)。 – dirkgently
最後一點需要澄清一點:使用混合'toupper'語義對字符串進行錯誤處理很困難。我會說同樣可以適用於修剪 - 標點符號(你認爲法文* l'arbre *的一部分是否是撇號?)很難編碼,而不會潛入更深的問題,而不是語言庫標準的範圍可以定義。 – dirkgently
@dirkgently如果有一個'std :: string :: toupper'函數帶一個帶默認參數的'std :: locale'會很好。有一定程度的糟糕的界面設計,特別是在'char_traits'周圍。但是對於缺少*的特性,如果你在'std :: string'的外部尋找適當的東西(並且沒有什麼錯誤),那麼整個庫就會有很多功能。 – Potatoswatter
我要好好看看這個刺...
std::basic_string
最初編寫並列入STL模板,它代表了標準庫的「抽象」的部分,因爲我們知道它(容器,迭代器,算法,分配器等)。這也包括std::string
。
請注意STL中絕對沒有編碼,國際化或區域依賴功能。這不是一個設計目標。
現在我對前幾代人的看法:當C++標準化時,需要一個全面的標準庫。 STL非常適合這一點,幾乎是逐字地接管了STL。後來才增加了像<iostream>
和<locale>
這樣的東西。流與串之間的笨拙而非連貫的界面差異僅僅證明了這一點:「讓我們把它放在一起」的態度。
與許多std
設施一樣,組件之間的互操作性未得到優化。最重要的是,包裝現有C功能的小型C++函數(如toupper
)的簡單性已被用作不包括在標準庫中的原因。
通過標準的下一次修訂(以及由此包含的庫),向後兼容性可防止添加任何有用的和必要的更改(將語言環境注入std::string
功能)。
請注意,這個猜想根本不能解釋爲什麼例如std::trim
接受一個字符串和locale對象沒有被添加。它試圖解釋涉及的背景過程。現在所有人都說過了,我完全同意C++標準庫在其一般的用途上是笨重和不完整的。
UPDATE:我已被告知我的時間軸是相反的:標準庫(和iostream)在添加STL之前存在。上面的點仍然有效:STL是複製粘貼的,幾乎沒有整合(簡單的例子:直到最近std::basic_istream<T>::open(const std::basic_string<T>&)
,這將在下一次迭代中由於std::filesystem
東西而被棄用)。
- 1. JSONObject(String)缺少?
- 2. 錯誤:功能太少的參數`void alpha(std :: string *,student)'
- 3. FirstResponder缺少一些功能
- 4. Azure的功能 - 'AzureWebJobsServiceBusConnectionString' 缺少
- 5. MinGW終端缺少功能
- 6. ggplot2中缺少功能區
- 7. 從Openlayers缺少ol.animate功能
- 8. javadoc缺少visAD庫功能
- 9. H2OTwoDimTable似乎缺少功能
- 10. std :: map :: emplace()缺少 - 過期的庫?
- 11. 「std :: string const」與「const std :: string」
- 12. F#Silverlight下缺少BigInteger功能
- 13. MPMediaPickerController缺少iPad上的搜索功能
- 14. 缺少Express SSL身份驗證功能?
- 15. 實體框架4缺少的功能?
- 16. iis7中缺少會話狀態功能
- 17. Oracle - 此功能缺少窗口規範
- 18. 我在SubSonic 3上缺少功能
- 19. Azure B2C登錄策略 - 缺少功能
- 20. jQuery powered Accordion缺少Anchor Link功能
- 21. 功能在Python超載:缺少
- 22. SQL Azure中缺少哪些功能
- 23. chrome中缺少一些watir-webdriver功能
- 24. 是fabricjs.d.ts真的缺少動畫功能?
- 25. Android:缺少功能觀看錯誤
- 26. Excel插件。缺少功能區(XMl)
- 27. 角TinyMCE的缺少的功能
- 28. NDK,爲什麼它缺少SDK功能?
- 29. VS2012缺少「格式化文檔」功能
- 30. IIS - 缺少Windows身份驗證功能
可能值得一讀的項目有:1)['ctype :: toupper'](http://www.cplusplus.com/reference/std/locale/ctype/toupper/)(特別是第二次過載它需要一個範圍)和2)James Kanze關於大寫字符串的一個[email](http://cpptips.com/intl_string)。 – dirkgently