C++相关概念和易错语法(11)(npos、string的基本使用)

本文主要是分享一些基础的用法和接口,不会涉及迭代器版本,也没有底层概念,主要是保证简单入门和使用。

1.npos

string本质上是一个类,里面包含了上百个成员函数,在调用这个头文件后,我们要知道整个类都被包含在了std这个命名空间域里,因此我们要注意在大型项目中不适用using namespace std的地方时如何使用这个类。

在string里npos使用非常常见,npos是static const size_t npos = -1(大约42亿),在很多函数的参数部分作为缺省值补充

注意,这只适用于x86平台,在x64里,这个数会大很多,经过计算相当于long int的无符号最大数,占了8个字节

2.string的增删查改操作

string帮我们实现了很多的东西,让我们可以更方便地解决一些问题,将精力放在项目更关键的地方,而不是像C语言一样每个细枝末节都要去手动实现。并且,string是一个将数据和方法封装到一起的类,体现了OOP(面向对象编程)特性,而C语言中的字符串函数相比来说是数据方法分离的,并没有这一思想。

string的功能主要分为增删查改。但由于string的设计相对来说很复杂(string设计在STL之前,时间太早不太成熟,设计出现了很多冗余的接口),平时使用的时候就主要使用关键的几个,保证功能的实现即可,所以这篇文章会分享一些基础的有用的接口。

(1)增

①初始化(构造函数)

但是我们要注意的是这里面有很多的构造函数,在使用的时候是去找最匹配的。我们有时候使用的构造函数带有缺省值npos,但有的有没有,这就导致了有些函数容易造成我们理解上的歧义,需要我们着重理解。

通过分析我们发现当数据存在类型转换的时候,会去匹配最合适的函数,特别是针对字符串->类的隐式类型转换,有时候少一个参数会影响前面参数的解读,导致代码的意思完全不一样。

除此之外,我们知道有的函数进行了特殊处理,导致我们在写参数的时候可以随便写大,但有的函数就会导致越界访问,需要我们注意。

size_t len和size_t n在这里意思其实都是一样的,即从输入的str(s)中往后选取len(n)个字符构成的串初始化对象。但是区别在于len读到\0就会强制停止,而n读到\0不会停下来,会出现越界

在后面的函数中,只要是参数格式和这个相同的都会出现这种情况,需要我们多注意,否则会不经意写出很多bug。我们也可以通过其它办法进一步探究这两个函数对参数处理的区别

可以看到,在string (const char* s, size_t n);里会忽略\0的阻拦强制向后读,而string (const string& str, size_t pos, size_t len = npos);最多读到\0结束

②push_back

参数:void push_back (char c);

push_back是在已有字符串后面加上新的单字符,注意只能加一个字符,字符串不行

③append和+=

append就是追加,在参数方面和构造函数几乎一模一样

下面是用法的实例,可以稍微分析一下保证掌握:

但是,这种用法除了不方便、有时会导致歧义以外,还存在一个易错点,下面来看看这个结果:

在这种情况下,由于数据连续存储,当出现了越界访问时,会导致如上面这样的数据污染,而这样的代码并没有报错,这就很需要我们注意在追加的时候不要像构造函数那样在size_t n这个参数上随便填,最好遵循真实情况来写,我们无法保证编译器帮我们解决了这个问题。

在大部分情况下,我们遇到的追加都是整段整段的,所以在追加时我们可以直接用+=来写,方便且容易理解。

但是要注意的是+=不能对+=后跟的数据进行裁切,这是+=劣于append的一点,但绝大多数情况是够用的,如果确实要用到append,注意上面我说的要根据实际来填写参数防止越界。

下面是简单的实例:

④insert

当我们需要在字符串中间插入字符或字符串时,可以考虑使用insert

下面是一些简单使用示例:

insert要慎重使用,因为插入往往意味着要挪动数据,这会出现效率不高的问题

(2)删

①erase、clear

erase可以从指定的位置pos开始向后清除len个数据

一般来说,erase已经满足了我们的需求,掌握这一个即可,clear可以在特殊场景使用

clear:参数:void clear();        清空字符串

②pop_back

参数:void pop_back();

删除最后一个字符

(3)查

①operator[]、at

operator[]:参数:char& operator[] (size_t pos);        针对string(可修改)

const char& operator[] (size_t pos) const;        针对const string(字符串不能修改)

这个用法很自然,没什么学习难度,但我们可以注意一下这个返回值char&,即字符串对应下标的对应数据的引用,意思就是我们直接拿到了原始数据的引用,这也就意味着除了查找以外,我们还可以用这个引用对原始的字符串进行修改操作(如++和--),我们发现这继承了数组的修改数据的用法。这个特性彻底地和指针、传值拉开了差距,使得它不可以替代

at:参数:char& at (size_t pos);
const char& at (size_t pos) const;

at和operator[]在用法和效果上完全一致,区别在于越界访问时operator[]直接assert,而at会抛异常

②size、lenth、max_size、empty

这四个函数是用来查数组的大小相关的信息

size、lenth:都是只访问不修改

参数:size_t size() const;

size_t length() const;

这两个函数的含义完全一致,就是计算字符串的大小,但是值得注意的是,lenth是单独为string这个容器设立的,而size适用于所有容器,因此一般情况下建议使用size

我们可以看到,size和lenth都不会计算\0

max_size:参数:size_t max_size() const;

用来查询字符串允许的最大长度,几乎没什么用,因为一般情况不会触及到这个最大值,下面是在x64下允许存储的最大长度,相当于有符号long int能存的最大值,需要8589934592G的空间,这是不可能达到的。

x86对应的就是有符号int的最大值,需要约2G的空间

empty:参数:bool empty() const;

用来判断字符串是否是空,在很多地方还是很有用处的

③find、rfind

当我们需要在字符串中找某个字符或字符串的时候,我们就可以考虑使用find、rfind

rfind和find在用法上完全一致,只不过rfind是从字符串后向前找,找到了就返回值。第二个参数的含义是从后向前找的第一个字符。

④c_str、data

参数:const char* c_str() const;

const char* data() const;

c_str、data用法效果完全一致

在使用string的过程中,如果我们需要用到一些C语言相关的函数,必须传址的时候,我们应该得到存这个串的地址,这个时候使用c_str即可

但是我们一定要注意这个函数const char* c_str() const;被const修饰,也就是我们不能外调函数来修改它的值,这体现的是C++的封装思想。

(4)改

①assign(覆盖)

当我们想要将整个字符串覆盖重写的话,我们可以考虑使用assign

使用的注意事项和上面的一样,掌握好这几种参数模板可以用于很多相似的函数

②replace

当我们需要将一段字符串替换成其它字符或字符串时考虑使用replace

值得注意的是第二个参数len,可以随便填大,因为删完了就不会删了,没有越界访问,相当于清除pos后面所有内容

3.其它操作

下面的操作并不算常用,仅作展示

(1)取子串

(2)字符串内容交换

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在 Navicat 17 中探索表配置文件

距离 Navicat 17(英文版)的发布还有不到一周的时间,现在是深入研究新的表配置文件功能的最佳时机。它允许我们保存经常用于表的筛选、排序和列显示的不同组合。所以,事不宜迟,让我们开始吧! 创建表配置文件…

盛邦安全荣获北京市海淀区上地街道财源建设工作表彰

近日,盛邦安全受邀出席上地街道2024年第一季度财源建设工作联席会暨上地人工智能产业报告发布大会并收到上地街道颁发的感谢信,这是对公司技术创新、管理提升、营收增长,持续为上地地区财源建设做出突出贡献的鼓励。 盛邦安全副总裁、董事会秘…

【C++算法】队列相关经典算法题

1. N叉树的层序遍历 首先我们遇到这个题目,没有任何思路,我们就可以来模拟一下层序的流程,首先我们肯定是访问根节点1,访问之后呢就是访问下一层的最左节点3,此时第一层的节点1已经访问过了就可以不要了,然…

Python可以自学但是千万不要乱学,避免“埋头苦学”的陷阱!

前言 Python可以自学但是千万不要乱学! 归根结底因为学习是个反人性的过程! 复盘没学下去的网课,都有以下特点: 😅 臣妾听不懂啊! 初次接触编程遇到太多抽象高深的概念,不了解老师口中的一个…

避雷:搭建AI知识库注意事项

AI知识库作为信息存储和进行智能处理的核心部分,受到越来越多企业的重视。为了更好地发展,企业也纷纷开始搭建AI知识库。然而,在搭建AI知识库的过程中,也有很多雷区容易踩到,导致项目延迟、效果不佳甚至失败。所以&…

【Android】Apk图标的提取、相同目录下相同包名提取的不同图标apk但是提取结果相同的bug解决

一般安卓提取apk图标我们有两种常用方法: 1、如果已经获取到 ApplicationInfo 对象(假设名为 appInfo),那么我们获取方法为: appInfo.loadIcon(packageManager)// 返回一个 Drawable 对象2、 如果还没获取到 Applica…

C++入门系列-构造函数

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会…

kali搭建Vulhub靶场

简单概述 Vulhub是一个面向大众的开源漏洞靶场,借助Docker简单执行两条命令即可编译、运行一个完整的漏洞靶场镜像。旨在让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。 Docker是一个开源的容器引擎,它有助于更快地交付应用…

vue3专栏项目 -- 三、使用vue-router 和 vuex(下)

一、添加columnDetail 页面 首页有专栏列表(ColumnList组件),专栏列表中有很多专栏,然后点击某个专栏就进入专栏详情页(ColumnDetail组件),专栏详情页中有很多文章,点击某个文章就进…

Tiff文件解析和PackBits解压缩

实现了Tiff图片文件格式的解析,对Tiff文件中的PackBits压缩格式进行解压缩,对Tiff文件中每一个Frame转换成BufferedImage显示。 Java语言实现,Eclipse下开发,AWT显示图片。 public static TIFF Parse(final byte[] bytes) throw…

vivado Spartan-7 配置存储器器件

下表所示闪存器件支持通过 Vivado 软件对 Spartan -7 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 , 并支持通过 Vivado 软件对其中所列非易失性存储器 进行擦除、空白检查、编程和验证。赛灵…

XMind 2021 v11.1.2软件安装教程(附软件下载地址)

软件简介: 软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法! XMind 2021 v11.1.2被誉为顶尖思维导图工具,以其简洁、整洁的界面和直观的功能布局脱颖而出。尽管软件体积小巧,却极具强大功…

数据结构之图——探索图论的奥秘

前言 在这篇文章中,我们一起来看看我们生活中都会用到,但却不那么熟悉的数据结构——图(英语:graph)。我们看下百科定义: 在计算机科学中,图(英语:graph)是一…

实体同城商家短视频获客,3天直播课,玩转实体商家私域,引爆门店增长

课程内容: 实体同城3天直播课【资料】 实体商家获客第一天 .mp4 实体商家获客第二天上.mp4 实体商家获客第二天,mp4 实体商家获客第三天.mp4 实体商家获客第4天.mp4 网盘自动获取 链接:https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x…

【JVM】ASM开发

认识ASM ASM是一个Java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。 ASM可以直接产生二进制class文件,也可以在类被加载入虚拟机之前动态改变类行为,ASM从类文件中读入信息后能够改变类行为,分析类信息&#xff…

【Leetcode每日一题】 综合练习 - 电话号码的字母组合(难度⭐⭐)(75)

1. 题目解析 题目链接:电话号码的字母组合 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 算法设计思路 在解决这类问题时,我们需要认识到每个位置上的数字对应的字符集合是相互独立的&#…

2022CSP-S易错题解析

21.B i的取值分别是0、5、6、7、8、13,其中i5时,j运行3次;i6时,j运行2次;i7时,j运行1次;i13时,j运行4次。共10次。 25.D 第1次执行时,数字是按照三进制下的最低位从小到…

网络爬虫概述与原理

网络爬虫概述与原理 网络爬虫简介狭义上理解功能上理解常见用途总结 网络爬虫分类通用网络爬虫聚焦网络爬虫增量网络爬虫深度网络爬虫 网络爬虫流程网络爬虫采集策略深度有限搜索策略广度优先搜索策略 网络爬虫简介 通过有效地获取网络资源的方式,便是网络爬虫。网…

ESXI虚拟机为centos7.9扩容

一.df -T 查看文件系统类型 当前系统格式为 xfs 二 .lsblk查看分区状况 三.虚拟机管理增加容量 原来是22G,改为30G,之后重启 四.fdisk -l 查看磁盘容量和分区 32.2G是目前的总容量 五.fdisk /dev/sda 新增分区 [rootlocalhost ~]# fdisk /dev/sda …

机器学习入门到放弃2:朴素贝叶斯

1. 算法介绍 1.1 算法定义 朴素贝叶斯分类(NBC)是以贝叶斯定理为基础并且假设特征条件之间相互独立的方法,先通过已给定的训练集,以特征词之间独立作为前提假设,学习从输入到输出的联合概率分布,再基于学习…