【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都带过来。 这是因为当执行合并操作时,如果目标分支的提交历史是源分支的直接延续(即,目标分支…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...