2012-06-21 144 views
1

任何人都知道爲什麼C++標準庫’ std::string類(或更一般的std::basic_string類模板)缺少普通的字符串功能,例如大寫字母,子字符串替換和修剪等,與例如QString Qt中的類還是Python字符串?缺少std :: string功能

+1

可能值得一讀的項目有:1)['ctype :: toupper'](http://www.cplusplus.com/reference/std/locale/ctype/toupper/)(特別是第二次過載它需要一個範圍)和2)James Kanze關於大寫字符串的一個[email](http://cpptips.com/intl_string)。 – dirkgently

回答

2

功能欠佳?被認爲是標準庫中的一個臃腫組件。您有一套完整的算法,它們在std::string s上運行,所有標準算法。不要限制自己的成員函數,還有比這一個接口是更多...

+3

-1謬誤。不相關功能的膨脹是功能差的證據,而不是反證據。 'std :: string'(或者更普遍的'std :: basic_string')作爲一個字符串*具有極其糟糕的功能*。嘗試簡單的事情,比如大寫一個字符串,或者用另一個替換所有出現的子字符串。更基本的,嘗試修剪一個字符串。 C++'std :: string'只適用於一種情況,這是一種*標準*的方式來傳遞字符串,即使它是不必要的低效和限制的目的。 –

+1

@乾杯和hth。 - Alf:臃腫的功能並非無關緊要,它在字符串本身或標準庫中是重複的。在一個非常簡單的例子中,查看'size'和'length'的實例。這是將獨立字符串庫與_STL_組合在一起的結果。 –

+1

@Cheers和hth。 - Alf:如果你已經瞭解了_Standard Library_,那麼你將會看到這個功能在那裏,只對每一種_Sequence_類型,而不僅僅是'basic_string'。例如''for_each(s.begin(),s.end(),toupper)'大寫整個字符串。 –

3

不能在最一般的意義上回答所有缺少的功能,但是......

兩個特點所提到的,修剪和大寫,都是與語言環境相關的。它們不僅是字符的功能,還有正在使用的編碼和語言。

std::string並沒有真正處理這個問題。儘管在實踐中,每個人都使用ASCII來定義ASCII的空白字符,但這對於定義C++的標準化過程來說還不夠普遍。

這樣的操作是通過流(例如,從std::stringstream中讀出以去除多餘空間)和區域設置對象(例如,通過std::tolower訪問)獲得的。

+0

我認爲沿着相同的路線,但如果你可以有單個字符的標準庫函數,爲什麼不把它們擴展到集合?我只想解決以下事實:a)標準還不完美,b)可能難以保證整個集合上的操作(例如'toupper')更難以定義(因爲某些字符可能是純粹的ASCII和一個字符串中的一些西裏爾字母 - 我還沒有完全想過這一點),而不是單個字符(在轉換之前您可以進行檢查,並據此採取行動)。 – dirkgently

+0

最後一點需要澄清一點:使用混合'toupper'語義對字符串進行錯誤處理很困難。我會說同樣可以適用於修剪 - 標點符號(你認爲法文* l'arbre *的一部分是否是撇號?)很難編碼,而不會潛入更深的問題,而不是語言庫標準的範圍可以定義。 – dirkgently

+0

@dirkgently如果有一個'std :: string :: toupper'函數帶一個帶默認參數的'std :: locale'會很好。有一定程度的糟糕的界面設計,特別是在'char_traits'周圍。但是對於缺少*的特性,如果你在'std :: string'的外部尋找適當的東西(並且沒有什麼錯誤),那麼整個庫就會有很多功能。 – Potatoswatter

5

我要好好看看這個刺...

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東西而被棄用)。