2010-03-13 26 views

回答

10

大部分原因與本地化和國際化(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中的矢量實現。

1

這是STL創作初期的設計決策。我認爲很多人現在承認std::string的界面太臃腫,並且與其他STL不一致,但現在改變它爲時已晚。

+0

是的,這是常識。其中一本Sutter/Alexandrescu C++書甚至有一章介紹它(以及重新設計std :: string類的練習)。 – riviera 2011-01-30 15:34:53

3

字符串確實有特殊的字符串相關函數:c_strsubstr,連接等等。此外,請不要忘記strings自動將'\0'添加到其數據末尾(並通過串聯等方式正確處理它),因此它們不具有與vector<char>或類似的操作相同的操作。

但是,它們非常相似。它們都擁有一個指向堆分配數組的指針,但它們當然不是相同的。

+0

我真的沒有看到substr或concatenation是字符串特定的。有些語言確實爲任意數組提供了這些語言。 你說的是空終止是正確的,但不幸的是,c_str()是我在std :: string上使用的最常用的函數。 – dan04 2010-03-13 02:01:08

+0

@ dan04:std :: string有大量函數和重載,這些函數和重載旨在使它與C風格的字符串(這正好是C++中的字符串文字)攜手合作。對於'vector '支持'T *'的所有操作是沒有意義的,因爲'char *'恰好是一個非常具體含義的指針。 – UncleBens 2010-03-13 11:23:58

6

的std :: string有很多是標準::向量不運算符:

  • 運營商+(追加到串B字符串,+並沒有真正意義上的向量)
  • 操作<,>,==,!=(字符串比較,對於一些載體沒有意義))
  • c_str((返回一個 「C風格」 的代表)
  • 多(包括子,發現,等等,但其中一些在STL的其他地方實施,可以在載體上使用,排序)

不可否認的是,std :: string沒有其他的東西,一個向量沒有或者不能,但是這些很重要,它們是一個字符串的大部分用例。

相關問題