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

时间:2013-06-23 09:58:19

标签: c++ containers stdstring

对于你们中的一些人来说,这可能是一个简单的问题。但我想知道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不适用于除字符之外的其他类型。

这对你来说可能是一个奇怪的问题。我需要知道这个的原因是因为我正在研究一个框架,而我仍然无法确定“字符串”会落在哪个类别中。

3 个答案:

答案 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容器的正常方式。

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

但是它确实有一些容器的分类,就像你可以将一些基本类型放入其中,即使它们不是字符,也许最令人惊奇的是你可以得到它的迭代器,就像它是一个普通的容器。

它是一个包含者吗?我会说是的但是!它不是一个普通的。