当前位置: 首页 > news >正文

【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类时&#xff0c;必须包含#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 以下链接的内容&#xff1a; 由于国内访问不了&#xff0c;找到一些方法下载了这个文件内容&#xff0c; 部署是mages 对象的镜像 WEB docker.io/kubernetesui/dash…...

远程root用户访问服务器中的MySQL8

一、Ubuntu下的MySQL8安装 在Ubuntu系统中安装MySQL 8.0可以通过以下步骤进行1. 更新包管理工具的仓库列表&#xff1a; sudo apt update 2. 安装MySQL 8.0&#xff0c;root用户默认没有密码&#xff1a; sudo apt install mysql-server sudo apt install mysql-client 【…...

解释一下 Java 中的静态变量(Static Variable)和静态方法(Static Method)?

今天来和大家深入探讨一下 Java 中的静态变量和静态方法&#xff0c;并通过一些具体的例子来理解它们在实际开发中的应用。 静态变量&#xff08;Static Variable&#xff09; 静态变量&#xff0c;也称为类变量&#xff0c;是在类的层次上共享的变量。这意味着无论创建了多少…...

【Linux】————磁盘与文件系统

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2024年10月17日 一、磁盘的物理结构 磁盘的物理结构如图所示&#xff1a; 其中具体的物理存储结构如下&#xff1a; 磁盘中存储的基本单位为扇区&#xff0c;一个扇区的大小一般为512字…...

平衡控制——直立环——速度环

目录 平衡控制原理 平衡控制模型 平衡控制中基于模型设计与自动代码生成技术 速度环应用原理 速度控制模型 平衡控制原理 下图是一个单摆模型&#xff0c;对其进行受力分析如图。 在重力作用下,单摆受到和角度成正比,运动方向相反的回复力。而且在空气中运动的单摆,由于受…...

面试简要介绍hashMap

jdk8之前&#xff0c;hashmap采用的数据结构是数组链表&#xff0c;jdk8之后采用的数据结构是数组链表/红黑树。hashmap的数据以键值对的形式存在&#xff0c;如果两个元素的hash值相同&#xff0c;就会发生hash冲突&#xff0c;被放到同一个链表上--->如何解决hash冲突---&…...

HTTPS如何实现加密以及SSL/TSL加密的详细过程

通过将服务器从 HTTP 提升到 HTTPS 加密&#xff0c;数据在客户端和服务器之间的传输过程中的确得到了安全保护。以下是这种实现加密的机制以及客户端需要做的事情的详细说明。 为什么这样就实现了加密 SSL/TLS 协议&#xff1a; HTTPS 使用 SSL&#xff08;安全套接层&#x…...

Golang | Leetcode Golang题解之第516题最长回文子序列

题目&#xff1a; 题解&#xff1a; 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 远程调用协议

来源&#xff1a;https://www.bilibili.com/video/BV1Qv4y127B4/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 可以理解为&#xff0c;调用远程服务器上的一个方法/函数/服务的方式&#xff0c;同时隐藏网络细节 一个 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写作,海量素材库

光速写作是一款专为解决写作难题设计的应用。它具有以下功能&#xff1a;- 「AI写作」&#xff1a;帮助分析题目、整理写作思路&#xff0c;合成作文&#xff0c;写出好文章。- 「作文批改」&#xff1a;拍照上传作文后&#xff0c;进行全文点评和分句点评&#xff0c;并进行全…...

【已解决,含泪总结】非root权限在服务器上配置python和torch环境,代码最终成功训练(一)

配置Python环境 没有root权限服务器上有多个python环境但没有自己想要的怎么办 之前跑别的实验的时候改过指定的python3.7版本&#xff0c;但是居然我过了一段时间之后&#xff0c;再次打开&#xff0c;python版本居然又回到2.7&#xff08;服务器/usr/下的默认python版本&am…...

公安基础知识-通哥

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

Python画图|极坐标下的散点图动态输出

【1】引言 前序已经学习过散点图输出和极坐标图输出&#xff0c;文章链接包括但不限于下述部分&#xff1a; python画散点图|scatter()函数小试牛刀&#xff08;入门级教程&#xff09;_python ax.scatter-CSDN博客 python画图|极坐标中画散点图_极坐标上的散点图-CSDN博客 …...

揭开MySQL并发中的“死锁”之谜:从原理到解决方案的深度解析

目录 1. 环境准备&#xff1a;创建“账户”和“标记”表1.1 创建 dl_account_t 表1.2 创建 dl_mark_t 表 2. 死锁详解2.1 死锁情景一&#xff1a;相反加锁顺序导致的死锁2.2 死锁情景二&#xff1a;唯一索引冲突引发的死锁 3. 事务隔离级别与锁机制4. 预防与解决死锁的方法4.1 …...

【论文阅读】Reliable, Adaptable, and Attributable Language Models with Retrieval

文章目录 OverviewCurrent Retrieval-Augmented LMsArchitectureTraining Limitations & Future Work Overview Parametic language models的缺点&#xff1a; 事实性错误的普遍存在验证的难度&#xff08;可溯源性差&#xff09;难以在有顾虑的情况下排除某些序列适应调整…...

A-Frame负责人Diego Marcos分享WebXR与开源AI的未来

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

【STM32-HAL库】火焰传感器(STM32F407ZGT6)(附带工程下载链接)

一、TEMT6000光照强度传感器 火焰传感器是一种能够检测火焰的传感器&#xff0c;它通过检测空气中的特定波长的光线来检测火焰的存在&#xff0c;并输出一个信号来通知系统发生了火灾 工作原理 火焰传感器的工作原理基于光学检测技术。当火焰燃烧时&#xff0c;会产生一些特…...

git merge没有生成合并提交

有时候本地使用gitmerge命令的时候会发现&#xff0c;合并后的log里边并没有一次merge branch的log&#xff0c;而是把合并分支上的所有commit log都带过来。 这是因为当执行合并操作时&#xff0c;如果目标分支的提交历史是源分支的直接延续&#xff08;即&#xff0c;目标分支…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Linux --进程控制

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

AI,如何重构理解、匹配与决策?

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

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...