它们都是可调整大小的数组,而std :: basic_string没有像upper()那样的特定字符相关函数。字符串有什么特别之处,使字符数据更好?为什么字符串和矢量的不同类型?
回答
大部分原因与本地化和国际化(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中的矢量实现。
这是STL创作初期的设计决策。我认为很多人现在承认std::string
的界面太臃肿,并且与其他STL不一致,但现在改变它为时已晚。
字符串确实有特殊的字符串相关函数:c_str
,substr
,连接等等。此外,请不要忘记strings
自动将'\0'
添加到其数据末尾(并通过串联等方式正确处理它),因此它们不具有与vector<char>
或类似的操作相同的操作。
但是,它们非常相似。它们都拥有一个指向堆分配数组的指针,但它们当然不是相同的。
的std :: string有很多是标准::向量不运算符:
- 运营商+(追加到串B字符串,+并没有真正意义上的向量)
- 操作<,>,==,!=(字符串比较,对于一些载体没有意义))
- c_str((返回一个 “C风格” 的代表)
- 多(包括子,发现,等等,但其中一些在STL的其他地方实施,可以在载体上使用,排序)
不可否认的是,std :: string没有其他的东西,一个向量没有或者不能,但是这些很重要,它们是一个字符串的大部分用例。
- 1. 为什么postgres将不同类型分配给字符串?
- 2. 如何将矢量字符串的值更改为不同的字符串值?
- 3. 为什么矢量具有不同的容量和大小?
- 4. 将字符串解析为不同的变量类型
- 5. 为什么字符串长度不同?
- 6. 什么是#define字符串的类型?
- 7. Haskell代码和类型的参数数量不同,为什么?
- 8. 为什么NULL字符串与“”字符串不同?
- 9. Ruby:空字符串和空字符串有什么不同?
- 10. 字符串转换为数字矢量
- 11. 为什么不能将常量字符串分配给常量字符串类型?
- 12. C++矢量与不同类型的矢量
- 13. 如果字符串是矢量,为什么它们是不变的?
- 14. 字符串和类都是引用类型,那么为什么比较返回不同的结果?
- 15. 创建个人字符串矢量类
- 16. 解析不同类型的字符串
- 17. 为什么我的“字节”类型的字符串?
- 18. 为什么空字符串和None的评估方式不同?
- 19. Clojure:为什么=和.equals字符串有不同的表现?
- 20. 为什么不是类型(字符串)等于“<class 'str'>”?
- 21. 为什么MFC中有这么多的字符串类型?
- 22. 为什么Swift中的字符串,数组和字典更改为值类型
- 23. RDD [X:矢量[字符串]以RDD [X:矢量[字符串] +迭代器:矢量[字符串]
- 24. 什么是“双”字符串类型?
- 25. 为什么字符串联合类型不能与变量一起工作?
- 26. 从矢量<string>转换为非标量类型字符串
- 27. char *为什么不复制到矢量中但字符串被复制?
- 28. 张量数据类型为字符串?
- 29. 在matlab矢量中存在什么样的字符串?
- 30. 将矢量转换为字符串
是的,这是常识。其中一本Sutter/Alexandrescu C++书甚至有一章介绍它(以及重新设计std :: string类的练习)。 – riviera 2011-01-30 15:34:53