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

news2024/12/23 16:55:20

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

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后面所有内容

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

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

相关文章

OpenCV 为轮廓创建边界框和圆(62)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV检测凸包(61) 下一篇 :OpenCV如何为等值线创建边界旋转框和椭圆(62) ​ 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::boundingRect使用 OpenCV 函数 cv::mi…

foobar2000 for Mac:卓越音乐播放器

当您在寻找一款音质卓越、功能丰富的音频播放器时,foobar2000 for Mac无疑是您的首选。它拥有简洁明了的界面设计,易于上手,同时支持多种音频格式,让您无需担心兼容性问题。 foobar2000 for Mac v2.6.4免激活版下载 foobar2000 fo…

P6周人脸识别

一、前期准备 1.设置GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, datasets import os,PIL,pathlib,warningswarnings.filterwarnings("ignore") #忽…

SQL:NOT IN与NOT EXISTS不等价

在对SQL语句进行性能优化时,经常用到一个技巧是将IN改写成EXISTS,这是等价改写,并没有什么问题。问题在于,将NOT IN改写成NOT EXISTS时,结果未必一样。 目录 一、举例验证二、三值逻辑简述三、附录:用到的S…

SpringBoot自定义定时任务

通常,在我们的项目中需要定时给前台发送一些提示性消息或者我们想要的定时信息,这个时候就需要使用定时任务来实现这一功能,实现也很简单,接下来具体来看看吧~ 简单定时任务 首先,你需要在你的启动类上加上开启定时任…

【人工智能Ⅱ】实验5:自然语言处理实践(情感分类)

实验5:自然语言处理实践(情感分类) 一:实验目的与要求 1:掌握RNN、LSTM、GRU的原理。 2:学习用RNN、LSTM、GRU网络建立训练模型,并对模型进行评估。 3:学习用RNN、LSTM、GRU网络做…

Photoshop中图像编辑的基本操作

Photoshop中图像编辑的基本操作 Photoshop中调整图像窗口大小Photoshop中辅助工具的使用网格的使用标尺的使用注释工具的使用 Photoshop中置入嵌入式对象Photoshop中图像与画布的调整画布大小的修改画布的旋转图像尺寸的修改 Photoshop中撤销与还原采用快捷键进行撤销与还原采用…

基于MQTT通信开发的失物招领小程序

项目架构设计 这个项目采用前后端分离的方式,重新设计了两条链路来支撑程序的信息获取和传递 前端的小程序页面再启动页面渲染时,直接通过DBAPI从后端数据库获取信息,直接渲染在小程序中项目中给DBAPI的定位是快速从后端获取信息&#xff0…

信息系统项目管理师0087:组织系统(6项目管理概论—6.2项目基本要素—6.2.6组织系统)

点击查看专栏目录 文章目录 6.2.6组织系统1.治理框架2.管理要素3.组织结构类型6.2.6组织系统 项目运行时会受到项目所在的组织结构和治理框架的影响与制约。为有效且高效地开展项目,项目经理需要了解组织内的组织机构及职责分配情况,帮助自己有效地利用其权力、影响力、能力、…

5分钟速通大语言模型(LLM)的发展与基础知识

✍️ 作者:哈哥撩编程(视频号同名) 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 🏆 推荐专栏: 🏅 程序员:职场关键角色通识宝…

【编程题-错题集】chika 和蜜柑(排序 / topK)

牛客对于题目链接&#xff1a;chika和蜜柑 (nowcoder.com) 一、分析题目 排序 &#xff1a;将每个橘⼦按照甜度由高到低排序&#xff0c;相同甜度的橘子按照酸度由低到高排序&#xff0c; 然后提取排序后的前 k 个橘子就好了。 二、代码 1、看题解之前AC的代码 #include <…

ttkbootstrap界面美化系列之PanedWindow(七)

在界面设计中经常用PanedWindow控件来对整个界面进行切割布局&#xff0c;让整个界面看上去有层次感&#xff0c;不至于说杂乱无章。在我之前的文章中有对tkinter的该控件做了详细的介绍&#xff0c;链接如下基于Tkinter的PanedWindow组件进行窗口布局-CSDN博客 本文主要是介绍…

Python-VBA函数之旅-oct函数

目录 一、oct函数的常见应用场景 二、oct函数使用注意事项 三、如何用好oct函数&#xff1f; 1、oct函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、oct函数的常见应用场景 oc…

批量抓取某电影网站的下载链接

思路&#xff1a; 进入电影天堂首页&#xff0c;提取到主页面中的每一个电影的背后的那个urL地址 a. 拿到“2024必看热片”那一块的HTML代码 b. 从刚才拿到的HTML代码中提取到href的值访问子页面&#xff0c;提取到电影的名称以及下载地址 a. 拿到子页面的页面源代码 b. 数据提…

Linux理解文件操作 文件描述符fd 理解重定向 dup2 缓冲区 C语言实现自己的shell

文章目录 前言一、文件相关概念与操作1.1 open()1.2 close()1.3 write()1.4 read()1.4 写入的时候先清空文件内容再写入1.5 追加&#xff08;a && a&#xff09; 二、文件描述符2.1 文件描述符 fd 0 1 2 的理解2.2 FILE结构体&#xff1a;的源代码 三、深入理解文件描述…

Vue 开发中的一些问题简单记录,Cannot find module ‘webpack/lib/RuleSet‘

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

【C语言】项目实践-贪吃蛇小游戏(Windows环境的控制台下)

一.游戏要实现基本的功能&#xff1a; • 贪吃蛇地图绘制 • 蛇吃食物的功能 &#xff08;上、下、左、右方向键控制蛇的动作&#xff09; • 蛇撞墙死亡 • 蛇撞自身死亡 • 计算得分 • 蛇身加速、减速 • 暂停游戏 二.技术要点 C语言函数、枚举、结构体、动态内存管…

【Java探索之旅】内部类 静态、实例、局部、匿名内部类全面解析

文章目录 &#x1f4d1;前言一、内部类1.1 概念1.2 静态内部类1.3 实例内部类1.4 局部内部类1.5 匿名内部类 &#x1f324;️全篇总结 &#x1f4d1;前言 在Java编程中&#xff0c;内部类是一种强大的特性&#xff0c;允许在一个类的内部定义另一个类&#xff0c;从而实现更好的…

Rust web简单实战

一、使用async搭建简单的web服务 1、修改cargo.toml文件添加依赖 [dependencies] futures "0.3" tokio { version "1", features ["full"] } [dependencies.async-std] version "1.6" features ["attributes"]2、搭…

网络攻击(Cyber Attacks)

目录 1.概念 2.分类 3.总结 1.概念 网络攻击&#xff08;Cyber Attacks&#xff0c;也称赛博攻击&#xff09;是指针对计算机信息系统、基础设施、计算机网络或个人计算机设备的&#xff0c;任何类型的进攻动作。对于计算机和计算机网络来说&#xff0c;破坏、揭露、修改、使…