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

【C++打怪之路Lv8】-- string类

🌈 个人主页:白子寰
🔥 分类专栏:重生之我在学Linux,C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

目录

STL六大组件

什么是string

底层实现

为什么要学习string

string常用接口

构造函数

1、无参构造函数

2、带参构造函数

3、拷贝构造函数

4、构造n个单字符函数

容量操作接口

1、size();

2、length();

3、capacity();

4、reserve();

5、resize();

代码 && 4、5点总结 

访问和遍历

1、operator[]

2、迭代器

3、at

4、front and back

5、find and rfind (与npos)

6、c_str

修改字符串操作

1、operator+=

2、push_back

3、append

4、insert

5、erase

6、swap

7、operator+

8、getline

各种运算符重载函数

1、operator>> and operator<<

2、比较运算符,根据ASCII码值比较


STL六大组件


什么是string

在 C++ 中,string 是标准库中的一个类,它用于表示和处理字符串

string 类是定义在 <string> 头文件中的,它提供了丰富的成员函数来支持字符串的各种操作,如拼接、查找、替换等。

底层实现

string 类的底层实现通常依赖于动态数组,这个动态数组用于存储字符序列

具体来说,它通常包含以下三个部分:

  1. 字符数组:用于存储实际的字符串数据。
  2. 长度:记录当前字符串中的字符数量。
  3. 容量:记录当前分配的内存可以容纳的字符数量

以下是string类的私有成员:

template <typename _CharT, typename _Traits, typename _Alloc>
class basic_string {
private:_CharT* _MyPtr;       // 指向分配的内存的指针size_t _size;         // 字符串的长度size_t _capacity;     // 分配的内存容量
};

为什么要学习string

  1. 抽象度高:`string`提供高级抽象,简化内存管理。
  2. 功能丰富:内置操作集,提升开发效率。
  3. 安全性好:预防缓冲区溢出,保障程序安全。
  4. 跨平台:标准库组件,确保代码可移植性。

简单来说就是:省事、安全、通用、强大

  1. 省事:用`string`处理文字更方便,不用手动管理内存。
  2. 安全:用`string`不容易出错,减少程序崩溃的风险。
  3. 通用:不管在哪个系统,`string`的表现都一样,方便移植。
  4. 强大:`string`能干的事情多,比如查找、替换文字都很简单。

string常用接口

构造函数

1、无参构造函数

函数原型:string();
创建了一个空的string对象

2、带参构造函数

函数原型:string(const char* s);
用字符串(即以'\0'结尾的字符数组)初始化string对象

3、拷贝构造函数

函数原型:string& operator=(const string& str);
这个操作符重载函数允许你使用一个string对象来赋值给另一个已经存在的string对象

4、构造n个单字符函数

函数原型:string(size_t n,char c);
创建一个包含n个字符cstring对象


容量操作接口

1、size();

size_t size() const;

返回字符串中字符的数量

2、length();

size_t length() const;

与size()函数作用相同,实际没有什么区别; 返回字符串中字符的数量

3、capacity();

size_t capacity() const;

 返回字符串当前容量,即在不重新分配内存的情况下,字符串可以容纳的最大字符数

简单来说就是:像文本文件当前可以容纳多少字符而不会超出文件系统的分配

4、reserve();

void reserve(size_t new_cap);

 用来设置字符串的容量至少为new_cap

5、resize();

void resize(size_t  n);

 用来改变字符串的长度到n个字符 

代码 && 4、5点总结 


访问和遍历

1、operator[]

char& operator[](sizet pos);
允许像访问数组一样访问字符串中的单个字符。它返回指定位置pos的字符的引用

如果你提供的索引超出了字符串的范围,它不会检查边界,可能会导致未定义行为

2、迭代器

①正向迭代器:iterator begin();

②反向迭代器:reverse_iterator rbegin();

正向迭代器begin()返回指向字符串第一个字符的迭代器,

而反向迭代器rbegin()返回指向字符串最后一个字符的迭代器。

迭代器可以用来遍历字符串中的所有字符。

迭代器的本质是范围for

3、at

char& at(sizet pos);

返回指定位置pos的字符的引用

operator[]不同的是,如果pos超出了字符串的范围,at会抛出一个std::out_of_range异常。

4、front and back

front原型:char& front();

back原型:char& back();

front()返回字符串第一个字符的引用,

back()返回字符串最后一个字符的引用

如果字符串为空,这些操作将导致未定义行为

5、find and rfind (与npos)

find原型:sizet find(const string& str, sizet pos 0) const;

rfind原型:sizet rfind(const string& str, sizet pos npos) const;

find()从字符串的起始位置开始查找子字符串str返回第一次出现的位置索引。如果找不到,返回npos

rfind()从字符串的末尾开始查找子字符串str返回最后一次出现的位置索引。如果找不到,也返回npos

什么是npos?

npos是std::string类中的一个静态常量成员,表示不存在的位置,它的值通常是一个非常大的数,可以认为是字符串的最大可能大小加1

当查找函数返回npos时,意味着没有找到匹配项

6、c_str

const char* c_str() const;
返回一个指向以空字符终止的字符数组的指针,这个数组与字符串的内容相同。

这通常用于在需要C风格字符串的函数中使用std::string对象


修改字符串操作

1、operator+=

string& operator+=(const string& str); //追加一个string类
string& operator+=(const char* s);     //追加字符串
string& operator+=(char c);            //追加字符

用于将一个字符串或字符追加到当前字符串的末尾

2、push_back

void push_back(char c);

用于将一个字符添加到字符串的末尾

3、append

string& append(const string& str);        // 追加string
string& append(const char* s);            // 追加字符串
string& append(const char* s, size_t n);  // 追加字符串的前n个字符
string& append(size_t n, char c);         // 追加n个字符

用于将字符串或字符序列追加到当前字符串的末尾


 



4、insert

string& insert(size_t pos, const string& str);
string& insert(size_t pos, const char* s);
string& insert(size_t pos, const char* s, size_t n);
string& insert(size_t pos, size_t n, char c);
iterator insert(iterator p, char c);
void insert(iterator p, size_t n, char c);
void insert(iterator p, iterator first, iterator last);

用于在字符串的指定位置插入另一个字符串或字符序列

5、erase

string& erase(size_t pos = 0, size_t len = npos);
iterator erase(iterator p);
iterator erase(iterator first, iterator last);

用于从字符串中移除字符,可以移除单个字符,也可以移除一个范围内的字符


 



 

6、swap

void swap(string& str);

用于交换两个字符串的内容

7、operator+

string operator+(const string& str1, const string& str2);
string operator+(const string& str, const char* s);
string operator+(const char* s, const string& str);
string operator+(const string& str, char c);
string operator+(char c, const string& str);

用于连接两个字符串或字符串与字符

8、getline

istream& getline(istream& is, string& str, char delim = '\n');

用于从输入流中读取一行直到遇到指定的分隔符(默认是换行符),并将其存储到字符串中。

 


各种运算符重载函数

1、operator>> and operator<<

istream& operator>>(istream& is, string& str);
ostream& operator<<(ostream& os, const string& str);
  • operator>>:这个运算符重载用于从输入流(如 cin)读取字符串。它读取直到下一个空白字符(空格、制表符或换行符)为止的字符序列,并将其存储到字符串中
  • operator<<:这个运算符重载用于将字符串输出到输出流(如 cout)。它将字符串的内容输出到流中。

 

2、比较运算符,根据ASCII码值比较

bool operator==(const string& str) const;
bool operator!=(const string& str) const;
bool operator<(const string& str) const;
bool operator>(const string& str) const;
bool operator<=(const string& str) const;
bool operator>=(const string& str) const;

 


***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“一个人可能走得更快,但一群人走得更远”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。

相关文章:

【C++打怪之路Lv8】-- string类

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…...

【JS】node.js压缩文件的方式

在 Node.js 中&#xff0c;有多种方法可以压缩文件。以下是几种常见的压缩方式及其对应的代码示例&#xff1a; 使用 archiver 压缩成 ZIP 文件使用 zlib 压缩成 GZIP 文件使用 tar 压缩成 TAR 文件 1. 使用 archiver 压缩成 ZIP 文件 archiver 是一个功能强大的库&#xff…...

2024免费mac苹果电脑清理垃圾软件CleanMyMac X4.15.8

对于苹果电脑用户来说&#xff0c;设备上积累的垃圾文件可能会导致存储空间变得紧张&#xff0c;影响电脑的性能和使用体验。尤其是那些经常下载和安装新应用、编辑视频或处理大量照片的用户&#xff0c;更容易感受到存储空间的压力。面对这种情况&#xff0c;寻找一种有效的苹…...

MPA-SVM多变量回归预测|海洋捕食者优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…...

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言&#xff1a;uniapp项目使用uni-ui组件方式很多&#xff0c;有npm安装等&#xff0c;或直接创建uni-ui项目&#xff0c;使用un…...

ROS2 通信三大件之动作 -- Action

通信最后一个&#xff0c;也是不太容易理解的方式action&#xff0c;复杂且重要 1、创建action数据结构 创建工作空间和模块就不多说了 在模块 src/action_moudle/action/Counter.action 下创建文件 Counter.action int32 target # Goal: 目标 --- int32 current_value…...

大数据治理:构建数据驱动的智能决策体系

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

k8s微服务

一 、什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f;需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。 借助Service&#xff0c;应用可以实现服务发现和负载均衡。 service默认只支持4层负载均…...

【Java】Java 的反射机制(一):反射概述

Java 的反射机制&#xff08;一&#xff09;&#xff1a;反射概述 1.反射概述1.1 静态语言 / 动态语言1.1.1 动态语言1.1.2 静态语言 1.2 Java Reflection1.3 Java 反射机制提供的功能1.4 反射的优点和缺陷1.5 反射相关的主要 API1.6 代码示例 2.Class 类2.1 什么是 Class 类2.…...

Monorepo pnpm 模式管理多个 web 项目

Monorepo pnpm 模式管理多个 web 项目 Monorepo pnpm 模式管理多个 web 项目项目地址git flow 工作流程pnpm workspace.npmrc初始化项目架构引入Husky规范git提交配置eslint和prettiereslint 配置prettier 配置 配置lint-staged创建项目创建shared项目全局安装 vue在 packages …...

2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者,看是有点意料之外,其实也在情理之中。

近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家&#xff0c;如今却将全球范围内对机器学习和神经网络的研究和开发作为了一种能…...

《深入理解 C++策略模式的变体:编程灵活性的新维度》

在 C编程的广阔领域中&#xff0c;设计模式起着至关重要的作用&#xff0c;它们为软件架构提供了可复用的解决方案。其中&#xff0c;策略模式是一种非常强大的设计模式&#xff0c;它允许算法的行为在运行时根据不同的策略进行改变。而策略模式的变体则进一步扩展了其灵活性和…...

一起体验AI动手实验,OceanBase 2024 年度发布会精彩预告

2024年OceanBase年度发布会将于10月23日在北京望京凯悦酒店举行。此次大会围绕“不止于记录”的主题&#xff0c;共同探讨当前数据库领域的前沿话题&#xff0c;包含主论坛、分论坛、AI 动手实训营、开源技术交流会等多个环节&#xff0c;诚邀全国各地的企业和开发者共同参与&a…...

Download Vmware Fusion (free for person)

1. web link ProductFiles - Support Portal - Broadcom support portal 2. Register user (Required) use your email to register a account 3. login and download note: the username is the email name....

【Java数据结构】二叉树

【本节目标】 1. 掌握树的基本概念 2. 掌握二叉树概念及特性 3. 掌握二叉树的基本操作 4. 完成二叉树相关的面试题练习 一. 树型结构 1 概念★ 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集…...

虎牙Android面试题及参考答案

给个数组,找出数组中第 k 大的数(利用快排思想 / 用小顶堆,他说可以用大顶堆?) 利用快排思想:快速排序的核心思想是分治和分区。在找数组中第 k 大的数时,每次选择一个基准元素,将数组分为两部分,左边部分小于基准元素,右边部分大于基准元素。如果基准元素最终的下标…...

C++:错误代码分析<2>

&#x1f30f;主页&#xff1a;R6bandito_ &#x1f680;所属专栏&#xff1a;C/C错误代码收集整理 源码 考虑以下代码&#xff1a; void do_some_work() {std::cout << "Do some work" << std::endl; }int main(int argc, const char* argv[]) {std::…...

怎么ping网络ip地址通不通

怎么Ping网络IP地址通不通&#xff1f;要检查网络中的IP地址是否连通&#xff0c;可以使用‌Ping命令。Ping命令通过发送ICMP&#xff08;Internet Control Message Protocol&#xff0c;因特网控制消息协议&#xff09;Echo请求报文并等待回应&#xff0c;来判断目标主机是否可…...

前端新机部署

编辑器&#xff1a;vscode 下载地址 vscode常用插件 显示代码修改历史、作者等信息 GitLens Nodejs版本 Node版本管理工具 Nvm下载地址 nvm常用命令&#xff1a; nvm ls // 查看安装的所有node.js的版本nvm list available //查看可以安装的所有node.js版本nvm install 版本…...

对比 Babel、SWC 和 Oxc:JavaScript 和 TypeScript 工具的未来

随着现代前端开发的快速演变&#xff0c;JavaScript 和 TypeScript 的工具链不断更新&#xff0c;以满足开发者对性能和效率的需求。我们将对比三款流行的工具&#xff1a;Babel、SWC 和 Oxc&#xff0c;重点分析它们的特点、性能、应用场景以及适用性。 1. Babel&#xff1a;…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...