【发布时间】:2011-01-27 01:31:34
【问题描述】:
它们都是可调整大小的数组,std::basic_string 没有任何特定的与字符相关的函数,如 upper()。字符串有什么特别之处可以更好地处理字符数据?
【问题讨论】:
它们都是可调整大小的数组,std::basic_string 没有任何特定的与字符相关的函数,如 upper()。字符串有什么特别之处可以更好地处理字符数据?
【问题讨论】:
大部分原因与本地化和国际化(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 中存在的向量实现。
【讨论】:
std::string 有很多 std::vector 没有的运算符:
诚然,std::string 几乎没有向量不具备或不具备向量的其他功能,但这些很重要,它们是字符串的大多数用例。
【讨论】:
字符串确实具有与字符串相关的特殊功能:c_str、substr、连接等。另外,不要忘记strings 自动将'\0' 添加到其数据末尾(并通过连接等正确处理)的重点,因此它们与vector<char> 或类似的东西。
但是,是的,它们非常相似。它们都持有指向堆分配数组的指针,但它们肯定不一样。
【讨论】:
vector<T> 支持 T* 的所有这些操作是没有意义的,因为 char* 恰好是一个具有非常特定含义的指针。
这是 STL 创建早期的设计决策。我想现在很多人都承认std::string的界面太臃肿了,和其他的STL不一致,但是改已经来不及了。
【讨论】: