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

时间:2010-03-13 00:38:55

标签: c++ string stl vector

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

4 个答案:

答案 0 :(得分:11)

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

对于L10I18问题,添加了char_traits,您会注意到流也有这些问题。目的是在某种程度上制造“更聪明的角色”,但结果毫无用处。关于char_traits唯一有用的东西是将一些std :: string / 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中存在的矢量实现。

答案 1 :(得分:6)

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

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

不可否认,std :: string对于向量不能或不可能没有其他东西,但这些很重要,它们是字符串的大多数用例。

答案 2 :(得分:3)

字符串确实有与字符串相关的特殊功能:c_strsubstr,连接等。另外,不要忘记strings自动将'\0'添加到数据末尾(并使用连接等正确处理)的重点,因此它们的操作与vector<char>或类似的东西。

但是,是的,它们非常相似。它们都有一个指向堆分配数组的指针,但它们肯定不一样。

答案 3 :(得分:1)

这是STL创建早期的设计决策。我想现在很多人都承认std::string的界面过于膨胀,与STL的其他部分不一致,但现在改变它已经太迟了。