对于你们中的一些人来说,这可能是一个简单的问题。但我想知道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不适用于除字符之外的其他类型。
这对你来说可能是一个奇怪的问题。我需要知道这个的原因是因为我正在研究一个框架,而我仍然无法确定“字符串”会落在哪个类别中。
答案 0 :(得分:9)
是的,std::basic_string
模板符合Container
concept的所有要求。但是,我认为它对所包含的类型有更强的要求。只是想弄清楚究竟是什么。
(这不是Bjarne的概念。标准中标注为“23.2.1 General container requirements
”。)
答案 1 :(得分:2)
根据标准(2003,2011),std :: basic_string是仅用于POD类型的容器。 即没有构造函数,析构函数或虚函数的基本类型或普通结构/类。 但是gnu stdlib允许将非POD类型与std :: basic_string一起使用。 Here是使用basic_string和非POD类型的示例。
如果您要使您的示例有效,您应该定义运算符
std::ostream& operator<<(::std::ostream& out, std::basic_string<int> &dat)
{
out << dat[0];
return out;
}
或类似的东西。
答案 2 :(得分:1)
可以肯定地说,它不是一个容器,至少不是你想象的std容器的正常方式。
最简单的例子就是你不能把任何你想要的东西放进去。
但是它确实有一些容器的分类,就像你可以将一些基本类型放入其中,即使它们不是字符,也许最令人惊奇的是你可以得到它的迭代器,就像它是一个普通的容器。
它是一个包含者吗?我会说是的但是!它不是一个普通的。