8

对于你们中的一些人来说,这可能是一个简单的问题。但我想知道 astd::string是否是一个容器。std::vector容器是指容器,例如std::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 不打算与字符以外的其他类型一起使用。

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

4

3 回答 3

11

是的,std::basic_string模板满足Container概念的所有要求。但是,我认为它对包含类型有更高的要求。只是想弄清楚到底是什么。

(这不是 Bjarne 的概念。只是标准中标有“ 23.2.1 General container requirements”的部分。)

于 2013-06-23T10:43:17.497 回答
2

According to standards(2003,2011) std::basic_string is a container only for POD types. I.e. fundamental types or plain structs/classes without constructors, destructors or virtual functions. But gnu stdlib allow use non-POD types with std::basic_string. Here is an example of working with basic_string and non-POD types.

And if you what to make your example works you should define operator

std::ostream& operator<<(::std::ostream& out, std::basic_string<int> &dat) 
{ 
    out << dat[0];
    return out; 
}

Or something like that.

于 2013-06-23T11:27:58.303 回答
1

好吧,可以肯定地说它不是一个容器,至少不是你想象的 std 容器的正常方式。

最简单的例子是你不能在里面放任何你想要的东西。

但它确实对容器进行了一些分类,例如您可以将一些基本类型放入其中,即使它们不是字符,也许最令人惊奇的是,您可以像普通类型一样获取它的迭代器容器。

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

于 2013-06-23T10:48:34.030 回答