为什么字符串和向量不同类型?

dan*_*n04 6 c++ string stl vector

它们都是可调整大小的数组,而std :: basic_string没有任何特定于字符的函数,如upper().字符串有什么特别之处,可以让字符数据变得更好?

Lan*_*uck 11

大多数原因与本地化和国际化(L10I18),性能和历史原因有关.

对于L10I18问题,添加了char_traits,您会注意到流也有这些问题.目的是在某种程度上制造"更聪明的角色",但结果毫无用处.关于唯一char_traits是好是专门某些性病::串/ wstring的比较,复制等为编译器内在.

失败主要是由于UNIX流本身,它们将字符视为主要的"原子",在GUI,web等国际化中,字符串是主要的"原子".换句话说,在C/C++领域,我们对字符串使用"智能字符的哑数组",而其他所有语言都使用"哑字符的智能数组".Unicode采用后一种方法.

basic_string和vector之间的另一个重大区别 - basic_string只能包含POD类型.这可以在某些情况下产生差异,与vector相比,编译器更容易优化basic_string.

basic_string有时还有许多其他优化,例如Copy on Write和Small String Optimization.这些因实施而异.

然而,最重要的原因有两个几乎相同的东西是历史:字符串早于STL,并且大多数工作似乎都集中在使它们与IOStream库互操作.一个C++都市神话是STL是一个添加到C++的"容器库".它不是,并且为了将其应用到C++中,增加了容器."STL接口"也用螺栓固定在现有的字符串类上.std :: vector主要来自AdaSTL中存在的矢量实现.


Soa*_*Box 6

std :: string有很多运算符,std :: vector不会:

  • operator +(将字符串a追加到字符串b,+对于向量实际上没有意义)
  • operator <,>,==,!=(字符串比较,有些对矢量没有意义)
  • c_str()(返回"C风格"表示)
  • 还有更多(包括子串,查找等,但其中一些在STL的其他地方被发现,可以在矢量上使用)

不可否认,std :: string有一个向量不能或不能的东西,但这些很重要,它们是字符串的大部分用例.