2010-03-13 27 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没有其他的东西,一个向量没有或者不能,但是这些很重要,它们是一个字符串的大部分用例。

相关问题