【问题标题】:What's the difference between std::string and std::basic_string? And why are both needed?std::string 和 std::basic_string 有什么区别?为什么两者都需要?
【发布时间】:2010-12-12 08:05:54
【问题描述】:

std::stringstd::basic_string 有什么区别?为什么两者都需要?

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    std::basic_string 是一个从字符类型生成字符串的类模板,std::string 是一个 typedef 用于 char 的该类模板的特化。

    【讨论】:

    • 为什么两者都需要?
    • 所以你说 std::string 是 typedef std::basic_string std::string ?
    • @MuhammadAnnaqeeb 晚了 2.5 年,但简短的回答是提供宽字符串 (wstring)(Unicode,每个字符 2 个字节,wchar_t)支持。
    【解决方案2】:

    std::stringstd::basic_string<T> 的实例化:

    typedef std::basic_string<char> string
    

    std::basic_string 必须为所有类型的字符串(例如wstring)提供类似的接口。

    【讨论】:

    • 正确的术语是“专业化”。 stringbasic_string专业化
    • 我猜你可能会为此争论不休。 “专业化”通常用于表示继承。模板化的 {class|function} 通过替换模板参数来实例化。有部分模板特化,但这里没有使用。
    • 将派生类称为“专业化”是“专业化”的不太正式的用法。标准中根本没有这样使用“专业化”一词(我很确定),但它广泛用于描述模板专业化。模板特化的名称可用于不强制和隐式实例化的上下文中,因此特化和实例化是不同的概念。除了模板特化(具有特定参数集的模板的名称)外,还有部分特化(仅限类模板)和显式特化。
    • 在这里使用“专业化”会产生误导。模板特化具有特定含义(与继承无关),但这不是这里使用的。 std::string 只不过是一个 typedef,例如:namespace std { typedef basic_string&lt;char&gt; string; } 从技术上讲,它也不是真正的实例化,但它至少更接近(根据定义,实例化创建一个实例,而 typedef 只创建一个名称,不是实例)。
    • @Charles:这是误导,因为(使用模板),“专业化”通常指的是部分专业化或显式专业化,不是类型定义,最终将作为简单的实例化。
    【解决方案3】:

    std::stringstd::basic_string 模板的实例化,类型为 char。您需要两者,以便您可以制作除char 之外的字符串,例如std::basic_string&lt;wchar_t&gt; 用于一串宽字符。或者如果你想要一个包含 32 位元素的字符串,std::basic_string&lt;unsigned int&gt;

    【讨论】:

    • 我认为这应该是票数最高的答案。它提供了一个用例,如果没有 char 类型,您将不会实例化 std::basic_string
    • 我该怎么做 cout。它给出了错误。
    【解决方案4】:

    只是对其他人回答的问题的一个小补充。由于std::stringbasic_string 的特化,它还默认除了char 类型之外的一些其他参数。basic_string 可以有自定义char 类型(例如basic_string 可以有wide_chars)、自定义char_trait(例如basic_string 可以有宽字符但支持普通字符的每个操作)和自定义分配器(basic_string 可以包含一些额外的信息,用于自定义调试器或静态内存管理)。

    有用性

    std::string 将所有这些参数默认为合理的值,因为在大多数情况下,您只需要std::string,这就是它的用处。另一方面,每当您需要更多定制的东西时,您都有std::basic_string。所以两者都有不同的目的

    【讨论】:

      猜你喜欢
      • 2021-04-07
      • 2012-04-03
      • 2021-03-23
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      • 2014-07-22
      相关资源
      最近更新 更多