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 存储和处理字符式对象的序列,这种对象是满足平凡类型 (TrivialType) 标准布局类型 (StandardLayoutType) 的非数组对象。该类既不依赖字符类型,也不依赖该类型上的原生操作。操作的定义通过 Traits 模板形参(std::char_traits 的特化或兼容的特征类)提供。

basic_string 的元素是连续存储的,即对于 basic_string s,对 [0s.size()) 中的任意 n&*(s.begin() + n) == &*s.begin() + n,或等价地,指向 s[0] 的指针能传递给期待指向 CharT空终止 (C++11 起)数组首元素指针的函数。

std::basic_string 满足知分配器容器 (AllocatorAwareContainer) (但不使用定制的 construct/destroy 构造/析构元素)、序列容器 (SequenceContainer) 连续容器 (ContiguousContainer) (C++17 起)的要求。

如果 Traits::char_type 或者 Allocator::char_typeCharT 不同,那么程序非良构。

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

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

(C++20 起)

提供数个对于常用字符类型的 typedef:

在标头 <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老式随机访问迭代器 (LegacyRandomAccessIterator) 老式连续迭代器 (LegacyContiguousIterator)

(C++20 前)

指向 value_type老式随机访问迭代器 (LegacyRandomAccessIterator) contiguous_iterator常量表达式迭代器 (ConstexprIterator)

(C++20 起)
const_iterator

指向 const value_type老式随机访问迭代器 (LegacyRandomAccessIterator) 老式连续迭代器 (LegacyContiguousIterator)

(C++20 前)

指向 const value_type老式随机访问迭代器 (LegacyRandomAccessIterator) contiguous_iterator常量表达式迭代器 (ConstexprIterator)

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

成员函数

构造 basic_string
(公开成员函数)
销毁字符串,若使用了内部存储则解分配之
(公开成员函数)
为字符串赋值
(公开成员函数)
赋值字符给字符串
(公开成员函数)
赋值范围内的字符到字符串
(公开成员函数)
返回关联的分配器
(公开成员函数)
元素访问
访问指定字符,有边界检查
(公开成员函数)
访问指定字符
(公开成员函数)
(DR*)
访问首字符
(公开成员函数)
(DR*)
访问最后的字符
(公开成员函数)
返回指向字符串首字符的指针
(公开成员函数)
返回字符串的不可修改的标准 C 字符数组版本
(公开成员函数)
返回到整个字符串的不可修改的 basic_string_view
(公开成员函数)
迭代器
返回指向起始的迭代器
(公开成员函数)
(C++11)
返回指向末尾的迭代器
(公开成员函数)
返回指向起始的逆向迭代器
(公开成员函数)
返回指向末尾的逆向迭代器
(公开成员函数)
容量
检查字符串是否为空
(公开成员函数)
返回字符数
(公开成员函数)
返回字符数的最大值
(公开成员函数)
预留存储
(公开成员函数)
返回当前对象分配的存储空间能保存的字符数量
(公开成员函数)
通过释放不使用内存减少内存使用
(公开成员函数)
修改器
清除内容
(公开成员函数)
插入字符
(公开成员函数)
插入范围内的字符
(公开成员函数)
移除字符
(公开成员函数)
后附字符到结尾
(公开成员函数)
移除末尾字符
(公开成员函数)
后附字符到结尾
(公开成员函数)
后附范围内的字符到结尾
(公开成员函数)
后附字符到结尾
(公开成员函数)
替换字符串的指定部分
(公开成员函数)
以范围中的字符替换字符串的指定部分
(公开成员函数)
复制字符
(公开成员函数)
更改存储的字符数
(公开成员函数)
更改存储的字符数并可能经由用户提供的操作重写不确定的内容
(公开成员函数)
交换内容
(公开成员函数)
查找
寻找给定子串的首次出现
(公开成员函数)
寻找子串的最后一次出现
(公开成员函数)
寻找字符的首次出现
(公开成员函数)
寻找字符的首次缺失
(公开成员函数)
寻找字符的最后一次出现
(公开成员函数)
寻找字符的最后一次缺失
(公开成员函数)
操作
比较两个字符串
(公开成员函数)
检查字符串是否始于给定前缀
(公开成员函数)
(C++20)
检查字符串是否终于给定后缀
(公开成员函数)
(C++23)
检查字符串是否含有给定的子串或字符
(公开成员函数)
返回子串
(公开成员函数)

常量

[静态]
特殊值。确切含义依赖语境
(公开静态成员常量)

非成员函数

连接两个字符串,一个字符串和一个 char,或者一个字符串和一个 string_view
(函数模板)
(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20)
以字典序比较两个字符串
(函数模板)
特化 std::swap 算法
(函数模板)
擦除所有满足特定判别标准的元素
(函数模板)
输入/输出
执行字符串的流输入与输出
(函数模板)
从输入/输出流读取数据到字符串
(函数模板)
数值转换
(C++11)(C++11)(C++11)
转换字符串为有符号整数
(函数)
(C++11)(C++11)
转换字符串为无符号整数
(函数)
(C++11)(C++11)(C++11)
转换字符串为浮点值
(函数)
(C++11)
转换整数或浮点值为 string
(函数)
转换整数或浮点值为 wstring
(函数)

字面量

在内联命名空间 std::literals::string_literals 定义
转换字符数组字面量为 basic_string
(函数)

辅助类

字符串的散列支持
(类模板特化)

推导指引 (C++17 起)

迭代器失效

指代 basic_string 元素的引用、指针和迭代器,可能会因任何接受非 const basic_string 的引用的标准库函数而失效,比如 std::getlinestd::swapoperator>>,或因调用除了 operator[]atdatafrontbackbeginrbeginendrend 之外的非 const 成员函数而失效。

注解

尽管在 C++23 前要求在构造或销毁 std::basic_string 的元素时使用定制的 constructdestroy,所有实现都使用默认机制。P1072R10 更正了该要求以匹配既存实践。

功能特性测试 标准 功能特性
__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) constexpr 的 std::basic_string
__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) 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* 创建 string
    std::string str1 = "hello";
 
    // 从字符串字面量创建 string
    auto str2 = "world"s;
 
    // 拼接 string
    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';
 
    // 用下标运算符 operator[] 访问元素
    std::cout << str1[0] << '\n';
    str1[0] = 'W';
    std::cout << str1 << '\n';
}

输出:

hello world
world hello
w
World

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 530 C++98 LWG259 意外的使得 basic_string 的元素存储的连续性不被要求 再次要求
LWG 2994
(P1148R0)
C++98 Traits::char_type[1]Allocator::char_typeCharT 不同时的行为未定义 此时程序非良构
  1. Traits::char_type 的情况已在 P1148R0 中解决。

参阅

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

外部链接

C++ string handling