对你们中的一些人来说,这可能是一个简单的问题。但我想知道std::string
是否是一个容器。我所说的容器是指像std::vector
、std::list
和std::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不适用于字符以外的其他类型。
这对你来说可能是个奇怪的问题。我之所以需要知道这一点,是因为我正在研究一个框架,但我仍然无法确定"字符串"属于哪一类。
std::basic_string
模板满足了Container
概念的所有要求。但是,我认为它对包含的类型有更强的要求。只是想弄清楚到底是什么。
(这不是Bjarne的概念。只是《标准》中标记为"23.2.1 General container requirements
"的一部分。)
根据标准(20032011),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;
}
或者类似的东西。
可以肯定地说,它不是一个容器,至少不是你通常认为的std容器。
最简单的例子是你不能把任何你想要的东西放进去
但它确实对容器进行了一些分类,比如你可以把一些基本类型放进去,即使它们不是字符,也许最令人惊讶的是,你可以把迭代器当作一个正常的容器。
那它是集装箱吗?我会答应的,但是!它不是一个通用的。