它們都是可調整大小的數組,而std :: basic_string沒有像upper()那樣的特定字符相關函數。字符串有什麼特別之處,使字符數據更好?爲什麼字符串和矢量的不同類型?
回答
大部分原因與本地化和國際化(L10I18),性能和歷史原因有關。
對於L10I18問題,添加了char_traits,並且您會注意到流也具有這些。其目的是以某種方式製作「更聰明的角色」,但結果毫無用處。關於char_traits唯一的好處是將std :: string/wstring比較,副本等作爲編譯器內在函數的一部分。
失敗主要是由於UNIX流本身,它看到字符作爲主要「原子」,在圖形用戶界面,web等國際化字符串是主要的「原子」。換句話說,在C/C++領域,我們對字符串有「愚蠢的字符數組」,而其他語言使用「愚蠢的字符智能數組」。 Unicode採用後一種方法。
basic_string和vector-basic_string之間的另一大區別只能包含POD類型。這可以在某些情況下有所改變,編譯器比vector更容易優化basic_string。
basic_string有時會有許多其他的優化,例如Copy on Write和Small String Optimization。這些因實施而異。
不過可能最有兩個原因的原因是歷史性的:字符串早於STL,並且大部分工作似乎集中在使它們與IOStream庫互操作。 One C++ Urban Myth是STL是一個被添加到C++中的「容器庫」。它不是,並且爲了將它應用到C++中,添加了容器。一個「STL接口」也被固定到現有的字符串類。 std :: vector主要取自AdaSTL中的矢量實現。
這是STL創作初期的設計決策。我認爲很多人現在承認std::string
的界面太臃腫,並且與其他STL不一致,但現在改變它爲時已晚。
字符串確實有特殊的字符串相關函數:c_str
,substr
,連接等等。此外,請不要忘記strings
自動將'\0'
添加到其數據末尾(並通過串聯等方式正確處理它),因此它們不具有與vector<char>
或類似的操作相同的操作。
但是,它們非常相似。它們都擁有一個指向堆分配數組的指針,但它們當然不是相同的。
的std :: string有很多是標準::向量不運算符:
- 運營商+(追加到串B字符串,+並沒有真正意義上的向量)
- 操作<,>,==,!=(字符串比較,對於一些載體沒有意義))
- c_str((返回一個 「C風格」 的代表)
- 多(包括子,發現,等等,但其中一些在STL的其他地方實施,可以在載體上使用,排序)
不可否認的是,std :: string沒有其他的東西,一個向量沒有或者不能,但是這些很重要,它們是一個字符串的大部分用例。
- 1. 爲什麼postgres將不同類型分配給字符串?
- 2. 爲什麼矢量具有不同的容量和大小?
- 3. 將字符串解析爲不同的變量類型
- 4. 爲什麼NULL字符串與「」字符串不同?
- 5. Ruby:空字符串和空字符串有什麼不同?
- 6. 字符串轉換爲數字矢量
- 7. 爲什麼不能將常量字符串分配給常量字符串類型?
- 8. C++矢量與不同類型的矢量
- 9. 如果字符串是矢量,爲什麼它們是不變的?
- 10. 創建個人字符串矢量類
- 11. 字符串和類都是引用類型,那麼爲什麼比較返回不同的結果?
- 12. 解析不同類型的字符串
- 13. 爲什麼我的「字節」類型的字符串?
- 14. Clojure:爲什麼=和.equals字符串有不同的表現?
- 15. 爲什麼不是類型(字符串)等於「<class 'str'>」?
- 16. RDD [X:矢量[字符串]以RDD [X:矢量[字符串] +迭代器:矢量[字符串]
- 17. 爲什麼MFC中有這麼多的字符串類型?
- 18. 爲什麼Swift中的字符串,數組和字典更改爲值類型
- 19. 從矢量<string>轉換爲非標量類型字符串
- 20. 什麼是「雙」字符串類型?
- 21. 爲什麼字符串聯合類型不能與變量一起工作?
- 22. 張量數據類型爲字符串?
- 23. 將矢量轉換爲字符串
- 24. vhdl:將矢量轉換爲字符串
- 25. 在matlab矢量中存在什麼樣的字符串?
- 26. 字符串矢量程序
- 27. 字符串矢量排序
- 28. 結合字符串矢量
- 29. R:通過一個字符串矢量爲字符串
- 30. 爲什麼字符串是引用類型,但行爲與其他引用類型不同?
是的,這是常識。其中一本Sutter/Alexandrescu C++書甚至有一章介紹它(以及重新設計std :: string類的練習)。 – riviera 2011-01-30 15:34:53