Namespaces
Variants

std:: basic_string

From cppreference.net
std::basic_string
定义于头文件 <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) (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 对象。

然而, std::basic_string 对象通常不能是 constexpr 的,因为任何动态分配的存储必须在同一常量表达式求值期间释放。

(自 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
Allocator::size_type (C++11 前)
std:: allocator_traits < Allocator > :: size_type (C++11 起)
difference_type
Allocator :: difference_type (C++11 前)
std:: allocator_traits < Allocator > :: difference_type (C++11 起)
reference value_type &
const_reference const value_type &
pointer

Allocator::pointer

(C++11 前)

std:: allocator_traits < Allocator > :: pointer

(C++11 起)
const_pointer

Allocator::const_pointer

(C++11 前)

std:: allocator_traits < Allocator > :: const_pointer

(C++11 起)
iterator

遗留随机访问迭代器 遗留连续迭代器 指向 value_type

(C++20 前)

遗留随机访问迭代器 contiguous_iterator 常量表达式迭代器 指向 value_type

(C++20 起)
const_iterator

遗留随机访问迭代器 遗留连续迭代器 指向 const value_type

(C++20 前)

遗留随机访问迭代器 contiguous_iterator 常量表达式迭代器 指向 const value_type

(C++20 起)
reverse_iterator std:: reverse_iterator < iterator >
const_reverse_iterator std:: reverse_iterator < const_iterator >

数据成员

constexpr size_type npos [static] 特殊值 size_type ( - 1 ) ,其具体含义取决于上下文

成员函数

构造 basic_string
(公开成员函数)
销毁字符串,若使用了内部存储则释放其内存
(公开成员函数)
为字符串赋值
(公开成员函数)
为字符串分配字符
(公开成员函数)
将字符范围赋值给字符串
(公开成员函数)
返回关联的分配器
(公开成员函数)
元素访问
访问指定字符(带边界检查)
(公开成员函数)
访问指定字符
(公开成员函数)
( DR* )
访问首字符
(公开成员函数)
( DR* )
访问最后一个字符
(公开成员函数)
返回指向字符串首字符的指针
(公开成员函数)
返回字符串的不可修改标准C字符数组版本
(公开成员函数)
返回整个字符串的不可修改 basic_string_view 视图
(公开成员函数)
迭代器
返回指向起始位置的迭代器
(公开成员函数)
(C++11)
返回指向末尾的迭代器
(公开成员函数)
返回指向起始位置的反向迭代器
(公开成员函数)
(C++11)
返回指向末尾的反向迭代器
(公开成员函数)
容量
检查字符串是否为空
(公开成员函数)
返回字符数量
(公开成员函数)
返回最大字符数
(公开成员函数)
预留存储空间
(公开成员函数)
返回当前已分配存储空间可容纳的字符数量
(公开成员函数)
通过释放未使用的内存来减少内存使用量
(公共成员函数)
修饰符
清空内容
(公开成员函数)
插入字符
(公开成员函数)
插入一个字符范围
(公开成员函数)
移除字符
(公开成员函数)
在末尾追加一个字符
(公开成员函数)
( DR* )
移除末尾字符
(公开成员函数)
在末尾追加字符
(公开成员函数)
向末尾追加一个字符范围
(公开成员函数)
在末尾追加字符
(公开成员函数)
替换字符串的指定部分
(公开成员函数)
将字符串的指定部分替换为字符范围
(公开成员函数)
复制字符
(公开成员函数)
更改存储的字符数量
(公开成员函数)
更改存储的字符数量,并可能通过用户提供的操作覆写不确定内容
(公开成员函数)
交换内容
(公开成员函数)
搜索
查找给定子字符串的首次出现
(公开成员函数)
查找子字符串的最后一次出现
(公开成员函数)
查找字符首次出现位置
(公开成员函数)
查找首个不包含的字符
(公开成员函数)
查找字符的最后一次出现
(公开成员函数)
查找最后不包含的字符
(公开成员函数)
操作
比较两个字符串
(公开成员函数)
检查字符串是否以给定前缀开头
(公开成员函数)
(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
将字符数组字面量转换为 basic_string
(函数)

辅助类

字符串的哈希支持
(类模板特化)

推导指引 (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 不同则行为未定义
此情况下程序
为病式
  1. Traits::char_type 的情况已在 P1148R0 中修复。

另请参阅

只读字符串视图
(类模板)

外部链接

C++ 字符串处理