std::basic_string
| 
 在标头  
<string> 定义 | 
||
| 
 template< 
    class CharT,  | 
(1) | |
| 
 namespace pmr { 
template<  | 
(2) | (C++17 起) | 
类模板 basic_string 存储和处理字符式对象的序列,这种对象是满足平凡类型 (TrivialType) 和标准布局类型 (StandardLayoutType) 的非数组对象。该类既不依赖字符类型,也不依赖该类型上的原生操作。操作的定义通过 Traits 模板形参(std::char_traits 的特化或兼容的特征类)提供。
basic_string 的元素是连续存储的,即对于 basic_string s,对 [0, s.size()) 中的任意 n 有 &*(s.begin() + n) == &*s.begin() + n,或等价地,指向 s[0] 的指针能传递给期待指向 CharT 的空终止 (C++11 起)数组首元素指针的函数。
std::basic_string 满足知分配器容器 (AllocatorAwareContainer) (但不使用定制的 construct/destroy 构造/析构元素)、序列容器 (SequenceContainer) 及连续容器 (ContiguousContainer) (C++17 起)的要求。
如果 Traits::char_type 或者 Allocator::char_type 与 CharT 不同,那么程序非良构。
| 
 
 然而,  | 
(C++20 起) | 
提供数个对于常用字符类型的 typedef:
| 
 在标头  
<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::pmr::string (C++17) | std::pmr::basic_string<char> | 
| std::pmr::wstring (C++17) | std::pmr::basic_string<wchar_t> | 
| std::pmr::u8string (C++20) | std::pmr::basic_string<char8_t> | 
| std::pmr::u16string (C++17) | std::pmr::basic_string<char16_t> | 
| std::pmr::u32string (C++17) | std::pmr::basic_string<char32_t> | 
模板形参
| CharT | - | 字符类型 | 
| Traits | - | 指定字符类型上操作的特性类 | 
| Allocator | - | 用于分配内部存储的分配器 (Allocator) 类型 | 
成员类型
| 成员类型 | 定义 | ||||
traits_type | 
Traits | 
||||
value_type | 
CharT | 
||||
allocator_type | 
Allocator | 
||||
size_type | 
  | 
||||
difference_type | 
  | 
||||
reference | 
value_type& | ||||
const_reference | 
const value_type& | ||||
pointer | 
  | 
||||
const_pointer | 
  | 
||||
iterator | 
  | 
||||
const_iterator | 
  | 
||||
reverse_iterator | 
std::reverse_iterator<iterator> | ||||
const_reverse_iterator | 
std::reverse_iterator<const_iterator> | 
成员函数
构造 basic_string(公开成员函数)  | 
|
| 销毁字符串,若使用了内部存储则解分配之 (公开成员函数)  | 
|
| 为字符串赋值 (公开成员函数)  | 
|
| 赋值字符给字符串 (公开成员函数)  | 
|
| 
 (C++23) 
 | 
赋值范围内的字符到字符串 (公开成员函数)  | 
| 返回关联的分配器 (公开成员函数)  | 
|
元素访问 | 
|
| 访问指定字符,有边界检查 (公开成员函数)  | 
|
| 访问指定字符 (公开成员函数)  | 
|
| 
 (DR*) 
 | 
访问首字符 (公开成员函数)  | 
| 
 (DR*) 
 | 
访问最后的字符 (公开成员函数)  | 
| 返回指向字符串首字符的指针 (公开成员函数)  | 
|
| 返回字符串的不可修改的标准 C 字符数组版本 (公开成员函数)  | 
|
| 
 (C++17) 
 | 
返回到整个字符串的不可修改的 basic_string_view(公开成员函数)  | 
迭代器 | 
|
| 
 (C++11) 
 | 
返回指向起始的迭代器 (公开成员函数)  | 
| 
 (C++11) 
 | 
返回指向末尾的迭代器 (公开成员函数)  | 
| 
 (C++11) 
 | 
返回指向起始的逆向迭代器 (公开成员函数)  | 
| 
 (C++11) 
 | 
返回指向末尾的逆向迭代器 (公开成员函数)  | 
容量 | 
|
| 检查字符串是否为空 (公开成员函数)  | 
|
| 返回字符数 (公开成员函数)  | 
|
| 返回字符数的最大值 (公开成员函数)  | 
|
| 预留存储 (公开成员函数)  | 
|
| 返回当前对象分配的存储空间能保存的字符数量 (公开成员函数)  | 
|
| 通过释放不使用内存减少内存使用 (公开成员函数)  | 
|
修改器 | 
|
| 清除内容 (公开成员函数)  | 
|
| 插入字符 (公开成员函数)  | 
|
| 
 (C++23) 
 | 
插入范围内的字符 (公开成员函数)  | 
| 移除字符 (公开成员函数)  | 
|
| 后附字符到结尾 (公开成员函数)  | 
|
| 
 (DR*) 
 | 
移除末尾字符 (公开成员函数)  | 
| 后附字符到结尾 (公开成员函数)  | 
|
| 
 (C++23) 
 | 
后附范围内的字符到结尾 (公开成员函数)  | 
| 后附字符到结尾 (公开成员函数)  | 
|
| 替换字符串的指定部分 (公开成员函数)  | 
|
| 
 (C++23) 
 | 
以范围中的字符替换字符串的指定部分 (公开成员函数)  | 
| 复制字符 (公开成员函数)  | 
|
| 更改存储的字符数 (公开成员函数)  | 
|
| 
 (C++23) 
 | 
更改存储的字符数并可能经由用户提供的操作重写不确定的内容 (公开成员函数)  | 
| 交换内容 (公开成员函数)  | 
|
查找 | 
|
| 寻找给定子串的首次出现 (公开成员函数)  | 
|
| 寻找子串的最后一次出现 (公开成员函数)  | 
|
| 寻找字符的首次出现 (公开成员函数)  | 
|
| 寻找字符的首次缺失 (公开成员函数)  | 
|
| 寻找字符的最后一次出现 (公开成员函数)  | 
|
| 寻找字符的最后一次缺失 (公开成员函数)  | 
|
操作 | 
|
| 比较两个字符串 (公开成员函数)  | 
|
| 
 (C++20) 
 | 
检查字符串是否始于给定前缀 (公开成员函数)  | 
| 
 (C++20) 
 | 
检查字符串是否终于给定后缀 (公开成员函数)  | 
| 
 (C++23) 
 | 
检查字符串是否含有给定的子串或字符 (公开成员函数)  | 
| 返回子串 (公开成员函数)  | 
|
常量 | 
|
| 
 [静态] 
 | 
特殊值。确切含义依赖语境 (公开静态成员常量)  | 
非成员函数
| 连接两个字符串,一个字符串和一个 char,或者一个字符串和一个 string_view (函数模板)  | 
|
| 
 (C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20) 
 | 
以字典序比较两个字符串 (函数模板)  | 
| 特化 std::swap 算法 (函数模板)  | 
|
| 擦除所有满足特定判别标准的元素 (函数模板)  | 
|
输入/输出 | 
|
| 执行字符串的流输入与输出 (函数模板)  | 
|
| 从输入/输出流读取数据到字符串 (函数模板)  | 
|
数值转换 | 
|
| 
 (C++11)(C++11)(C++11) 
 | 
转换字符串为有符号整数 (函数)  | 
| 
 (C++11)(C++11) 
 | 
转换字符串为无符号整数 (函数)  | 
| 
 (C++11)(C++11)(C++11) 
 | 
转换字符串为浮点值 (函数)  | 
| 
 (C++11) 
 | 
转换整数或浮点值为 string(函数)  | 
| 
 (C++11) 
 | 
转换整数或浮点值为 wstring(函数)  | 
字面量
| 
 在内联命名空间  
std::literals::string_literals 定义 | 
|
| 
 (C++14) 
 | 
转换字符数组字面量为 basic_string(函数)  | 
辅助类
| 
 (C++11) 
 | 
字符串的散列支持 (类模板特化)  | 
推导指引 (C++17 起)
迭代器失效
指代 basic_string 元素的引用、指针和迭代器,可能会因任何接受非 const basic_string 的引用的标准库函数而失效,比如 std::getline、std::swap 或 operator>>,或因调用除了 operator[]、at、data、front、back、begin、rbegin、end 和 rend 之外的非 const 成员函数而失效。
注解
尽管在 C++23 前要求在构造或销毁 std::basic_string 的元素时使用定制的 construct 或 destroy,所有实现都使用默认机制。P1072R10 更正了该要求以匹配既存实践。
| 功能特性测试宏 | 值 | 标准 | 功能特性 | 
|---|---|---|---|
__cpp_lib_string_udls | 
201304L | (C++14) | 字符串类型的用户定义字面量 | 
__cpp_lib_starts_ends_with | 
201711L | (C++20) | starts_with 和 ends_with | 
__cpp_lib_constexpr_string | 
201907L | (C++20) | constexpr 的 std::basic_string | 
__cpp_lib_char8_t | 
201907L | (C++20) | std::u8string | 
__cpp_lib_erase_if | 
202002L | (C++20) | erase 和 erase_if | 
__cpp_lib_string_contains | 
202011L | (C++23) | contains | 
__cpp_lib_string_resize_and_overwrite | 
202110L | (C++23) | resize_and_overwrite | 
__cpp_lib_containers_ranges | 
202202L | (C++23) | 接受容器兼容范围的构造、插入、替换成员函数 | 
示例
#include <iostream> #include <string> int main() { using namespace std::literals; // 从 const char* 创建 string std::string str1 = "hello"; // 从字符串字面量创建 string auto str2 = "world"s; // 拼接 string std::string str3 = str1 + " " + str2; // 打印结果 std::cout << str3 << '\n'; std::string::size_type pos = str3.find(" "); str1 = str3.substr(pos + 1); // 空格后的部分 str2 = str3.substr(0, pos); // 空格前的部分 std::cout << str1 << ' ' << str2 << '\n'; // 用下标运算符 operator[] 访问元素 std::cout << str1[0] << '\n'; str1[0] = 'W'; std::cout << str1 << '\n'; }
输出:
hello world world hello w World
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 | 
|---|---|---|---|
| LWG 530 | C++98 | LWG259 意外的使得 basic_string 的元素存储的连续性不被要求 | 
再次要求 | 
| LWG 2994 (P1148R0)  | 
C++98 | Traits::char_type[1] 或 Allocator::char_type 与 CharT 不同时的行为未定义 | 
此时程序非良构 | 
参阅
| 
 (C++17) 
 | 
只读的字符串视图 (类模板)  | 
外部链接
| C++ string handling |