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/…

C++:基类中的函数什么情况下声明为虚函数

在C中&#xff0c;基类中的函数应该在以下情况下声明为虚函数&#xff1a; 实现多态行为&#xff1a;如果你希望通过基类指针或引用来调用派生类中的重写函数&#xff0c;那么基类中的这个函数应该被声明为虚函数。这是实现运行时多态性的一种方式。 允许派生类重写&#xff1…

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

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

C语言经典面试题目(八)

1、什么是文件指针&#xff1f;请解释文件指针的作用。 文件指针是在C语言中用来指向文件的指针变量。它主要用于对文件进行读写操作&#xff0c;通过文件指针可以控制文件的读写位置、读取文件内容、向文件中写入数据等操作。 文件指针的作用&#xff1a; 打开文件&#xff…

网络层_IP

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

Flutter 的 switch 语句补遗

我的 App 里&#xff0c;一个消息气泡变成空白了&#xff0c;非常奇怪&#xff0c;此前一直是没问题的&#xff0c;经过调试定位我发现&#xff1a; static TextSpan _buildRootSpan(BuildContext ctx, List<LinkifyElement> parts, TextStyle? style) {List<InlineS…

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;一切满足自己生活需要的都要…

vscode中C++调试launch.json配置

.vscode目录下&#xff0c; launch.json内容&#xff0c; {"version": "0.2.0","configurations": [{"name": "cc","type": "cppdbg","request": "launch","preLaunchTask&…

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设置浏览器默认下载路…

云计算与低代码:重塑软件开发的新范式

随着信息技术的迅猛发展&#xff0c;云计算与低代码已成为引领软件开发领域变革的重要力量。本文将对这两个主题进行深入探讨&#xff0c;分析它们如何重塑软件开发的模式&#xff0c;提高开发效率&#xff0c;以及对企业和开发者带来的深远影响。 云计算 无限可能的新天地 云…

Java 内存异常

内存溢出 内存溢出指的是在程序执行过程中&#xff0c;申请的内存超过了系统实际可用的内存资源。 内存溢出的常见情况&#xff1a; 创建大量对象并持有引用&#xff1a;在程序中创建大量对象并持有对这些对象的引用&#xff0c;而没有及时释放这些引用&#xff0c;导致堆内存…

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…

怎么修改游戏ip地址

玩游戏时IP被封是一件非常苦恼的事情&#xff0c;为了避免玩游戏时IP被封&#xff0c;就得遵守游戏规则&#xff0c;但想要多开账号玩&#xff0c;就会被限制&#xff0c;想要不被封IP&#xff0c;就得更换IP地址玩游戏&#xff0c;不同的账号使用不同的IP&#xff0c;就能避免…

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实…

http的body格式

body数据都通常放在 HTTP 请求的 body 部分。 在 HTTP 请求中&#xff0c;Content-Type 头用于指示 body 中的数据格式。例如&#xff0c;对于 x-www-form-urlencoded 格式的数据&#xff0c;通常会设置 Content-Type: application/x-www-form-urlencoded&#xff0c;而对于 fo…