std::basic_string

来自cppreference.com
< cpp‎ | string
 
 
 
std::basic_string
成员函数
元素访问
迭代器
容量
操作
搜索
常量
推导指引 (C++17)
非成员函数
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)
辅助类
 
在标头 <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 的特化或兼容特性类提供。Traits::char_typeCharT 必须指名同一类型;否则程序非良构。

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 起)的要求。

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

常量

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

非成员函数

连接两个字符串或者一个字符串和一个字符
(函数模板)
(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
(函数)

辅助类

string 的散列支持
(类模板特化)

推导指引(C++17 起)

注解

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

功能特性测试 标准 注释
__cpp_lib_string_udls 201304L (C++14) std::basic_string 的用户定义字面量
__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 未要求 basic_string 的元素存储的连续性 已要求

参阅

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