【问题标题】:std::string a containerstd::string 一个容器
【发布时间】:2009-11-24 13:31:54
【问题描述】:

std::string 是标准 c++ 库中的容器类,仅限于保存 char 元素吗?

【问题讨论】:

    标签: c++ containers


    【解决方案1】:

    实际上是std::basic_string<char> 的typedef。 std::basic_string 是专门为字符串操作设计的容器类。这个容器也可以用于宽字符(wchar_t);在这种情况下,它的 typedef 将是 wstring

    【讨论】:

      【解决方案2】:

      std::basic_string<> 是一个非常类似于序列容器的类。请注意,std::basic_string 可以包含 任何 POD 类型,而不仅仅是 charstd::string 是什么)或 wchar_t (std::wstring) 类型的元素。

      我相信basic_string 支持序列容器的所有操作。但是,请注意,根据定义,容器类型可以包含任何可分配和可复制构造的类型,而不仅仅是 POD 类型。所以basic_string 很像一个容器,但严格来说它不是一个容器。

      换句话说,有些类型可以与容器一起使用,而不能与basic_string 一起使用。但是对于那些可以与basic_string 一起使用的类型,std::basic_string 提供了序列容器的完整接口(我认为)以及附加功能。

      【讨论】:

      • 迈克尔,如果我错了,请纠正。您的回答似乎与这些陈述相矛盾。 - 注意 std::basic_string 可以包含任何 POD 类型,而不仅仅是 char 类型的元素。 - 有些类型可以与容器一起使用,但不能与 basic_string 一起使用。所以现在的问题是 std::basic_string 是否可以保存任何类型,原始类型或其他类型。如果是,那么只有 std::basic_string 表现得像一个真正的 STL 容器。
      • @Ankur - 我不确定你在问什么。 basic_string<> 不能容纳像 vector<> 这样的容器可以容纳的非 POD 类型。但对于 POD 类型(如普通结构),您可以使用 std::basic_string<mystruct_t>。老实说,我只是按照标准所说的进行 - 经过一些实验后,一些编译器(GCC 3.4.5 和 Comeau)将至少接受简单的非 POD 类型作为用于 @987654335 的类型@ 并且一些编译器不接受简单的聚合 POD 类型(Digital Mars,VC6)。 VC9 的行为似乎符合标准要求。
      • @迈克尔。好的,我想我现在明白了。顺便说一句,POD 类型是什么意思。是指原始数据类型(如int、char)还是更多?
      • @Anku:Plain Old Data - 表示简单类型的 C++98 概念。例如,POD 类型不能具有虚函数,并且可以安全地进行 memcpy 处理。
      【解决方案3】:

      std::string 作为 basic_string<char, std::char_traits<char>, std::allocator<char> > 的 typedef 几乎仅限于 char 类型。

      但是,我认为 basic_string 本身不一定仅限于字符类型(尽管顾名思义,它可能旨在用于字符串数据)。

      #include <string>
      #include <cassert>
      
      int main()
      {
          std::basic_string<int> numbers_1, numbers_2;
          numbers_1 += 1;
          numbers_2 += 2;
          std::basic_string<int> numbers_3 = numbers_1 + numbers_2 + 3;
          unsigned pos = numbers_3.find(10);
          assert(pos == std::basic_string<int>::npos);
      }
      

      【讨论】:

        【解决方案4】:

        std::string 是一个基本字符串。 它不一定是 char,但它必须遵循 char 特征 http://www.cplusplus.com/reference/string/char_traits/

        【讨论】:

        • 不,std::string 是一个std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;,绝对仅限于char
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        • 2012-02-22
        • 2017-01-26
        • 2021-10-30
        • 1970-01-01
        相关资源
        最近更新 更多