STL库中的string

文章目录

    • 一、STL的六大组件
    • 二、string类
      • 2.1string中的size()方法
      • 2.2隐式类型的转换
      • 2.3string的多种构造
      • 2.4string中size与length是否有差异?
      • 2.4string中的capacity
      • 2.5string中的push_back和append
      • 2.6string中运算符重载operator
      • 2.7string中的reserve扩容
      • 2.8string中的内置类型和动态内存的开辟
      • 2.8string中reserve与resize的对比
      • 2.9string中的迭代器
      • 2.9string中insert
      • 2.10string中erase
      • 2.10string中replace(替换的意思)
      • 2.11string中erase、insert和replace相似之处
      • 2.12string中find和rfind
      • 2.13string中substr
      • 2.13reverse(逆置)string中的字符
    • 三、cin与getline的区别
    • 四、字符替换(效率高的做法)
    • 五、库里面的swap与string中的swap区别

在这里插入图片描述
在这里插入图片描述
所属专栏:C++初阶

在这里插入图片描述

一、STL的六大组件

在这里插入图片描述

二、string类

2.1string中的size()方法

#include<iostream>
using namespace std;int main()
{string s1;string s2("hello world");for (int i = 0; i < s2.size(); i++){s2[i]++;//获取字符  构成运算符重载 char& operator[]()}return 0;
}

这里的成员函数size表示的是字符串的大小

2.2隐式类型的转换

string s3 = "hello world"//string(const char* s)  //(copy)深拷贝

这里的常量字符串被隐式转化为类类型,然后深拷贝到s3

2.3string的多种构造

在这里插入图片描述

2.4string中size与length是否有差异?

没有什么差异,这里可以阅读文档
在这里插入图片描述

在这里插入图片描述
返回的都是字符串的长度,平常时我们一般都用size

2.4string中的capacity

capacity扩容时是根据字符串有效字符的个数进行扩容的,‘/0’不算有效字符所以不会被计算在内

2.5string中的push_back和append

在这里插入图片描述

这里的c代表一个字符,只能尾插一个字符

在这里插入图片描述

这里的append有多种类型的接口,但是一般第一个用的比较多

在这里插入图片描述
在这里插入图片描述

2.6string中运算符重载operator

在这里插入图片描述

operator的底层实际上就是append和push_back,只不过用了一个函数封装了而已
在这里插入图片描述
在这里插入图片描述

2.7string中的reserve扩容

在这里插入图片描述
在这里插入图片描述

这里的capacity开空间的规律15->31->47->47->70,大概是按1.5倍扩容的,这里其实是16个空间,‘\0’被当做无效字符了,所以capacity为15

//reserve扩容的方法
string s;
s.reserve(100);//里面写个多少就是扩多少个字节

在这里插入图片描述

扩容n个字符大小的长度

2.8string中的内置类型和动态内存的开辟

class string
{
private:char* _ptr;char _buf[16];//空间比较小的时候不需要动态内存的开辟,相当于_ptr浪费掉了size_t _size;size_t _capacity;
}

空间比较小的时候不需要动态内存的开辟,相当于_ptr浪费掉了
空间大的时候需要动态内存的开辟,相当于_buf浪费掉了
在这里插入图片描述

2.8string中reserve与resize的对比

reserve
在这里插入图片描述

这里reserve扩容的时候只会改变容量的大小,不会改变_size的大小,也不会对数组里面的内容进行初始化

resize
在这里插入图片描述

这里的resize不仅会扩容改变capacity并且还会改变size的值,同时会把扩容部分的值初始化为’\0’

在这里插入图片描述

如果n比size小,那么删除数据保留前面的n个数据,不会动capacity,不能原地缩容,而是重新开辟一块空间拷贝数据(效率低下)

2.9string中的迭代器

在这里插入图片描述

这里的迭代器我们当前可以理解为指针(以当前的知识体系,未接触到后面的知识)
在这里插入图片描述
这里的begin返回的是第一个字符的迭代器“指针"

在这里插入图片描述
在这里插入图片描述

这里的rbegin返回指向的是这个逆向迭代器的第一个字符(也就是‘\0’前面的一个字符),也就是最后一个字符,每次++,也就是从后往前遍历
在这里插入图片描述
这里的rend指向的是第一个字符的前面前面一个字节的空间
iterator实际上是typedef的一个类型
在这里插入图片描述
在这里插入图片描述

2.9string中insert

在这里插入图片描述

这里以第一个为例子

pos代表的是插入的位置(字符数组的下标),str表示插入的字符串
在这里插入图片描述

2.10string中erase

在这里插入图片描述

pos表示删除的位置,len表示删除几个字符,如果len=npos,那么就一直删除到结尾

在这里插入图片描述

2.10string中replace(替换的意思)

在这里插入图片描述

这里的pos表示开始替换的的位置,len表示替换的字符的个数,str表示要替换的字符

在这里插入图片描述

2.11string中erase、insert和replace相似之处

erase、insert和replace都需要挪动数据,效率比较低下,能不用最好不用,而且还需要扩容

2.12string中find和rfind

在这里插入图片描述

pos是从该位置开始寻找,是否存在该字符串,存在就返回它的下标,不存在就返回-1,由于是无符号整形,所以也就是2的32次方,32位最大的正数

在这里插入图片描述

rfind与find相反,它是从后往前找,找到了就返回该位置下标

2.13string中substr

在这里插入图片描述

寻找从pos位置开始len个长度的字串

2.13reverse(逆置)string中的字符

在这里插入图片描述

在这里插入图片描述

这里传参传的是两个迭代器

三、cin与getline的区别

1.cin无法读取空格或者换行,因为cin读取的是缓冲区的内容,但是空格和换行无法到达缓冲区
2.getline可以避免这个,可以读取空格

istream& getline(istream& is,string& str);//每次读取完后按回车键需要clear清理一下

四、字符替换(效率高的做法)

题目:把空格字符转换成字符串"%dd"
方法一:
在这里插入图片描述
方法二:
在这里插入图片描述

五、库里面的swap与string中的swap区别

在这里插入图片描述

string中的swap就是把指针指向的内存地址互换了一下,不需要开辟空间,就是简单的指针交换,效率很高

在这里插入图片描述

库里面的swap是深拷贝,也就是说需要两次构造函数,a=b的时候需要调用已从拷贝构造,然后b=c的时候又要调用一次拷贝构造,需要开辟空间,效率比较低

在这里插入图片描述
先赞后看,养成习惯!!!^ _ ^<3 ❤️ ❤️ ❤️
码字不易,大家的支持就是在这里插入图片描述
我坚持下去的动力。点赞后不要忘了关注我哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/747749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——字符串

1.leetcode 151 题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/reverse-words-in-a-string/…

体验OceanBase OBD V2.5.0 组件内扩容和组件变更

背景 OBD 是OceanBase的命令行部署工具&#xff0c;在 obd V2.5.0 版本之前&#xff0c;其主要功能主要是部署各类组件&#xff0c;例如 oceanbase-ce,obproxy-ce,obagent 等。然而&#xff0c;它并不支持组件的变更操作以及组件内部的扩缩容调整。具体来说&#xff1a; 1、若…

网络层_IP

传输层解决的是传输控制&#xff0c;而实际真正决定数据能否发送到对端的是网络层。网络层是有概率传输&#xff0c;而传输层是可靠性传输。所以传输层网络层就可以做到将数据可靠发送到对端。网络层的常见协议有&#xff1a;IP、ICMP等&#xff0c;其中最重要的是IP协议&#…

STM32F103 CubeMX 使用USB生成鼠标设备

STM32F103 CubeMX 使用USB生成鼠标设备 1 配置cubeMX1.1配置外部晶振&#xff0c;配置debug口1.2 配置USB1.3 配置芯片的时钟1.4 生成工程 2. 编写代码2.1 添加申明2.2 main函数代码 1 配置cubeMX 1.1配置外部晶振&#xff0c;配置debug口 1.2 配置USB 1.3 配置芯片的时钟 需…

云与云计算:从传统到云端的IT资源变革

云&#xff1a;从分散到集约&#xff0c;资源服务化的新模式 让我们先通过一个生活化的场景来理解“云”这一概念。几十年前&#xff0c;诸如农村地区的居民需要自给自足&#xff0c;比如在自家院子里打井取水&#xff0c;冬季烧煤取暖&#xff0c;一切满足自己生活需要的都要…

html和winform webBrowser控件交互并播放视频(包含转码)

1、 为了使网页能够与winform交互 将com的可访问性设置为真 [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name "FullTrust")][System.Runtime.InteropServices.ComVisibleAttribute(true)] 2、在webBrow…

idea+vim+pycharm的块选择快捷键

平时开发的时候&#xff0c;有的时候我们想用矩形框住代码&#xff0c;或者想在某列上插入相同字符 例如下图所示&#xff0c;我想在22-24行的前面插入0000 1. Idea的快捷键&#xff1a;option 鼠标 2. Pycharm的快捷键&#xff1a;shift option 鼠标 2. Vim 块选择 v/V/c…

spy分析文件另存为弹框【selenium】

有时需要下载多个文件&#xff0c;但是不想保存在同一个目录下&#xff0c;需要做两步 selenium设置浏览器默认下载路径&#xff0c;这个路径需要是个不存在的路径操作文件另存为弹框 文章目录 selenium设置浏览器默认下载路径操作文件另存为弹框 selenium设置浏览器默认下载路…

Github和TeamCity的持续集成构建

一、简介 TeamCity是JetBrains旗下的一款持续集成[Continuous Integration&#xff0c;简称CI]工具&#xff0c;开箱即用。TeamCity提供一系列特性可以让团队快速实现持续集成&#xff1a;IDE工具集成、各种消息通知、各种报表、项目的管理、分布式的编译等等。 二、安装使用(…

Excel xlsx file:not supported

报错信息&#xff1a; 原因&#xff1a; Excel和xlrd版本不匹配 解决措施&#xff1a; 降低xlrd版本或Excel版本 方法一&#xff1a; 1) 先卸载了原来的版本&#xff1a;uninstal xlrd 2) 安装新的低版本xlrd模块pip install xlrd1.2.0 方法二&#xff1a; 1&#xff09…

AI日报:欧盟人工智能法案通过后行业面临合规障碍

文章目录 人工智能新规对web爬网的影响对英国的影响。 人工智能新规 立法者已经通过了欧盟人工智能法案。企业现在必须确保其人工智能应用程序符合规则。 全面的新规定对可能影响公民权利的人工智能系统实施制裁&#xff0c;并有可能彻底禁止某些系统。 违反规定的公司可能面…

【类和对象】类的作用域 | 类的实例化 | 类对象模型 | this指针

目录 5.类的作用域 6.类的实例化 6.1成员的声明和定义 6.2实例化出的对象大小 7.类对象模型❗❗ 7.1如何计算类对象的大小 7.2类对象的存储方式猜测 7.3结构体内存对齐规则 7.3.1内存对齐 7.3.2大小端 8.this指针 8.1this指针的引出 8.2this指针的特性 C和C实…

MySQL—redo log、undo log以及MVCC

MySQL—redo log、undo log以及MVCC 首先回忆一下MySQL事务的四大特性&#xff1a;ACID&#xff0c;即原子性、一致性、隔离性和持久性。其中原子性、一致性、持久性实际上是由InnoDB中的两份日志保证的&#xff0c;一份是redo log日志&#xff0c;一份是undo log日志&#xff…

了解常用测试模型 -- V模型、W模型

目录 V模型 测试流程 特点 优、缺点 w模型/双v模型 测试流程 特点 优、缺点 V模型 测试流程 用户需求&#xff1a;产品经理将用户需求转变为软件需求 需求分析与系统设计&#xff1a;验证需求是否正确&#xff0c;确定编程语言和框架 概要设计&#xff1a;项目结构设…

Java数据结构-优先级队列

文章目录 前言一、优先级队列1.1 概念 二、优先级队列的模拟实现2.1 堆的概念2.2 堆的存储方式2.3 堆的创建2.3.1 堆向下调整2.3.2 堆的创建2.3.3 建堆的时间复杂度 2.4 堆的插入与删除2.4.1 堆的插入2.4.2 堆的删除 2.5 用堆模拟实现优先级队列 三、常用接口介绍3.1 PriorityQ…

鼓楼夜市管理wpf+sqlserver

鼓楼夜市管理系统wpfsqlserver 下载地址:鼓楼夜市管理系统wpfsqlserver 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#wpf架构和sql server数据库 功能模块&#xff1a; 登录注册 鼓楼夜市管理系统主界面所有店铺信…

C++类与对象二

目录 一、类的嵌套 二、对象引用私有数据成员 通过公有函数为私有成员赋值 利用指针访问私有数据成员 利用函数访问私有数据成员 利用引用访问私有数据成员 三、成员函数重载 四、this指针 一、类的嵌套 #include <iostream> using namespace std;class CC1 { p…

华为配置中心AP内漫游实验

华为配置中心AP内漫游示例 组网图形 图1 配置中心AP内漫游组网图 配置流程组网需求配置思路数据规划配置注意事项操作步骤配置文件 配置流程 WLAN不同的特性和功能需要在不同类型的模板下进行配置和维护&#xff0c;这些模板统称为WLAN模板&#xff0c;如域管理模板、射频模…

Spring Cloud Gateway针对指定接口做响应超时时间限制

背景&#xff1a;我做的这个服务中存在要对大数据量做自定义统计的接口和大文件上传接口&#xff0c;接口响应用时会超过gateWay配置的全局用时&#xff0c;如果调整网关全局的超时时间和服务的全局超时时间是不合理的&#xff0c;故此想能否单独针对某个接口进行细粒度超时限制…

林木园区改造VR仿真培训课件提高人们的专业素质

森林经营VR模拟体验摆脱了传统森林经营周期长、实践难及耗材大等问题&#xff0c;借助VR虚拟仿真技术为人们提供一种全新的、沉浸式的森林经营体验&#xff0c;让人们更好地了解森林经营的全周期。 提高人们的环保意识 通过亲身参与森林经营的过程&#xff0c;人们可以更直观地…