【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都带过来。 这是因为当执行合并操作时,如果目标分支的提交历史是源分支的直接延续(即,目标分支…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...


