【发布时间】:2009-11-24 13:31:54
【问题描述】:
std::string 是标准 c++ 库中的容器类,仅限于保存 char 元素吗?
【问题讨论】:
标签: c++ containers
std::string 是标准 c++ 库中的容器类,仅限于保存 char 元素吗?
【问题讨论】:
标签: c++ containers
实际上是std::basic_string<char> 的typedef。 std::basic_string 是专门为字符串操作设计的容器类。这个容器也可以用于宽字符(wchar_t);在这种情况下,它的 typedef 将是 wstring。
【讨论】:
std::basic_string<> 是一个非常类似于序列容器的类。请注意,std::basic_string 可以包含 任何 POD 类型,而不仅仅是 char(std::string 是什么)或 wchar_t (std::wstring) 类型的元素。
我相信basic_string 支持序列容器的所有操作。但是,请注意,根据定义,容器类型可以包含任何可分配和可复制构造的类型,而不仅仅是 POD 类型。所以basic_string 很像一个容器,但严格来说它不是一个容器。
换句话说,有些类型可以与容器一起使用,而不能与basic_string 一起使用。但是对于那些可以与basic_string 一起使用的类型,std::basic_string 提供了序列容器的完整接口(我认为)以及附加功能。
【讨论】:
basic_string<> 不能容纳像 vector<> 这样的容器可以容纳的非 POD 类型。但对于 POD 类型(如普通结构),您可以使用 std::basic_string<mystruct_t>。老实说,我只是按照标准所说的进行 - 经过一些实验后,一些编译器(GCC 3.4.5 和 Comeau)将至少接受简单的非 POD 类型作为用于 @987654335 的类型@ 并且一些编译器不接受简单的聚合 POD 类型(Digital Mars,VC6)。 VC9 的行为似乎符合标准要求。
std::string 作为 basic_string<char, std::char_traits<char>, std::allocator<char> > 的 typedef 几乎仅限于 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);
}
【讨论】:
std::string 是一个基本字符串。 它不一定是 char,但它必须遵循 char 特征 http://www.cplusplus.com/reference/string/char_traits/
【讨论】:
std::string 是一个std::basic_string<char, std::char_traits<char>, std::allocator<char> >,绝对仅限于char。