std::string是一个容器。

4
std::string是标准C++库中的容器类吗?它是否只限于存储char元素?
4个回答

13

实际上,它是std::basic_string<char>的一个typedef。 std::basic_string是一个专门设计用于字符串操作的容器类。此容器也可以用于宽字符 (wchar_t) 的情况; 对于此情况,它的typedef将是wstring


5
一个std::basic_string<>是一个类,非常像一个序列容器。请注意,std::basic_string可以包含任何POD类型,而不仅仅是char类型(这是std::string的类型)或wchar_tstd::wstring的类型)。

我认为basic_string支持所有序列容器的操作。但是,请注意,按照定义,容器类型可以保存任何可赋值和可复制构造的类型,而不仅仅是POD类型。因此,basic_string非常像一个容器,但严格来说它不是一个容器。

换句话说,有些类型可以用于容器,但不能用于basic_string。但对于那些可以与basic_string一起使用的类型,std::basic_string提供了序列容器的完整接口(我想是这样),以及其他功能。


Michael,请纠正我如果我错了。你的回答似乎与这些陈述相矛盾。
  • 请注意,std::basic_string可以包含任何POD类型,而不仅仅是char类型的元素。
  • 有一些类型可以与容器一起使用,但不能与basic_string一起使用。 因此,现在的问题是std::basic_string是否可以容纳任何类型,无论是原始类型还是其他类型。如果是,那么std::basic_string才像一个真正的STL容器。
- Ankur
@Ankur - 我不太确定你的问题是什么。basic_string<>不能容纳非POD类型,而像vector<>这样的容器可以容纳。但对于POD类型(如普通结构体),您可以拥有std::basic_string<mystruct_t>。老实说,我只是按照标准所说的去做 - 经过一些实验后,一些编译器(GCC 3.4.5和Comeau)将至少接受简单的非POD类型作为用于basic_string<>的类型,而一些编译器则不会接受简单的聚合POD类型(Digital Mars,VC6)。 VC9的行为似乎符合标准。 - Michael Burr
@Michael。好的,我现在明白了。顺便问一下,POD类型是什么意思?它是指原始数据类型(如int、char)还是更多其他类型? - Ankur
1
@Anku:POD(Plain Old Data)是C++98中表示简单类型的概念。POD类型不能有虚函数,并且可以安全地进行memcpy操作。 - MSalters

4

basic_string<char, std::char_traits<char>, std::allocator<char> > 定义为 std::string,主要用于表示char类型的字符串。

然而,我认为 basic_string 本身并不一定只限于字符类型(尽管从名称上来看,它可能旨在用于字符串数据)。

#include <string>
#include <cassert>

int main()
{
    std::basic_string<int> numbers_1, numbers_2;
    numbers_1 += 1;
    numbers_2 += 2;
    std::basic_string<int> numbers_3 = numbers_1 + numbers_2 + 3;
    unsigned pos = numbers_3.find(10);
    assert(pos == std::basic_string<int>::npos);
}

3

不,std::string是一个std::basic_string<char, std::char_traits<char>, std::allocator<char>>,它严格限制为char - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接