C++中string类的使用
一.string类
1.1为什么学习string类?
1.2.标准库中的string类
string类的文档介绍
1. 字符串是表示字符序列的类2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。3. string 类是使用 char( 即作为它的字符类型,使用它的默认 char_traits 和分配器类型 ( 关于模板的更多信 息,请参阅basic_string) 。4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits 和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。5. 注意,这个类独立于所使用的编码来处理字节 : 如果用来处理多字节或变长字符 ( 如 UTF-8) 的序列,这个 类的所有成员( 如长度或大小 ) 以及它的迭代器,将仍然按照字节 ( 而不是实际编码的字符 ) 来操作。
1. string 是表示字符串的字符串类2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作 string 的常规操作。3. string 在底层实际是: basic_string 模板类的别名, typedef basic_string<char, char_traits, allocator> string;4. 不能操作多字节或者变长字符的序列。 在 使用string类时,必须包含#include头文件以及using namespace std;
二.string对象的元素访问
2.1.1使用operator[]与at实现访问
#include<iostream>
#include<string>
using namespace std;int main()
{string s("hello");//构造for (size_t i = 0; i < s.size(); i++)//读{cout << s[i] << " ";}cout << endl;for (size_t i = 0; i < s.size(); i++){cout << s.at(i) << " ";}cout << endl;for (size_t i = 0; i < s.size(); i++)//写,at同理{cout << s[i]+=1 << " ";}} operator[]与at的区别:
operator[]在元素越界访问时,采用断言,at采用抛出异常
2.1.2正向迭代器访问
#include<iostream>
#include<string>
using namespace std;int main()
{string s("hello C++");string::iterator it = s.begin();while (it != s.end())//读{cout << *it << " ";it++;}cout << endl;it = s.begin();while (it != s.end())//写{*it += 1;cout << *it << " ";}cout << endl;return 0;
} 2.1.3反向迭代器访问
#include<iostream>
#include<string>
using namespace std;int main()
{string s("hello C++");string::reverse_iterator it = s.rbegin();while (it != s.rend())//读{cout << *it << " ";it++;}cout << endl;it = s.rbegin();while (it != s.rend())//写{*it += 1;cout << *it << " ";}cout << endl;return 0;
} 2.1.4const正向迭代器(不能修改)
#include<iostream>
#include<string>
using namespace std;int main()
{string s("hello C++");string::const_iterator it = s.begin();while (it != s.end())//读{cout << *it << " ";it++;}cout << endl;return 0;
} 2.1.5const反向迭代器(不能修改)
#include<iostream>
#include<string>
using namespace std;int main()
{string s("hello C++");string::const_reverse_iterator it = s.rbegin();while (it != s.rend())//读{cout << *it << " ";it++;}cout << endl;return 0;
} 2.1.6范围for
#include<iostream>
#include<string>
using namespace std;int main()
{string s("hello C++");for(auto ch:s)//无法修改{cout<<ch<<" ";}for(auto& ch:s)//可以修改{ch+=1;cout<<ch<<" ";}return 0;
} 三.string类对象的常见构造
| string() 重点 | 无参构造函数 |
| string(const char* s) 重点 | 用字符串构造对象 |
| string(size_t n,char c) 重点 | 用n个字符构造对象 |
| string(const string& s) 重点 | 拷贝构造 |
| string(const string& str,size_t pos,size_t len=npos) | 用str从下标(包括)之后len长度的内容,构造对象 |
| string(const char* s,size_t n) | 用字符串前n个构造对象 |
| template <class InputIterator first,InputIterator last> string(InputIterator first,InputIterator last) | 迭代器区间构造对象 |
注:第四个构造方法,中的npos,是string类中的一个被static修是的,类型为size_t(无符号整形),值为-1
#include<iostream>
#include<string>
using namespace std;int main()
{string s1;//无参构造string s2("abcdefg");//用字符串构造对象string s3(5, 's');//string类对象中包含n个字符string s4(s2);//拷贝构造string s5(s2, 0, 3);//用str从下标(包括)之后len长度的内容,构造对象string s6("abcdefg", 3);//用字符串前n个构造对象string s7(s6.begin(), s6.end());//迭代器区间构造对象cout << "s1=" << s1 << endl;cout << "s2=" << s2 << endl;cout << "s3=" << s3 << endl;cout << "s4=" << s4 << endl;cout << "s5=" << s5 << endl;cout << "s6=" << s6 << endl;cout << "s7=" << s7 << endl;return 0;
} 三. string类对象的容量操作
| size (重点) | 返回字串有效字符长度 |
| length | 返回字符串有效长度 |
| capacity | 返回空间总大小 |
| empty (重点) | 检测字符串是否为空串,是返回true,否则返回false |
| clear (重点) | 清空有效字符 |
| reserve (重点) | 为字符串预留空间 |
| resize (重点) | 将有效字符个数改成n个,多出的空间用字符c填充 |
1.reverse(修改总容量)
#include<iostream>
#include<string>
using namespace std;int main()
{string s("hello C++");cout << s.size() << " " << s.capacity() << endl;s.reserve(100);cout << s.size() << " " << s.capacity() << endl;s.reserve(10);cout << s.size() << " " << s.capacity() << endl;return 0;
} reserve用于预开空间,如果开辟的空间小于原空间,并不会改变容量
#include<iostream>
#include<string>
using namespace std;int main()
{//resize(n)// resize(size_t n,char x)//分三种情况//1. n<size//2. n>size && n<=capacity//3. n>capacitystring s("hello world");s.resize(10);//cout << s.size() << " " << s.capacity() << " " << s<<endl;s.resize(17);//将size改为17,多出来的用'\0'填充cout << s.size() << " " << s.capacity() << " " << s<<endl;s.resize(40, 'x');//将size改为40,多出来的位置用'x'填充cout << s.size() << " " << s.capacity() << " " << s<<endl;return 0;
} resize用于调整size,当n大于容量是,会扩容,并用对于的字符填充。
当n>size && n< 容量时,用对应的字符填充多出来的
当n<size 时,会缩容放弃超过的空间。
1. size() 与 length() 方法底层实现原理完全相同,引入 size() 的原因是为了与其他容器的接口保持一致,一般情况下基本都是用 size() 。2. clear() 只是将 string 中有效字符清空,不改变底层空间大小。3. resize(size_t n) 与 resize(size_t n, char c) 都是将字符串中有效字符个数改变到 n 个,不同的是当字 符个数增多时:resize(n) 用 0 来填充多出的元素空间, resize(size_t n, char c) 用字符 c 来填充多出的 元素空间。注意:resize 在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大 小,如果是将元素个数减少,底层空间总大小不变。4. reserve(size_t res_arg=0) :为 string 预留空间,不改变有效元素个数,当 reserve 的参数小于 string的底层空间总大小时, reserver 不会改变容量大小。
四. string类对象的修改操作
| push_back | 在字符串后尾插字符c |
| append | 在字符串后追加一个字符串 |
| operator+= ( 重点) | 在字符串后追加字符串 str |
| c_str ( 重点 ) | 返回 C 格式字符串 |
| find + npos ( 重点 ) | 从字符串 pos 位置开始往后找字符 c ,返回该字符在字符串中的位置 |
| rfind | 从字符串 pos 位置开始往前找字符 c ,返回该字符在字符串中的位置 |
| substr | 在 str 中从 pos 位置开始,截取 n 个字符,然后将其返回 |
find
//从pos位置开始找,str
size_t find (const string& str, size_t pos = 0) const noexcept;//从pos位置开始找字符串第一次出现的下标,若不存在返回npos
size_t find (const char* s, size_t pos = 0) const;//从pos位置找字符串s的前n个第一次出现的下标,不存在返回npos
size_t find (const char* s, size_t pos, size_type n) const;size_t find (char c, size_t pos = 0) const noexcept; 通常finf与substr配合使用对找一个网址对应的协议,域名,地址
#include<iostream>
#include<string>
using namespace std;int main()
{
//string s3("https://legacy.cplusplus.com/reference/string/string/rfind/");string s3("ftp://www.baidu.com/?tn=65081411_1_oem_dg");// 协议// 域名// 资源名string sub1, sub2, sub3;size_t i1 = s3.find(':');if (i1 != string::npos)sub1 = s3.substr(0, i1);//查找协议elsecout << "没有找到i1" << endl;size_t i2 = s3.find('/', i1+3);if (i2 != string::npos)sub2 = s3.substr(i1+3, i2-(i1+3));//查找域名elsecout << "没有找到i2" << endl;sub3 = s3.substr(i2 + 1);//查找地址cout << sub1 << endl;cout << sub2 << endl;cout << sub3 << endl;
} 五.string类非成员函数
| operator+ | 尽量少用,因为传值返回,导致深拷贝效率低 |
| operator>> (重点) | 输入运算符重载 |
| operator<< (重点) | 输出运算符重载 |
| getline (重点) | 获取一行字符串 |
istream& getline(istream& in, string&str, char delim);//从流提取中提取字符串到str中,直到delim或'\n'istream& getline(istream& in,string& str, char);//从流提取中取字符串到str 六.将string对象int互相转换
6.1stoi 将string里第一次遇到的数字字符转换成int
6.2, to_string 将数字转化成string对象

相关文章:
C++中string类的使用
一.string类 1.1为什么学习string类? C 语言中,字符串是以 \0 结尾的一些字符的集合,为了操作方便, C 标准库中提供了一些 str 系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP 的思想&#x…...
LeeCode每日刷题12.8
搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: …...
硕士毕业论文格式修改要点_word
目录 0、最开始要做的事情1、更改样式(先善器)2、多级标题(解决自动更新问题必要的基础设置)2、插入图片(1)设置一个图片样式——“无间隔”(2)插入题注(3)修…...
远红外温和护理,一贴缓解痛风不适
在冬天,很多人都会因为痛风等原因引起的关节炎症而感到不适,因为关节疼痛、肢体麻木等问题会对生活质量造成很大的影响。市场上缓解关节酸痛的护理品很多,常见的应该还是关节贴,我现在用的就是何浩明关节痛风贴。 相比于同类产品&…...
优化 SQL 日志记录的方法
为什么 SQL 日志记录是必不可少的 SQL 日志记录在数据库安全和审计中起着至关重要的作用,它涉及跟踪在数据库上执行的所有 SQL 语句,从而实现审计、故障排除和取证分析。SQL 日志记录可以提供有关数据库如何访问和使用的宝贵见解,使其成为确…...
Java设计模式-工厂模式
目录 一、简单工厂模式 (一)需求 (二)使用传统的方法来完成 (三)传统方法的优缺点 (四)基本介绍 (五)使用简单工厂模式 二、工厂方法模式 ࿰…...
每天五分钟计算机视觉:稠密连接网络(DenseNet)
本文重点 在前面的课程中我们学习了残差网络ResNet,而DenseNet可以看成是ResNet的后续,我们看一下图就可以看出二者的主要区别了。 特点 DenseNet是一种卷积神经网络,它的特点是每一层都直接连接到所有后续层。这意味着,每一层都接收来自前一层的输出,并将其作为输入传递…...
mysql支持的整数类型、各类型整数能够表示的数值范围
MySQL :: MySQL 8.2 Reference Manual :: 11.1.2 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT mysql支持的整数有:TINYINT、SMALLINT、MEDIUMINT、INT(INT和INTEGER是同义词)、BIGINT,各…...
我不是DBA之慢SQL诊断方式
最近经常遇到技术开发跑来问我慢SQL优化相关工作,所以干脆出几篇SQL相关优化技术月报,我这里就以公司mysql一致的5.7版本来说明下。 在企业中慢SQL问题进场会遇到,尤其像我们这种ERP行业。 成熟的公司企业都会有晚上的慢SQL监控和预警机制。…...
JavaScript基础知识整理(最全知识点, 精简版,0基础版)
文章目录 一、输入和输出内容 1.1 输出 1.1.1 在浏览器的控制台输出打印 1.1.2 直接在浏览器的页面上输出内容 1.1.3 页面弹出警告对话框 1.2 输入 二、变量 2.1 变量是什么 2.2 变量的声明和赋值 2.3 变量的命名规范和规范 三、变量扩展(数组) 3.1 数组…...
人工智能和网络安全:坏与好
人工智能似乎可以并且已经被用来帮助网络犯罪和网络攻击的各个方面。 人工智能可以用来令人信服地模仿真人的声音。人工智能工具可以帮助诈骗者制作更好、语法正确的网络钓鱼消息(而糟糕的语法往往会暴露出漏洞),并将其翻译成多种语言&…...
基于SSH的java记账管理系统
基于SSH的java记账管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型:Java EE项目 项目名称:基于SSH的记账管理系统 项目架构:B/S架构 开发语言:Java语言 前端技术:HTML、CS…...
github可访问但无法clone问题
github可访问但无法clone问题 重置 http.proxy 重置 http.proxy git config --global http.proxy http://127.0.0.1:1080 git config --global https.proxy https://127.0.0.1:1080 git config --global --unset http.proxy git config --global --unset https.proxy...
WebGL笔记:图形缩放的原理和实现
缩放 1 )原理 缩放可以理解为对向量长度的改变,或者对向量坐标分量的同步缩放 如下图,比如让向量OA 收缩到点B的位置,也就是从OA变成OB,缩放了一半 2 )公式 已知 点A的位置是(ax,ay,az)点A基于原点內缩了…...
前端学习--React(5)
一、useReducer 管理相对复杂的状态数据 定义一个reducer函数,根据action值的不同返回不同的状态 在组件中调用useReducer并传入reducer函数和状态的初始值 事件发生时,通过dispatch函数分派一个对象,即通知reducer具体返回哪个状态对应的操…...
【数据结构】平衡树引入
数据结构-平衡树 前置知识 二叉树二叉树的中序遍历 问题 维护一个数据结构,支持插入元素、删除元素、查询元素的排名、查询排名对应的元素、查询元素的前驱、查询元素的后继等。 BST(二叉搜索树) 作为一个基本无效(很容易卡掉…...
机器视觉相机镜头光源选型
镜头选型工具 - HiTools - 海康威视 Hikvisionhttps://www.hikvision.com/cn/support/tools/hitools/cl8a9de13648c56d7f/ 海康机器人-机器视觉产品页杭州海康机器人股份有限公司海康机器人HIKROBOT是面向全球的机器视觉和移动机器人产品及解决方案提供商,业务聚焦于…...
Appium:iOS测试比Android测试更难?
iOS测试与Android测试: Appium 是一个开源的自动化测试框架,用于iOS、Android和Web应用程序。它允许开发者使用自己的语言来编写测试脚本,并且可以运行在多种平台上。 就Appium本身而言,它为iOS和Android提供了相似的测试能力和…...
使用c#罗列、监视、控制进程
个人简介:本人多年从事研发和测试领域工作,有一定的经验; 口号:懒人推动科技进步,学习编程啊脚本啊目的就是要将人从做相同的工作脱离出来,手懒可以但是脑子不能懒,让重复的事情自动完成,能动一下就完成任务就不能动两下,懒到极致才是目标! 方向:本人不怎么将理论的…...
Vue:绘制图例
本文记录使用Vue框架绘制图例的代码片段。 可以嵌入到cesium视图中,也可以直接绘制到自己的原生系统中。 一、绘制图例Vue组件 <div v-for="(color, index) in colors" :key="index" class="legend-item"><div class="color-…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
