C++中的std::string是一个容器吗?

10
这可能对你们中的一些人来说是一个简单的问题。但我想知道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并不打算与字符以外的其他类型一起使用。

对于你来说,这可能是一个奇怪的问题。我需要了解这个的原因是,我正在开发一个框架,但我还不能确定“string”属于哪个类别。


严格来说,它并不是标准容器库的一部分。但是将其归为哪个类别取决于您想要用它做什么:在很多方面,字符串看起来非常像一个容器。 - juanchopanza
它不够通用,不能成为一个合适的容器。你无法从 struct Xfloat 制作一个字符串。 - Mats Petersson
标准库中有一个“容器”概念。这大概是我们在这个问题中可以使用的最好定义。 - BoBTFish
@MatsPetersson 为什么你不能创建一个 float 类型的字符串? - curiousguy
@curiousguy 我怀疑它不起作用,因为用于字符串的char_traits未定义为float类型。[这也很奇怪,你会如何处理介于A和B之间的字符?] - Mats Petersson
显示剩余2条评论
3个回答

12

是的,std::basic_string 模板符合 Container 理念 的所有要求。但我认为它对包含类型有更严格的要求。我正在试图挖掘出确切的内容。

(这不是 Bjarne 的概念。只是被标记为 "23.2.1 通用容器要求" 的部分标准。)


2
根据标准(2003、2011),std::basic_string 只能作为 POD 类型的容器。即基本类型或者是没有构造函数、析构函数或虚函数的简单结构体/类。但是 GNU stdlib 允许使用非 POD 类型与 std::basic_string 一起使用。这里 是一个使用 basic_string 和非 POD 类型的示例。
如果您想让您的示例正常工作,您需要定义运算符。
std::ostream& operator<<(::std::ostream& out, std::basic_string<int> &dat) 
{ 
    out << dat[0];
    return out; 
}

或者类似这样。

1

可以肯定地说,它不是一个容器,至少不是你通常认为的std容器。

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

但它确实有一些容器的分类,比如你可以把一些基本类型放进去,即使它们不是字符,而且也许最神奇的是,你可以得到一个迭代器,就像它是一个普通的容器一样。

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


在一些通常被认为是“容器”的东西中,你不能随意放置任何东西。例如,如果一个对象不是LessThanComparable,你可以将其放入std::vector中,但你无法将其放入std::set中。 - BoBTFish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接