std::basic_string
 C++ 字符串库 std::basic_string
 在标头 定义
template<class CharT,class Traits = std::char_traits<CharT>,class Allocator = std::allocator<CharT>
> class basic_string;
(1)
namespace pmr {
template<class CharT,class Traits = std::char_traits<CharT>
> using basic_string =std::basic_string<CharT, Traits, std::pmr::polymorphic_allocator<CharT>>;}
(2) 
 类模板 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 不同,那么程序非良构。
std::basic_string 的成员函数是 constexpr 的:可以在常量表达式的求值中创建并使用 std::string 对象。
然而,std::string 对象通常不能是 constexpr 的,因为任何动态分配的存储都必须在同一常量表达式求值内释放。
提供数个对于常用字符类型的 typedef:
在标头 定义
 类型 定义
 std::string std::basic_string
 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
 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 - 用于分配内部存储的分配器类型
 成员类型
 成员类型 定义
 traits_type Traits
 value_type CharT
 allocator_type Allocator
 size_type 
 Allocator::size_type (C++11 前)
 std::allocator_traits::size_type (C++11 起)
difference_type 
 Allocator::difference_type (C++11 前)
 std::allocator_traits::difference_type (C++11 起)
reference value_type&
 const_reference const value_type&
 pointer 
 Allocator::pointer (C++11 前)
 std::allocator_traits::pointer (C++11 起)
const_pointer 
 Allocator::const_pointer (C++11 前)
 std::allocator_traits::const_pointer (C++11 起)
iterator 
 指向 value_type 的老式随机访问迭代器 (LegacyRandomAccessIterator) 及老式连续迭代器 (LegacyContiguousIterator)
指向 value_type 的老式随机访问迭代器 (LegacyRandomAccessIterator) 、contiguous_iterator 及常量表达式迭代器 (ConstexprIterator)
const_iterator 
 指向 const value_type 的老式随机访问迭代器 (LegacyRandomAccessIterator) 及老式连续迭代器 (LegacyContiguousIterator)
指向 const value_type 的老式随机访问迭代器 (LegacyRandomAccessIterator) 、contiguous_iterator 及常量表达式迭代器 (ConstexprIterator)
reverse_iterator std::reverse_iterator
 const_reverse_iterator std::reverse_iterator<const_iterator>
 成员函数
 (构造函数)
构造 basic_string
 (公开成员函数)
 (析构函数)
销毁字符串,在使用内部存储时解分配它
 (公开成员函数)
 operator=
为字符串赋值
 (公开成员函数)
 assign
赋值字符给字符串
 (公开成员函数)
 assign_range
赋值范围内的字符到字符串
 (公开成员函数)
 get_allocator
返回关联的分配器
 (公开成员函数)
 元素访问
 at
访问指定字符,有边界检查
 (公开成员函数)
 operator[]
访问指定字符
 (公开成员函数)
 front
访问首字符
 (公开成员函数)
 back
访问最后的字符
 (公开成员函数)
 data
返回指向字符串首字符的指针
 (公开成员函数)
 c_str
返回字符串的不可修改的 C 字符数组版本
 (公开成员函数)
 operator basic_string_view
返回到整个字符串的不可修改的 basic_string_view
 (公开成员函数)
 迭代器
 begin
 cbegin
返回指向起始的迭代器
 (公开成员函数)
 end
 cend
返回指向末尾的迭代器
 (公开成员函数)
 rbegin
 crbegin
返回指向起始的逆向迭代器
 (公开成员函数)
 rend
 crend
返回指向末尾的逆向迭代器
 (公开成员函数)
 容量
 empty
检查字符串是否为空
 (公开成员函数)
 size
 length
返回字符数
 (公开成员函数)
 max_size
返回字符数的最大值
 (公开成员函数)
 reserve
保留存储
 (公开成员函数)
 capacity
返回当前对象分配的存储空间能保存的字符数量
 (公开成员函数)
 shrink_to_fit
通过释放不使用内存减少内存使用
 (公开成员函数)
 操作
 clear
清除内容
 (公开成员函数)
 insert
插入字符
 (公开成员函数)
 insert_range
(C++23)
插入范围内的字符
 (公开成员函数)
 erase
移除字符
 (公开成员函数)
 push_back
后附字符到结尾
 (公开成员函数)
 pop_back
移除末尾字符
 (公开成员函数)
 append
后附字符到结尾
 (公开成员函数)
 append_range
后附范围内的字符到结尾
 (公开成员函数)
 operator+=
后附字符到结尾
 (公开成员函数)
 compare
比较二个字符串
 (公开成员函数)
 starts_with
检查字符串是否始于给定前缀
 (公开成员函数)
 ends_with
检查字符串是否终于给定后缀
 (公开成员函数)
 contains
检查字符串是否含有给定的子串或字符
 (公开成员函数)
 replace
替换字符串的指定部分
 (公开成员函数)
 replace_with_range
以范围中的字符替换字符串的指定部分
 (公开成员函数)
 substr
返回子串
 (公开成员函数)
 copy
复制字符
 (公开成员函数)
 resize
更改存储的字符数
 (公开成员函数)
 resize_and_overwrite
更改存储的字符数并可能经由用户提供的操作重写不确定的内容
 (公开成员函数)
 swap
交换内容
 (公开成员函数)
 查找
 find
于字符串中寻找字符
 (公开成员函数)
 rfind
寻找子串的最后一次出现
 (公开成员函数)
 find_first_of
寻找字符的首次出现
 (公开成员函数)
 find_first_not_of
寻找字符的首次缺失
 (公开成员函数)
 find_last_of
寻找字符的最后一次出现
 (公开成员函数)
 find_last_not_of
寻找字符的最后一次缺失
 (公开成员函数)
 常量npos[静态]
特殊值。准确含义依赖语境
 (公开静态成员常量)
 非成员函数
 operator+
连接两个字符串或者一个字符串和一个字符
 (函数模板)
 operator==
 operator!=
 operator<
 operator>
 operator<=
 operator>=
 operator<=>
以字典序比较两个字符串
 (函数模板)
 std::swap(std::basic_string)
特化 std::swap 算法
 (函数模板)
 erase(std::basic_string)
 erase_if(std::basic_string)
擦除所有满足特定判别标准的元素
 (函数模板)
 输入/输出
 operator<<
 operator>>
执行字符串的流输入与输出
 (函数模板)
 getline
从输入/输出流读取数据到字符串
 (函数模板)
 数值转换
 stoi
 stol
 stoll
转换字符串为有符号整数
 (函数)
 stoul
 stoull
转换字符串为无符号整数
 (函数)
 stof
 stod
 stold
转换字符串为浮点值
 (函数)
 to_string
转换整数或浮点值为 string
 (函数)
 to_wstring
转换整数或浮点值为 wstring
 (函数)
 字面量
 在内联命名空间 std::literals::string_literals 定义
 operator""s
(C++14)
转换字符数组字面量为 basic_string
 (函数)
 辅助类
 std::hashstd::string
 std::hashstd::u8string
 std::hashstd::u16string
 std::hashstd::u32string
 std::hashstd::wstring
 std::hashstd::pmr::string
 std::hashstd::pmr::u8string
 std::hashstd::pmr::u16string
 std::hashstd::pmr::u32string
 std::hashstd::pmr::wstring
string 的散列支持
 (类模板特化)
 推导指引(C++17 起)
 注解
 尽管在 C++23 前要求在构造或销毁 std::basic_string 的元素时使用定制的 construct 或 destroy,所有实现都使用默认机制。P1072R10 更正了该要求以匹配既存实现。
功能特性测试宏 值 标准 功能特性
 __cpp_lib_string_udls 201304L (C++14) std::basic_string 的用户定义字面量
 __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* 创建 stringstd::string str1 = "hello";// 从字符串字面量创建 stringauto str2 = "world"s;// 拼接 stringstd::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 不同时的行为未定义 此时程序非良构
 ↑ Traits::char_type 的情况已在 P1148R0 中解决。