std:: basic_string
|
定义于头文件
<string>
|
||
|
template
<
class
CharT,
|
(1) | |
|
namespace
pmr
{
template
<
|
(2) | (C++17 起) |
类模板
basic_string
用于存储和操作类字符对象序列,这些对象是
平凡类型
和
标准布局类型
的非数组对象。该类的定义既不依赖于字符类型,也不依赖于对该类型的操作性质。操作的具体定义通过
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 起)
首元素的函数。
std::basic_string
满足
分配器感知容器
的要求(但元素的构造/析构不使用自定义的
construct
/
destroy
),
顺序容器
以及
连续容器
(C++17 起)
的要求。
如果
Traits::char_type
和
Allocator::value_type
中有任何一个与
CharT
不同,则程序是非良构的。
std::basic_string
的所有成员函数均为
constexpr
:可以在常量表达式的求值过程中创建和使用
std::basic_string
对象。
然而,
|
(since 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)
|
返回指向末尾的反向迭代器
(公开成员函数) |
容量 |
|
|
检查字符串是否为空
(公开成员函数) |
|
|
返回字符数
(公开成员函数) |
|
|
返回最大字符数
(公开成员函数) |
|
|
预留存储空间
(公开成员函数) |
</tr
|
非成员函数
|
连接两个字符串、字符串与
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++标准。
| 缺陷报告 | 适用标准 | 发布时行为 | 正确行为 |
|---|---|---|---|
| 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++ 字符串处理 |