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



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

这对你来说可能是个奇怪的问题。我之所以需要知道这一点,是因为我正在研究一个框架,但我仍然无法确定"字符串"属于哪一类。

是的,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容器。

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

但它确实对容器进行了一些分类,比如你可以把一些基本类型放进去,即使它们不是字符,也许最令人惊讶的是,你可以把迭代器当作一个正常的容器。

那它是集装箱吗?我会答应的,但是!它不是一个通用的。

相关内容

  • 没有找到相关文章

最新更新