C++ 字符串库 std::basic_string

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

basic_string 是连续存储的,即对于 basic_string s,对任何 [​0​, s.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_type 与 CharT 不同,那么程序非良构。

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

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

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

在标头 定义
类型 定义
std::string std::basic_string
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
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 - 用于分配内部存储的分配器类型
成员类型
成员类型 定义
traits_type Traits
value_type CharT
allocator_type Allocator
size_type
Allocator::size_type (C++11 前)
std::allocator_traits::size_type (C++11 起)

difference_type
Allocator::difference_type (C++11 前)
std::allocator_traits::difference_type (C++11 起)

reference value_type&
const_reference const value_type&
pointer
Allocator::pointer (C++11 前)
std::allocator_traits::pointer (C++11 起)

const_pointer
Allocator::const_pointer (C++11 前)
std::allocator_traits::const_pointer (C++11 起)

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

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

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

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

reverse_iterator std::reverse_iterator
const_reverse_iterator std::reverse_iterator<const_iterator>
成员函数
(构造函数)

构造 basic_string
(公开成员函数)
(析构函数)

销毁字符串,在使用内部存储时解分配它
(公开成员函数)
operator=

为字符串赋值
(公开成员函数)
assign

赋值字符给字符串
(公开成员函数)
assign_range

赋值范围内的字符到字符串
(公开成员函数)
get_allocator

返回关联的分配器
(公开成员函数)
元素访问
at

访问指定字符,有边界检查
(公开成员函数)
operator[]

访问指定字符
(公开成员函数)
front

访问首字符
(公开成员函数)
back

访问最后的字符
(公开成员函数)
data

返回指向字符串首字符的指针
(公开成员函数)
c_str

返回字符串的不可修改的 C 字符数组版本
(公开成员函数)
operator basic_string_view

返回到整个字符串的不可修改的 basic_string_view
(公开成员函数)
迭代器
begin
cbegin

返回指向起始的迭代器
(公开成员函数)
end
cend

返回指向末尾的迭代器
(公开成员函数)
rbegin
crbegin

返回指向起始的逆向迭代器
(公开成员函数)
rend
crend

返回指向末尾的逆向迭代器
(公开成员函数)
容量
empty

检查字符串是否为空
(公开成员函数)
size
length

返回字符数
(公开成员函数)
max_size

返回字符数的最大值
(公开成员函数)
reserve

保留存储
(公开成员函数)
capacity

返回当前对象分配的存储空间能保存的字符数量
(公开成员函数)
shrink_to_fit

通过释放不使用内存减少内存使用
(公开成员函数)
操作
clear

清除内容
(公开成员函数)
insert

插入字符
(公开成员函数)
insert_range

(C++23)

插入范围内的字符
(公开成员函数)
erase

移除字符
(公开成员函数)
push_back

后附字符到结尾
(公开成员函数)
pop_back

移除末尾字符
(公开成员函数)
append

后附字符到结尾
(公开成员函数)
append_range

后附范围内的字符到结尾
(公开成员函数)
operator+=

后附字符到结尾
(公开成员函数)
compare

比较二个字符串
(公开成员函数)
starts_with

检查字符串是否始于给定前缀
(公开成员函数)
ends_with

检查字符串是否终于给定后缀
(公开成员函数)
contains

检查字符串是否含有给定的子串或字符
(公开成员函数)
replace

替换字符串的指定部分
(公开成员函数)
replace_with_range

以范围中的字符替换字符串的指定部分
(公开成员函数)
substr

返回子串
(公开成员函数)
copy

复制字符
(公开成员函数)
resize

更改存储的字符数
(公开成员函数)
resize_and_overwrite

更改存储的字符数并可能经由用户提供的操作重写不确定的内容
(公开成员函数)
swap

交换内容
(公开成员函数)
查找
find

于字符串中寻找字符
(公开成员函数)
rfind

寻找子串的最后一次出现
(公开成员函数)
find_first_of

寻找字符的首次出现
(公开成员函数)
find_first_not_of

寻找字符的首次缺失
(公开成员函数)
find_last_of

寻找字符的最后一次出现
(公开成员函数)
find_last_not_of

寻找字符的最后一次缺失
(公开成员函数)
常量npos[静态]

特殊值。准确含义依赖语境
(公开静态成员常量)
非成员函数
operator+

连接两个字符串或者一个字符串和一个字符
(函数模板)
operator==
operator!=
operator<
operator>
operator<=
operator>=
operator<=>

以字典序比较两个字符串
(函数模板)
std::swap(std::basic_string)

特化 std::swap 算法
(函数模板)
erase(std::basic_string)
erase_if(std::basic_string)

擦除所有满足特定判别标准的元素
(函数模板)
输入/输出
operator<<
operator>>

执行字符串的流输入与输出
(函数模板)
getline

从输入/输出流读取数据到字符串
(函数模板)
数值转换
stoi
stol
stoll

转换字符串为有符号整数
(函数)
stoul
stoull

转换字符串为无符号整数
(函数)
stof
stod
stold

转换字符串为浮点值
(函数)
to_string

转换整数或浮点值为 string
(函数)
to_wstring

转换整数或浮点值为 wstring
(函数)
字面量
在内联命名空间 std::literals::string_literals 定义
operator""s

(C++14)

转换字符数组字面量为 basic_string
(函数)
辅助类
std::hashstd::string
std::hashstd::u8string
std::hashstd::u16string
std::hashstd::u32string
std::hashstd::wstring
std::hashstd::pmr::string
std::hashstd::pmr::u8string
std::hashstd::pmr::u16string
std::hashstd::pmr::u32string
std::hashstd::pmr::wstring

string 的散列支持
(类模板特化)
推导指引(C++17 起)
注解
尽管在 C++23 前要求在构造或销毁 std::basic_string 的元素时使用定制的 construct 或 destroy,所有实现都使用默认机制。P1072R10 更正了该要求以匹配既存实现。

功能特性测试宏 值 标准 功能特性
__cpp_lib_string_udls 201304L (C++14) std::basic_string 的用户定义字面量
__cpp_lib_starts_ends_with 201711L (C++20) starts_with 和 ends_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) 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* 创建 stringstd::string str1 = "hello";// 从字符串字面量创建 stringauto str2 = "world"s;// 拼接 stringstd::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_type 与 CharT 不同时的行为未定义 此时程序非良构
↑ Traits::char_type 的情况已在 P1148R0 中解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【运维】如何恢复默认的~/.bashrc

可以通过使用系统默认的.bashrc文件来恢复它。以下是一些步骤&#xff0c;具体操作可能因系统而异&#xff1a; 使用默认.bashrc文件&#xff1a; 大多数Linux系统都会提供一个默认的.bashrc文件。您可以复制系统默认的文件到您的主目录。 cp /etc/skel/.bashrc ~/上述命令会将…

MySQL之数据库DML

文章目录 数据操作DML插入修改删除 数据操作DML 这里的数据操作就是增删改的更新操作&#xff0c;不包括查询 插入 insert into 表 (列名1,列名2,列名3...) values (值1,值2,值3...); //向表中插入对应列 insert into 表 values (值1,值2,值3...); //向表中插入所有列第…

python基础——进程

multiprocessing模块 与进程相关的模块 使用main进程创建子进程 from multiprocessing import Process import os def func():print("这是一个func函数&#xff0c;进程号为&#xff1a;{}&#xff0c;父进程号为&#xff1a;{}".format(os.getpid(),os.getppid(…

Web06--JavaScript基础02

1、JS流程控制语句 JS与Java一样&#xff0c;也有三个流程控制语句&#xff1a; 顺序结构 选择结构 循环结构 1.1 选择结构 1.1.1 if结构 <script type"text/javascript">if (条件表达式) {代码块;} else if(条件表达式){代码块;} else {代码块;} </scr…

kafka入门(九):kafka分区分配策略

kafka分区分配策略 参数&#xff1a; Kafka提供了消费者客户端参数partition.assignment.strategy来设置消费者与订阅主题之间的分区分配策略。 默认情况下&#xff0c;此参数的值为 org.apache.kafka.clients.consumer.RangeAssignor&#xff0c;即采用RangeAssignor分配策略。…

选择排序 | 冒泡排序 | C语言(详解)

一&#xff0c;选择排序 1&#xff0c;基本知识 对排序的双层 for 循环的理解&#xff1a;外层 控制趟数&#xff0c;里层 不断地对数组进行遍历。 2&#xff0c;逐层深入 经典的选择排序GIF动图&#xff0c;如下&#xff1a; 关键部分&#xff1a; Ⅰ&#xff0c;从数组中…

mathematical-expression 实现 数学表达式解析 Java 篇

mathematical-expression 实现 数学表达式解析 Java 篇 Java技术栏 使用 ME&#xff08; mathematical-expression&#xff09;数学表达式解析库 实现Java中 数学表达式 的解析和计算。 目录 文章目录 mathematical-expression 实现 数学表达式解析 Java 篇目录mathematical-…

面试知识点:notify是随机唤醒线程吗(唤醒线程顺序)?

做 Java 开发的小伙伴&#xff0c;对 wait 方法和 notify 方法应该都比较熟悉&#xff0c;这两个方法在线程通讯中使用的频率非常高&#xff0c;但对于 notify 方法的唤醒顺序&#xff0c;有很多小伙伴的理解都是错误的&#xff0c;有很多人会认为 notify 是随机唤醒的&#xf…

构建中国人自己的私人GPT—与文档对话

先看效果 他可以从上传的文件中提取内容作为答案。上传文件摄取速度 摄取速度取决于您正在摄取的文档数量以及每个文档的大小。为了加快摄取速度&#xff0c;您可以在配置中更改摄取模式。 存在以下摄取模式&#xff1a; simple&#xff1a;历史行为&#xff0c;一次按顺序摄…

超实用桌面助手!时间、日期、天气,一目了然!完全免费!

文章目录 &#x1f4d6; 介绍 &#x1f4d6;&#x1f3e1; 环境 &#x1f3e1;&#x1f4d2; 使用方法 &#x1f4d2;⚓️ 相关链接 ⚓️ &#x1f4d6; 介绍 &#x1f4d6; 这是一款我根据自己的需求写的一个桌面小工具&#xff0c;自己一直在用&#xff0c;现在分享给需要的朋…

sysbench在mysql中的使用

sysbench安装 [rootgip ~]# yum install epel-release -y [rootgip ~]# yum install sysbench -y 查看sysbench的版本&#xff1a; [rootgip ~]# sysbench --version sysbench 1.1.0-df89d34 基于sysbench构造测试表和测试数据 sysbench --db-drivermysql --time5 --threads10…

纯前端实现了Excel文件转JSON和JSON转Excel下载

需求前提&#xff1a; 上传Excel文件&#xff0c;并将Excel文件的内容拿出来转换为JSON本地定义JSON数据&#xff0c;然后将它封装后转换为Excel文件下载 安装依赖 这两个功能是借助xlsx包实现的&#xff0c;所以需要先安装xlsx包&#xff1a; npm install xlxs依赖引用 i…

【Android Gradle 插件】Gradle 基础配置 ④ ( Gradle Wrapper 配置作用 | Gradle 下载的依赖库存放位置 )

一、Gradle Wrapper 配置作用 gradle wrapperdistributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps\://services.gradle.org/distributions/gradle-6.7.1-bin.zip zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/distsGradle Wrapper 配…

【云原生】Docker的安装和镜像操作

目录 什么是Docker&#xff1f; 容器化越来越受欢迎&#xff0c;因为容器是&#xff1a; Docker与虚拟机的区别&#xff1a; 容器在内核中支持2种重要技术&#xff1a; Docker核心概念&#xff1a; 安装Docker 安装依赖包 设置阿里云镜像源 安装 Docker-CE并设置为开机…

C++设计模式之迭代器模式

【声明】本题目来源于卡码网&#xff08;https://kamacoder.com/&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 --什么是迭代器模式&#xff08;第19种设计模式&#xff09; 迭代器模式是⼀种行为设计模…

回顾一下容易被忽视golang基础的面试考察点

Golang里面 interface、指针、函数呢&#xff0c;是数据类型吗&#xff1f; 背景 string、int、bool、数组、切片 …等等&#xff0c;这些我们很快就会回答是数据类型&#xff0c;但 interface、指针、函数呢&#xff0c;是数据类型吗&#xff1f;这个时候我们可能就会有点犹豫…

simpleperf、Flame Graph使用简介

目录 背景 simpleperf简介 Simpleperf使用 将Simpleperf工具的可执行程序 push 到手机上 启动手机上的被测程序&#xff0c;ps 出该程序的进程ID 记录运行结果数据perf.data 报告结果数据&#xff1a;将data转为txt 将手机的文件pull到电脑指定路径 使用脚本report_ht…

nginx 解决tensorflow-serving 跨域代理问题

在nginx conf.d/目录下新建一个main.conf 配置该文件 进行代理 upstream rec{server 127.0.0.1:19356 ;keepalive 20000;}upstream rcv-module{server 10.0.2.198:8511 ;keepalive 20000;} server {listen 80;server_name **.**.com;#access_log /var/log/nginx/h…

docker-compose搭建redis集群

这里用docker-compose在一台机器搭建三主三从&#xff0c;生产环境肯定是在多台机器搭建&#xff0c;否则一旦这台宿主机挂了&#xff0c;redis集群全挂了&#xff0c;依然是单点故障。同时&#xff0c;受机器性能极限影响&#xff0c;其并发也上不去&#xff0c;算不上高并发。…

2024年深圳市软件产业高质量发展应用推广体系扶持计划人工智能软件应用示范项目申请指

​一、资助的项目类别 企业实施的通过应用人工智能软件对现有生产、服务和管理方式进行智能化升级&#xff0c;且技术水平先进、市场前景广阔、带动效应明显的人工智能软件应用示范项目。 二、设定依据 &#xff08;一&#xff09;《深圳市人民政府关于印发推动软件产业高质…