【问题标题】:Why are string and vector distinct types?为什么字符串和向量是不同的类型?
【发布时间】:2011-01-27 01:31:34
【问题描述】:

它们都是可调整大小的数组,std::basic_string 没有任何特定的与字符相关的函数,如 upper()。字符串有什么特别之处可以更好地处理字符数据?

【问题讨论】:

    标签: c++ string stl vector


    【解决方案1】:

    大部分原因与本地化和国际化(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 中存在的向量实现。

    【讨论】:

      【解决方案2】:

      std::string 有很多 std::vector 没有的运算符:

      • 运算符 +(将字符串 a 附加到字符串 b,+ 对向量没有意义)
      • 运算符 , ==, !=(字符串比较,有些对向量没有意义)
      • c_str()(返回“C 风格”表示)
      • 还有更多(包括子字符串、查找等,但其中一些在 STL 的其他地方实现,可用于向量等)

      诚然,std::string 几乎没有向量不具备或不具备向量的其他功能,但这些很重要,它们是字符串的大多数用例。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 我并不认为 substr 或 concatenation 是特定于字符串的。有些语言确实为任意数组提供了这些语言。不过,您对空终止是正确的:不幸的是,c_str() 是我在 std::string 上使用的最常见的函数。
        • @dan04:std::string 有大量的函数和重载,旨在使其与 C 风格的字符串(恰好是 C++ 中的字符串文字)协同工作。 vector<T> 支持 T* 的所有这些操作是没有意义的,因为 char* 恰好是一个具有非常特定含义的指针。
        【解决方案4】:

        这是 STL 创建早期的设计决策。我想现在很多人都承认std::string的界面太臃肿了,和其他的STL不一致,但是改已经来不及了。

        【讨论】:

        • 是的,这是常识。其中一本 Sutter/Alexandrescu C++ 书籍甚至有一章关于它(以及重新设计 std::string 类的练习)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 2019-11-21
        • 2017-04-17
        • 1970-01-01
        相关资源
        最近更新 更多