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
对任意
n
在区间
[
0
,
s.
size
(
)
)
内成立
,
且
*(s.begin() + s.size())
的值为
CharT
(
)
(空终止符)
(C++11 起)
;
或者等效地说,指向
s[
0
]
的指针可以传递给期望指向
数组首元素
(C++11 前)
空终止数组首元素
(C++11 起)
的函数,该数组元素类型为
CharT
。
std::basic_string
满足
AllocatorAwareContainer
的要求(但元素的构造/析构不使用自定义的
construct
/
destroy
方法)、
SequenceContainer
以及
ContiguousContainer
(C++17 起)
。
如果
Traits::char_type
和
Allocator::value_type
中有任何一个与
CharT
不同,则程序格式错误。
std::basic_string
的所有成员函数均为
constexpr
:可以在常量表达式的求值过程中创建和使用
std::basic_string
对象。
然而,
|
(自 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 > |
目录 |
模板参数
| 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 > |
数据成员
constexpr
size_type
npos
[static]
|
特殊值 size_type ( - 1 ) ,其具体含义取决于上下文 |
成员函数
构造
basic_string
(公开成员函数) |
|
|
销毁字符串,若使用了内部存储则释放其内存
(公开成员函数) |
|
|
为字符串赋值
(公开成员函数) |
|
|
为字符串分配字符
(公开成员函数) |
|
|
(C++23)
|
将字符范围赋值给字符串
(公开成员函数) |
|
返回关联的分配器
(公开成员函数) |
|
元素访问 |
|
|
访问指定字符(带边界检查)
(公开成员函数) |
|
|
访问指定字符
(公开成员函数) |
|
|
(
DR*
)
|
访问首字符
(公开成员函数) |
|
(
DR*
)
|
访问最后一个字符
(公开成员函数) |
|
返回指向字符串首字符的指针
(公开成员函数) |
|
|
返回字符串的不可修改标准C字符数组版本
(公开成员函数) |
|
|
(C++17)
|
返回整个字符串的不可修改
basic_string_view
视图
(公开成员函数) |
迭代器 |
|
|
(C++11)
|
返回指向起始位置的迭代器
(公开成员函数) |
|
(C++11)
|
返回指向末尾的迭代器
(公开成员函数) |
|
(C++11)
|
返回指向起始位置的反向迭代器
(公开成员函数) |
|
(C++11)
|
返回指向末尾的反向迭代器
(公开成员函数) |
容量 |
|
|
检查字符串是否为空
(公开成员函数) |
|
|
返回字符数量
(公开成员函数) |
|
|
返回最大字符数
(公开成员函数) |
|
|
预留存储空间
(公开成员函数) |
|
|
返回当前已分配存储空间可容纳的字符数量
(公开成员函数) |
|
|
(
DR*
)
|
通过释放未使用的内存来减少内存使用量
(公共成员函数) |
修饰符 |
|
|
清空内容
(公开成员函数) |
|
|
插入字符
(公开成员函数) |
|
|
(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
算法
(函数模板) |
|
|
擦除满足特定条件的所有元素
(函数模板) |
|
输入/输出 |
|
|
对字符串执行流输入和输出操作
(函数模板) |
|
|
从 I/O 流读取数据到字符串
(函数模板) |
|
数值转换 |
|
|
(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
元素的引用、指针和迭代器可能因以下操作而失效:任何接受非常量
basic_string
引用参数的标准库函数(例如
std::getline
、
std::swap
或
operator>>
),以及调用非常量成员函数(但以下成员函数除外:
operator[]
、
at
、
data
、
front
、
back
、
begin
、
rbegin
、
end
和
rend
)。
注释
尽管在 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) |
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* 创建字符串 std::string str1 = "hello"; // 使用字符串字面量创建字符串 auto str2 = "world"s; // 连接字符串 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'; // 使用下标运算符[]访问元素 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 2861 | C++98 |
value_type
为
Traits::char_type
|
改为
CharT
|
|
LWG 2994
( P1148R0 ) |
C++98 |
若
Traits::char_type
[1]
或
Allocator::char_type
与
CharT
不同则行为未定义
|
此情况下程序
为病式 |
另请参阅
|
(C++17)
|
只读字符串视图
(类模板) |
外部链接
| C++ 字符串处理 |