字符串库
字符
在 C++ 标准库中,字符 是在按顺序处理时可以表示文本的对象。
此术语不限于字符类型的对象,也包括提供了字符串库和以下库中指定的定义的类型可以表示的任意值:
(C++11 起) |
在字符串库和正则表达式库 (C++11 起)中,字符只能具有字符式类型,即同时是POD 类型 (C++20 前)平凡标准布局类型的非数组类型 (C++20 起)。因此在在字符串库和正则表达式库 (C++11 起)中,字符也会以字符式对象 指代。
某些标准库组件接受字符容器类型。它们也用于表示单独的字符。这种类型被用作 std::char_traits 或者使用了 std::char_traits 的类模板的模板实参之一。
库组件
C++ 字符串库包含以下组件:
字符特征
许多与字符相关的类模板(例如 std::basic_string)需要一套相关的类型和函数以完成对它们语义的定义。这种模板所需的这些类型和函数会以它们的 Traits
模板形参中的一组成员 typedef 名和函数的形式提供。
能够完成那些语义的类是字符特征,它们需要满足字符特征 (CharTraits) 的要求。
字符串库提供了类模板 std::char_traits,它为 std::basic_string 和 std::basic_string_view (C++17 起)定义类型和函数。
标准定义下列特化,它们都满足字符特征 (CharTraits) 的要求:
在标头 <string> 定义
|
||
template<> class char_traits<char>; |
||
template<> class char_traits<wchar_t>; |
||
template<> class char_traits<char8_t>; |
(C++20 起) | |
template<> class char_traits<char16_t>; |
(C++11 起) | |
template<> class char_traits<char32_t>; |
(C++11 起) | |
当为 std::basic_string 和 std::basic_string_view (C++17 起)使用用户定义的字符容器类型时,也需要提供对应的字符特征类(它可以是 std::char_traits 的特化)。
字符串类(std::string 等)
类模板 std::basic_string 通用化字符序列如何操作及存储。字符串创建、操作及析构全部由一组便利的类方法与相关函数所处理。
标准提供 std::basic_string 对常用类型的数种特化:
在标头
<string> 定义 | |
类型 | 定义 |
std::string
|
std::basic_string<char> |
std::wstring
|
std::basic_string<wchar_t> |
std::u8string (C++20 起)
|
std::basic_string<char8_t> |
std::u16string (C++11 起)
|
std::basic_string<char16_t> |
std::u32string (C++11 起)
|
std::basic_string<char32_t> |
字符串视图类(std::string_view 等)类模板 std::basic_string_view 提供一个轻量对象,它使用的接口与 std::basic_string 的接口类似,提供对字符串一部分的只读访问。 标准提供 std::basic_string_view 对常用类型的数种特化:
|
(C++17 起) |
空终止序列工具
空终止字符序列(NTCTS)是以空字符(值初始化后的值)终止的字符序列。
字符串库提供创建、检查及修改这些序列的函数:
相关库
本地化库提供对字符串转换的支持(例如 std::wstring_convert 或 std::toupper),还有分类字符的函数(例如 std::isspace 或 std::isdigit)。
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 1170 | C++98 | 类字符类型可以是数组类型 | 已禁止 |