它们都是可调整大小的数组,而std :: basic_string没有任何特定于字符的函数,如upper()。字符串有什么特别之处才能使字符数据更好?
答案 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不会:
不可否认,std :: string对于向量不能或不可能没有其他东西,但这些很重要,它们是字符串的大多数用例。
答案 2 :(得分:3)
字符串确实有与字符串相关的特殊功能:c_str
,substr
,连接等。另外,不要忘记strings
自动将'\0'
添加到数据末尾(并使用连接等正确处理)的重点,因此它们的操作与vector<char>
或类似的东西。
但是,是的,它们非常相似。它们都有一个指向堆分配数组的指针,但它们肯定不一样。
答案 3 :(得分:1)
这是STL创建早期的设计决策。我想现在很多人都承认std::string
的界面过于膨胀,与STL的其他部分不一致,但现在改变它已经太迟了。