【发布时间】:2010-12-12 08:05:54
【问题描述】:
std::string 和 std::basic_string 有什么区别?为什么两者都需要?
【问题讨论】:
std::string 和 std::basic_string 有什么区别?为什么两者都需要?
【问题讨论】:
std::basic_string 是一个从字符类型生成字符串的类模板,std::string 是一个 typedef 用于 char 的该类模板的特化。
【讨论】:
std::string 是std::basic_string<T> 的实例化:
typedef std::basic_string<char> string
std::basic_string 必须为所有类型的字符串(例如wstring)提供类似的接口。
【讨论】:
string 是basic_string 的专业化。
namespace std { typedef basic_string<char> string; } 从技术上讲,它也不是真正的实例化,但它至少更接近(根据定义,实例化创建一个实例,而 typedef 只创建一个名称,不是实例)。
std::string 是 std::basic_string 模板的实例化,类型为 char。您需要两者,以便您可以制作除char 之外的字符串,例如std::basic_string<wchar_t> 用于一串宽字符。或者如果你想要一个包含 32 位元素的字符串,std::basic_string<unsigned int>。
【讨论】:
char 类型,您将不会实例化 std::basic_string。
只是对其他人回答的问题的一个小补充。由于std::string 是basic_string 的特化,它还默认除了char 类型之外的一些其他参数。basic_string 可以有自定义char 类型(例如basic_string 可以有wide_chars)、自定义char_trait(例如basic_string 可以有宽字符但支持普通字符的每个操作)和自定义分配器(basic_string 可以包含一些额外的信息,用于自定义调试器或静态内存管理)。
std::string 将所有这些参数默认为合理的值,因为在大多数情况下,您只需要std::string,这就是它的用处。另一方面,每当您需要更多定制的东西时,您都有std::basic_string。所以两者都有不同的目的
【讨论】: