【C++】 string的了解及使用
标准库中的string类
在使用string类时,必须包含#include头文件以及using namespace std;
string类的常用接口说明
C++中string为我们提供了丰富的接口来供我们使用 – string接口文档
这里我们只介绍一些常见的接口
string类对象的常见构造
#include <iostream>
using namespace std;int main()
{
;cout << string() << endl;string s1("hello");cout << s1 << endl;string s2(5, 'x');cout << s2 << endl;string s3(s1);cout << s3 << endl;return 0;
}
string类对象的容量操作
1.size 和 length
在string类中我们通过size()和length()来返回字符串的有效字符的长度
int main()
{string s1("hello");cout << s1.size() << " " << s1.length();return 0;
}
2.max_size( )
max_size() 返回的是字符串的最大长度,不同位数系统字符串最大长度还不同,但一般字符串都开不了这么大的空间
32位系统:
int main()
{string s1("ssss");cout << s1.max_size() << endl;return 0;
}
capacity
capacity()返回的是字符串的空间大小,其和字符串的有效长度并不相同,及为字符串可容纳的最大长度,到了最大长度就会扩容
int main()
{string s1("ssss");cout << s1.size() << " " << s1.capacity();return 0;
}
reserve
reserve()当字符串容量不足时,reserve( )会对字符串进行扩容,及size == capacity时
vs和linux(g++)下字符串扩容和缩容机制
int main()
{string s;size_t sz = s.capacity();cout << "capacity:" << sz << endl;cout << "making s grow:" << endl;for (int i = 0; i < 100; i++){s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed:" << sz << endl;}}//在linux上g++和vs上的capacity都是不计算/0//如何扩容c++标准并没有规定return 0;
}
- VS扩容:
这里的capacity要比实际上的capacity要小1,因为在VS上capacity并没有将 ‘\0’ 计算进来
- 为什么初始字符串容量大小为15呢?
- VS中string的结构
string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义
string中字符串的存储空间:
当字符串长度小于16时,使用内部固定的字符数组来存放
当字符串长度大于等于16时,从堆上开辟空间
还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量
最后:还有一个指针做一些其他事情。
故总共占16+4+4+4=28个字节。
int main()
{string s;size_t sz = s.capacity();cout << "making s grow:" << endl;for (int i = 0; i < 100; i++){s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed:" << sz << endl;}}//在linux上g++和vs上的capacity都是不计算/0//如何扩容c++标准并没有规定return 0;
}
- Linux扩容
int main()
{string s("111111111111111");//string中有一个16个字节的buff数组cout << s.capacity() << endl;s.reserve(100);cout << s.capacity() << endl;s.reserve(20);cout << s.capacity() << endl;//vs不会缩容,而linuxg++会缩容return 0;
}
VS缩容:
VS下不会进行缩容
Linux缩容
resize( )
将有效字符的个数改成n个
int main()
{string s = "11111111";s.resize(5, '0');//不会进行缩容cout << s.capacity() << " " << s.size() << endl;s.resize(10, '0');cout << s.capacity() << " " << s.size() << endl;return 0;
}
int main()
{string s = "11111111";s.resize(5, '0');//不会进行缩容cout << s << endl;s.resize(10, '0');cout << s << endl;return 0;
}
- 当 resize中n > size ,则会对其进行插入补充字符C,如果没有参数C,就回默认补充字符 ‘\0’ ,
string迭代器
迭代器(Iterator)是一种设计模式,它提供了一种方法顺序访问一个集合对象中的各个元素,而无需暴露该对象的内部表示。
begin 和 end
begin指向字符串开始位置,end指向字符串最后一个字符的下一个位置
rbegin 和 rend
const 迭代器
int main()
{const string s2("1111111");string::const_iterator it = s2.begin();
}
string类对象的访问及遍历操作
对于string类的遍历,我们有几种方式来进行遍历:
- 调用at进行访问
int main()
{string s1("hello world");for (size_t i = 0; i < s1.size(); i++){cout << s1.at(i) << " ";}return 0;
}
at 与 下标加[ ] 进行访问的区别就是越界时 at可以捕获异常,而 [] 不可以捕获异常,直接就回报错
int main()
{string s("sssssss");try{//s[11];//越界,没有商量的余地s.at(11);//有商量的余地,可以捕获异常}catch (const exception& e){cout << e.what() << endl;}return 0;
}
int main()
{string s("sssssss");try{s[11];//越界,没有商量的余地}catch (const exception& e){cout << e.what() << endl;}return 0;
}
- 下标加 [] 进行访问遍历(及通过operator[ ]进行访问)
int main()
{string s1("hello world");for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}return 0;
}
- 范围for进行访问
int main()
{string s1("hello world");for (auto e : s1){cout << e << " ";}return 0;
}
- 迭代器进行访问
int main()
{string::iterator it = s1.begin();while (it != s1.end()){cout << *it << endl;it++;}return 0;
}
int main()
{string s1("hello world");string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){*rit = 'x';cout << *rit << " ";rit++;}const string s2("hello world");string::const_iterator it = s2.begin();while (it != s2.end()){cout << *it << " ";it++;}
}
string类对象的修改操作
push_back 和 append 和 operator+=
int main()
{string s1 = "hello world";s1.push_back('x');//在字符串后添加一个字符cout << s1 << endl;s1.append("xxxxx");//在字符串后添加一床字符cout << s1 << endl;s1 += "myself";//在字符串后添加字符串cout << s1 << endl;
}
下面是上面函数的其他函数重载
assign
int main()
{string s("12344512233");s.assign("111");cout << s << endl;
}
insert 和 erase
string s("122222");s.insert(s.begin(), 'y');cout << s << endl;s.insert(6,"xxxx");cout << s << endl;string s1("mmm");s.insert(s.begin(), s1.begin(), s1.end());cout << s << endl; //慎用,效率不高s.erase(1,3);cout << s << endl;s.erase(s.begin());cout << s << endl;s.erase(s.begin(), s.end());cout << s << endl;
replace
int main()
{string s("1111111");s.replace(2, 6, "s");cout << s << endl;
}
swap
int main()
{string s("1111111");string s1("sss");s.swap(s1);cout << s << " " << s1;
}
pop_back
int main()
{string s("1111111s");s.pop_back();cout << s;
}
string类对象的查找操作
int main()
{string str = "We think in generalities, but we live in details.";size_t pos = str.find("live"); cout << pos;return 0;
}
string类对象的一些其他操作(感兴趣的可以去了解)
相关文章:

【C++】 string的了解及使用
标准库中的string类 在使用string类时,必须包含#include头文件以及using namespace std; string类的常用接口说明 C中string为我们提供了丰富的接口来供我们使用 – string接口文档 这里我们只介绍一些常见的接口 string类对象的常见构造 #include <iostrea…...
【K8S】kubernetes-dashboard.yaml
https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.0-alpha0/charts/kubernetes-dashboard.yaml 以下链接的内容: 由于国内访问不了,找到一些方法下载了这个文件内容, 部署是mages 对象的镜像 WEB docker.io/kubernetesui/dash…...

远程root用户访问服务器中的MySQL8
一、Ubuntu下的MySQL8安装 在Ubuntu系统中安装MySQL 8.0可以通过以下步骤进行1. 更新包管理工具的仓库列表: sudo apt update 2. 安装MySQL 8.0,root用户默认没有密码: sudo apt install mysql-server sudo apt install mysql-client 【…...
解释一下 Java 中的静态变量(Static Variable)和静态方法(Static Method)?
今天来和大家深入探讨一下 Java 中的静态变量和静态方法,并通过一些具体的例子来理解它们在实际开发中的应用。 静态变量(Static Variable) 静态变量,也称为类变量,是在类的层次上共享的变量。这意味着无论创建了多少…...

【Linux】————磁盘与文件系统
作者主页: 作者主页 本篇博客专栏:Linux 创作时间 :2024年10月17日 一、磁盘的物理结构 磁盘的物理结构如图所示: 其中具体的物理存储结构如下: 磁盘中存储的基本单位为扇区,一个扇区的大小一般为512字…...

平衡控制——直立环——速度环
目录 平衡控制原理 平衡控制模型 平衡控制中基于模型设计与自动代码生成技术 速度环应用原理 速度控制模型 平衡控制原理 下图是一个单摆模型,对其进行受力分析如图。 在重力作用下,单摆受到和角度成正比,运动方向相反的回复力。而且在空气中运动的单摆,由于受…...
面试简要介绍hashMap
jdk8之前,hashmap采用的数据结构是数组链表,jdk8之后采用的数据结构是数组链表/红黑树。hashmap的数据以键值对的形式存在,如果两个元素的hash值相同,就会发生hash冲突,被放到同一个链表上--->如何解决hash冲突---&…...
HTTPS如何实现加密以及SSL/TSL加密的详细过程
通过将服务器从 HTTP 提升到 HTTPS 加密,数据在客户端和服务器之间的传输过程中的确得到了安全保护。以下是这种实现加密的机制以及客户端需要做的事情的详细说明。 为什么这样就实现了加密 SSL/TLS 协议: HTTPS 使用 SSL(安全套接层&#x…...

Golang | Leetcode Golang题解之第516题最长回文子序列
题目: 题解: func longestPalindromeSubseq(s string) int {n : len(s)dp : make([][]int, n)for i : range dp {dp[i] make([]int, n)}for i : n - 1; i > 0; i-- {dp[i][i] 1for j : i 1; j < n; j {if s[i] s[j] {dp[i][j] dp[i1][j-1] …...
(done) 什么 RPC 协议? remote procedure call 远程调用协议
来源:https://www.bilibili.com/video/BV1Qv4y127B4/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 可以理解为,调用远程服务器上的一个方法/函数/服务的方式,同时隐藏网络细节 一个 python3 …...
PCL 基于Ransac提取误匹配点对
目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 基于RANSAC的误匹配点对提出函数 2.1.2 点云可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、…...

光速写作 2.0.5 | 专注AI写作,海量素材库
光速写作是一款专为解决写作难题设计的应用。它具有以下功能:- 「AI写作」:帮助分析题目、整理写作思路,合成作文,写出好文章。- 「作文批改」:拍照上传作文后,进行全文点评和分句点评,并进行全…...
【已解决,含泪总结】非root权限在服务器上配置python和torch环境,代码最终成功训练(一)
配置Python环境 没有root权限服务器上有多个python环境但没有自己想要的怎么办 之前跑别的实验的时候改过指定的python3.7版本,但是居然我过了一段时间之后,再次打开,python版本居然又回到2.7(服务器/usr/下的默认python版本&am…...

公安基础知识-通哥
公安机关办理行政案件能力 考点一 治安案件追溯失效 6个月 派出所只有警告和500块以下罚款 公安是行政机关 1、治安小事、刑事案件大事 2、殴打他人-轻伤-(刑事案件)、轻微伤(治安案件) 3、《治安处罚法》《刑法》 4、只能构…...

Python画图|极坐标下的散点图动态输出
【1】引言 前序已经学习过散点图输出和极坐标图输出,文章链接包括但不限于下述部分: python画散点图|scatter()函数小试牛刀(入门级教程)_python ax.scatter-CSDN博客 python画图|极坐标中画散点图_极坐标上的散点图-CSDN博客 …...
揭开MySQL并发中的“死锁”之谜:从原理到解决方案的深度解析
目录 1. 环境准备:创建“账户”和“标记”表1.1 创建 dl_account_t 表1.2 创建 dl_mark_t 表 2. 死锁详解2.1 死锁情景一:相反加锁顺序导致的死锁2.2 死锁情景二:唯一索引冲突引发的死锁 3. 事务隔离级别与锁机制4. 预防与解决死锁的方法4.1 …...

【论文阅读】Reliable, Adaptable, and Attributable Language Models with Retrieval
文章目录 OverviewCurrent Retrieval-Augmented LMsArchitectureTraining Limitations & Future Work Overview Parametic language models的缺点: 事实性错误的普遍存在验证的难度(可溯源性差)难以在有顾虑的情况下排除某些序列适应调整…...

A-Frame负责人Diego Marcos分享WebXR与开源AI的未来
一、引言 在最近的一次播客访谈中,《虚拟现实之声》的主持人Kent Bye与A-Frame的创始人Diego Marcos展开了一场关于WebXR技术及其未来发展潜力的对话。Diego不仅是A-Frame的创始人,同时也是WebXR规范的原创者之一。本次访谈不仅回顾了WebXR的发展历程,还探讨了开源AI技术在…...

【STM32-HAL库】火焰传感器(STM32F407ZGT6)(附带工程下载链接)
一、TEMT6000光照强度传感器 火焰传感器是一种能够检测火焰的传感器,它通过检测空气中的特定波长的光线来检测火焰的存在,并输出一个信号来通知系统发生了火灾 工作原理 火焰传感器的工作原理基于光学检测技术。当火焰燃烧时,会产生一些特…...
git merge没有生成合并提交
有时候本地使用gitmerge命令的时候会发现,合并后的log里边并没有一次merge branch的log,而是把合并分支上的所有commit log都带过来。 这是因为当执行合并操作时,如果目标分支的提交历史是源分支的直接延续(即,目标分支…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...