命名空间
变体
操作

std::basic_string

来自 cppreference.com
< cpp‎ | string
 
 
 
std::basic_string
成员函数
元素访问
迭代器
容量
修饰符
搜索
操作
常量
非成员函数
I/O
比较
(直到 C++20)(直到 C++20)(直到 C++20)(直到 C++20)(直到 C++20)(C++20)
数值转换
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
字面量
辅助类
推导指南 (C++17)

 
定义在头文件 <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 存储和操作 字符 类对象序列,这些对象是 TrivialTypeStandardLayoutType 的非数组对象。该类既不依赖于字符类型,也不依赖于该类型操作的性质。操作的定义通过 Traits 模板参数提供 - std::char_traits 的特化或兼容的特征类。

basic_string 的元素是连续存储的,也就是说,对于一个 basic_string s&*(s.begin() + n) == &*s.begin() + n 对于 [0s.size()) 中的任何 n,并且 *(s.begin() + s.size()) 的值为 CharT() (空终止符)(自 C++11 起);或者,等效地,指向 s[0] 的指针可以传递给期望指向 数组(直到 C++11)以 null 结尾的数组(自 C++11 起) 的第一个元素的指针的函数。

std::basic_string 满足 AllocatorAwareContainer(除了自定义的 construct/destroy 不用于构造/销毁元素)、SequenceContainerContiguousContainer(自 C++17 起) 的要求。

如果 Traits::char_typeAllocator::char_type 中的任何一个不同于 CharT,则程序是非法的。

std::basic_string 的成员函数是 constexpr:可以在常量表达式求值中创建和使用 std::string 对象。

但是,std::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>

内容

[edit] 模板参数

CharT - 字符类型
Traits - 指定字符类型操作的特性类
Allocator - Allocator 用于分配内部存储的类型

[edit] 成员类型

成员类型 定义
traits_type Traits
value_type CharT
allocator_type Allocator[edit]
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&[edit]
const_reference const value_type&[edit]
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

LegacyRandomAccessIteratorLegacyContiguousIteratorvalue_type

(直到 C++20)

LegacyRandomAccessIteratorcontiguous_iteratorConstexprIteratorvalue_type

(自 C++20 起)
[编辑]
const_iterator

LegacyRandomAccessIteratorLegacyContiguousIteratorconst value_type

(直到 C++20)

LegacyRandomAccessIteratorcontiguous_iteratorConstexprIteratorconst value_type

(自 C++20 起)
[编辑]
reverse_iterator std::reverse_iterator<iterator>[edit]
const_reverse_iterator std::reverse_iterator<const_iterator>[edit]

[edit] 成员函数

构造一个 basic_string
(公有成员函数) [edit]
销毁字符串,如果使用则释放内部存储
(公有成员函数) [edit]
将值分配给字符串
(公有成员函数) [edit]
将字符分配给字符串
(公有成员函数) [edit]
将一系列字符分配给字符串
(公有成员函数) [edit]
返回关联的分配器
(公有成员函数) [edit]
元素访问
访问指定字符,并进行边界检查
(公有成员函数) [edit]
访问指定字符
(公有成员函数) [edit]
(DR*)
访问第一个字符
(公有成员函数) [edit]
(DR*)
访问最后一个字符
(公有成员函数) [edit]
返回指向字符串第一个字符的指针
(公有成员函数) [edit]
返回字符串的不可修改的标准 C 字符数组版本
(公有成员函数) [edit]
返回指向整个字符串的不可修改的 string_view
(公有成员函数) [edit]
迭代器
返回指向开头的迭代器
(公有成员函数) [edit]
(C++11)
返回指向结尾的迭代器
(公有成员函数) [edit]
返回指向开头的反向迭代器
(公有成员函数) [edit]
(C++11)
返回指向结尾的反向迭代器
(公有成员函数) [edit]
容量
检查字符串是否为空
(公有成员函数) [edit]
返回字符数量
(公有成员函数) [edit]
返回字符的最大数量
(公有成员函数) [编辑]
返回字符串可以容纳的最大字符数
(公有成员函数) [编辑]
预留存储空间
(公有成员函数) [编辑]
返回当前分配的存储空间中可以容纳的字符数
(公有成员函数) [编辑]
修饰符
通过释放未使用的内存来减少内存使用量
(公有成员函数) [编辑]
清空内容
(公有成员函数) [编辑]
(C++23)
插入字符
(公有成员函数) [编辑]
插入一系列字符
(公有成员函数) [编辑]
删除字符
(公有成员函数) [编辑]
在末尾追加一个字符
(公有成员函数) [编辑]
删除最后一个字符
(公有成员函数) [编辑]
(C++23)
在末尾追加字符
(公有成员函数) [编辑]
删除最后一个字符
在末尾追加一系列字符
operator+=
追加字符或字符串
replace
替换字符串中指定的段
replace_with_range
用一系列字符替换字符串中指定的段
copy
复制字符
resize
更改存储的字符数量
resize_and_overwrite
更改存储的字符数量,并可能通过用户提供的操作覆盖不确定的内容
搜索
swap
交换内容
find
查找给定子字符串的第一个出现位置
rfind
查找子字符串的最后一个出现位置
find_first_of
查找字符的第一个出现位置
find_first_not_of
查找字符的第一个未出现位置
find_last_of
查找字符的最后一个出现位置
操作
find_last_not_of
查找字符的最后一个未出现位置
compare
比较两个字符串
starts_with
检查字符串是否以给定前缀开头
ends_with
检查字符串是否以给定后缀结尾
contains
检查字符串是否包含给定的子字符串或字符

常量

返回子字符串
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)
(函数) [编辑]
将字符串转换为浮点数
(函数) [编辑]
将整数或浮点数转换为 string

(函数) [编辑]

将整数或浮点数转换为 wstring
(函数) [编辑]
[编辑] 字面量

定义在内联命名空间 std::literals::string_literals

(函数) [编辑]
(类模板特化) [编辑]

[编辑] 推导指南 (自 C++17 起)

[编辑] 迭代器失效

引用、指针和指向 basic_string 元素的迭代器可能会被任何以非 const basic_string 引用作为参数的标准库函数(例如 std::getlinestd::swapoperator>>)以及调用非 const 成员函数(除了 operator[]atdatafrontbackbeginrbeginendrend)失效。

[编辑] 注释

尽管在 C++23 之前,构建或销毁 std::basic_string 元素时需要使用自定义的 constructdestroy,但所有实现都只使用默认机制。该要求已由 P1072R10 修正,以匹配现有实践。

特性测试 Std 特性
__cpp_lib_string_udls 201304L (C++14) 字符串类型用户自定义字面量
__cpp_lib_starts_ends_with 201711L (C++20) starts_withends_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) eraseerase_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,则行为未定义
程序在此情况下
是非法的
  1. Traits::char_type 的情况已在 P1148R0 中修复。

[编辑] 另请参阅

只读字符串视图
(类模板) [编辑]

[编辑] 外部链接

C++ 字符串处理