【问题标题】:C++ Is a std::string a container?C++ std::string 是一个容器吗?
【发布时间】:2013-06-23 09:58:18
【问题描述】:

对于你们中的一些人来说,这可能是一个简单的问题。但我想知道 std::string 是否是一个容器。容器是指容器,例如 std::vectorstd::liststd::deque

由于std::basic_string<> 接受整数字符以外的其他类型,但也正在通过使用字符数组进行优化。我不清楚它属于哪个类别。

这将编译:

#include <string>
#include <iostream>

int main() {
    std::basic_string<int> int_str;
    int_str.push_back(14);
    return 0;
}

但是通过添加这一行:

std::cout << int_str << std::endl;

不会的。因此,根据这些事实,我可以得出结论,std::basic_string 不适用于字符以外的其他类型。

这对你来说可能是一个奇怪的问题。我需要知道这一点的原因是因为我正在开发一个框架,但我仍然无法确定“字符串”将属于哪个类别。

【问题讨论】:

  • 严格来说,它不是标准容器库的一部分。但是把它放在哪个类别取决于你想用它做什么:在很多方面,一个字符串看起来很像一个容器。
  • 它不够通用,不能成为合适的容器。您不能从struct Xfloat 生成字符串。
  • 标准有一个Container 概念。这就是我们可以对这个问题使用的最佳定义。
  • @MatsPetersson 为什么你不能创建一个float 的字符串?
  • @curiousguy 我怀疑它是否有效,因为用于字符串的char_traits 没有为float 类型定义。 [也比较奇怪,你把A和B“之间”这个字符怎么办?]

标签: c++ containers stdstring


【解决方案1】:

是的,std::basic_string 模板满足Container concept 的所有要求。但是,我认为它对包含类型有更高的要求。只是想弄清楚到底是什么。

(这不是 Bjarne 的概念。只是标有“23.2.1 General container requirements”的标准部分。)

【讨论】:

    【解决方案2】:

    根据标准(2003,2011)std::basic_string 是仅用于 POD 类型的容器。 IE。没有构造函数、析构函数或虚函数的基本类型或普通结构/类。 但是 gnu stdlib 允许在 std::basic_string 中使用非 POD 类型。 Here 是使用 basic_string 和非 POD 类型的示例。

    如果你想让你的例子有效,你应该定义运算符

    std::ostream& operator<<(::std::ostream& out, std::basic_string<int> &dat) 
    { 
        out << dat[0];
        return out; 
    }
    

    或者类似的东西。

    【讨论】:

      【解决方案3】:

      好吧,可以肯定地说它不是一个容器,至少不是你认为的标准容器的正常方式。

      最简单的例子就是你不能放任何你想要的东西。

      但它确实对容器进行了一些分类,例如您可以将一些基本类型放入其中,即使它们不是字符,也许最令人惊奇的是您可以像它一样获得一个迭代器是一个普通的容器。

      那么它是一个容器吗?我会说是的,但是!它不是一个通用的。

      【讨论】:

      • 你不能在一些你通常认为是“容器”的东西中放入任何你想要的东西。例如,如果不是LessThanComparable,您可以将其放入std::vector,但您不能将其放入std::set
      猜你喜欢
      • 1970-01-01
      • 2012-07-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多