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,&*(s.begin() + n) == &*s.begin() + n 对于 [
0,
s.size())
中的任何 n,并且 *(s.begin() + s.size()) 的值为 CharT() (空终止符)(自 C++11 起);或者,等效地,指向 s[0] 的指针可以传递给期望指向 数组(直到 C++11)以 null 结尾的数组(自 C++11 起) 的第一个元素的指针的函数。
std::basic_string
满足 AllocatorAwareContainer(除了自定义的 construct
/destroy
不用于构造/销毁元素)、SequenceContainer 和 ContiguousContainer(自 C++17 起) 的要求。
如果 Traits::char_type
和 Allocator::char_type
中的任何一个不同于 CharT
,则程序是非法的。
但是, |
(自 C++20 起) |
提供了几个用于常见字符类型的类型定义
定义在头文件
<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> |
内容 |
[edit] 模板参数
CharT | - | 字符类型 |
Traits | - | 指定字符类型操作的特性类 |
Allocator | - | Allocator 用于分配内部存储的类型 |
[edit] 成员类型
成员类型 | 定义 | ||||
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> |
[edit] 成员函数
构造一个 basic_string (公有成员函数) | |
销毁字符串,如果使用则释放内部存储 (公有成员函数) | |
将值分配给字符串 (公有成员函数) | |
将字符分配给字符串 (公有成员函数) | |
(C++23) |
将一系列字符分配给字符串 (公有成员函数) |
返回关联的分配器 (公有成员函数) | |
元素访问 | |
访问指定字符,并进行边界检查 (公有成员函数) | |
访问指定字符 (公有成员函数) | |
(DR*) |
访问第一个字符 (公有成员函数) |
(DR*) |
访问最后一个字符 (公有成员函数) |
返回指向字符串第一个字符的指针 (公有成员函数) | |
返回字符串的不可修改的标准 C 字符数组版本 (公有成员函数) | |
(C++17) |
返回指向整个字符串的不可修改的 string_view (公有成员函数) |
迭代器 | |
(C++11) |
返回指向开头的迭代器 (公有成员函数) |
(C++11) |
返回指向结尾的迭代器 (公有成员函数) |
(C++11) |
返回指向开头的反向迭代器 (公有成员函数) |
(C++11) |
返回指向结尾的反向迭代器 (公有成员函数) |
容量 | |
检查字符串是否为空 (公有成员函数) | |
返回字符数量 (公有成员函数) | |
返回字符的最大数量 (公有成员函数) | |
返回字符串可以容纳的最大字符数 (公有成员函数) | |
预留存储空间 (公有成员函数) | |
(DR*) |
返回当前分配的存储空间中可以容纳的字符数 (公有成员函数) |
修饰符 | |
通过释放未使用的内存来减少内存使用量 (公有成员函数) | |
清空内容 (公有成员函数) | |
(C++23) |
插入字符 (公有成员函数) |
插入一系列字符 (公有成员函数) | |
删除字符 (公有成员函数) | |
(DR*) |
在末尾追加一个字符 (公有成员函数) |
删除最后一个字符 (公有成员函数) | |
(C++23) |
在末尾追加字符 (公有成员函数) |
删除最后一个字符 在末尾追加一系列字符 | |
operator+= 追加字符或字符串 | |
(C++23) |
replace 替换字符串中指定的段 |
replace_with_range 用一系列字符替换字符串中指定的段 | |
copy 复制字符 | |
(C++23) |
resize 更改存储的字符数量 |
resize_and_overwrite 更改存储的字符数量,并可能通过用户提供的操作覆盖不确定的内容 | |
搜索 | |
swap 交换内容 | |
find 查找给定子字符串的第一个出现位置 | |
rfind 查找子字符串的最后一个出现位置 | |
find_first_of 查找字符的第一个出现位置 | |
find_first_not_of 查找字符的第一个未出现位置 | |
find_last_of 查找字符的最后一个出现位置 | |
操作 | |
find_last_not_of 查找字符的最后一个未出现位置 | |
(C++20) |
compare 比较两个字符串 |
(C++20) |
starts_with 检查字符串是否以给定前缀开头 |
(C++23) |
ends_with 检查字符串是否以给定后缀结尾 |
contains 检查字符串是否包含给定的子字符串或字符 | |
常量 | |
substr |
返回子字符串 npos |
[静态]
特殊值。确切含义取决于上下文 (公有静态成员常量) | |
连接两个字符串、字符串和一个 char,或字符串和 string_view (函数模板) | |
按字典顺序比较两个字符串 (函数模板) | |
std::swap(std::basic_string) 专门化了 std::swap 算法 | |
(函数模板) | |
删除满足特定条件的所有元素 (函数模板) | |
输入/输出 对字符串执行流输入和输出 | |
数值转换 | |
(C++11)(C++11)(C++11) |
(函数模板) 从 I/O 流读取数据到字符串 |
(C++11)(C++11) |
(函数模板) 将字符串转换为带符号整数 |
(C++11)(C++11)(C++11) |
(函数) 将字符串转换为无符号整数 |
(C++11) |
(函数) 将字符串转换为浮点数 |
(C++11) |
(函数) 将整数或浮点数转换为 string |
(函数)
将整数或浮点数转换为
wstring | |
(C++14) |
(函数) [编辑] 字面量 |
定义在内联命名空间 std::literals::string_literals
中
(C++11) |
(函数) (类模板特化) |
[编辑] 推导指南 (自 C++17 起)
[编辑] 迭代器失效
引用、指针和指向 basic_string
元素的迭代器可能会被任何以非 const basic_string
引用作为参数的标准库函数(例如 std::getline、std::swap 或 operator>>)以及调用非 const 成员函数(除了 operator[]、at
、data
、front
、back
、begin
、rbegin
、end
和 rend
)失效。
[编辑] 注释
尽管在 C++23 之前,构建或销毁 std::basic_string
元素时需要使用自定义的 construct
或 destroy
,但所有实现都只使用默认机制。该要求已由 P1072R10 修正,以匹配现有实践。
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__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) | std::basic_string 的 constexpr |
__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) | (公有成员函数)
|
__cpp_lib_string_resize_and_overwrite |
202110L | (C++23) | (公有成员函数)
|
__cpp_lib_containers_ranges |
202202L | (C++23) | 用于构造、插入和替换的成员函数,这些函数接受 容器兼容范围 |
[编辑] 示例
#include <iostream> #include <string> int main() { using namespace std::literals; // Creating a string from const char* std::string str1 = "hello"; // Creating a string using string literal auto str2 = "world"s; // Concatenating strings std::string str3 = str1 + " " + str2; // Print out the result std::cout << str3 << '\n'; std::string::size_type pos = str3.find(" "); str1 = str3.substr(pos + 1); // the part after the space str2 = str3.substr(0, pos); // the part till the space std::cout << str1 << ' ' << str2 << '\n'; // Accessing an element using subscript operator[] std::cout << str1[0] << '\n'; str1[0] = 'W'; std::cout << str1 << '\n'; }
输出
hello world world hello w World
[编辑] 缺陷报告
以下行为变更缺陷报告已追溯应用于之前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 530 | C++98 | basic_string 元素存储的连续性被 LWG259 意外地取消了要求 |
再次需要 |
LWG 2994 (P1148R0) |
C++98 | 如果 Traits::char_type [1]和 Allocator::char_type 不同于 CharT ,则行为未定义 |
程序在此情况下 是非法的 |
[编辑] 另请参阅
(C++17) |
只读字符串视图 (类模板) |
[编辑] 外部链接
C++ 字符串处理 |