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 用于存储和操作类字符对象序列,这些对象是 平凡类型 标准布局类型 的非数组对象。该类的定义既不依赖于字符类型,也不依赖于对该类型的操作性质。操作的具体定义通过 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 对象。

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

(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
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

LegacyRandomAccessIterator LegacyContiguousIterator 指向 value_type

(C++20 前)

LegacyRandomAccessIterator contiguous_iterator ConstexprIterator 指向 value_type

(C++20 起)
const_iterator

LegacyRandomAccessIterator LegacyContiguousIterator 指向 const value_type

(C++20 前)

LegacyRandomAccessIterator contiguous_iterator ConstexprIterator 指向 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 ) ,其具体含义取决于上下文

成员函数

</tr
构造 basic_string
(公开成员函数)
销毁字符串,若使用内部存储则释放内存
(公开成员函数)
为字符串赋值
(公开成员函数)
为字符串赋值字符
(公开成员函数)
为字符串赋值字符范围
(公开成员函数)
返回关联的分配器
(公开成员函数)
元素访问
访问指定字符,带边界检查
(公开成员函数)
访问指定字符
(公开成员函数)
( DR* )
访问首字符
(公开成员函数)
( DR* )
访问末字符
(公开成员函数)
返回指向字符串首字符的指针
(公开成员函数)
返回字符串的不可修改标准 C 字符数组版本
(公开成员函数)
返回整个字符串的不可修改 basic_string_view
(公开成员函数)
迭代器
返回指向起始位置的迭代器
(公开成员函数)
(C++11)
返回指向末尾的迭代器
(公开成员函数)
返回指向起始位置的反向迭代器
(公开成员函数)
(C++11)
返回指向末尾的反向迭代器
(公开成员函数)
容量
检查字符串是否为空
(公开成员函数)
返回字符数
(公开成员函数)
返回最大字符数
(公开成员函数)
预留存储空间
(公开成员函数)

非成员函数

连接两个字符串、字符串与 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++标准。

缺陷报告 适用标准 发布时行为 正确行为
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++ 字符串处理