C++ string类-2

at

at 函数是在C++还没有支持运算符重载的时候提供的。

 他可以像 [] 重载运算符一样,找到某个位置的字符:
 

	string s1("hello world");
	s1.at(0) = 'x';
	cout << s1 << endl;

输出:

 [] 重载运算符和 at()的区别就是,在范围处理上不同,如果 访问越界,[] 采用的是断言的方式进行处理的;而 at()采用的是抛出异常。

 抛出异常:

 断言处理:

 那么异常就可以捕获异常,然后对这个异常进行处理,程序可以继续运行;但是断言程序就不能继续执行了。

string类对象的修改操作

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+= (重点)在字符串后追加字符串str
c_str(重点)返回C格式字符串
find + npos(重点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

 += 重载运算符函数,就是在这个字符串之后再追加字符,或者是字符串。

 append()也是在字符串后面追加字符或者是字符串,只不过这个函数有多个接口:

 assign()是在给这个字符串赋值,也就是说,会覆盖掉之前在字符串当中存储的字符串或者字符,从0开始依次覆盖了:

 insert()支持在某下标位置插入字符或者字符串:

 insert()的效率不是很好,所以偶尔用是可以的,频繁用有效率的问题。

 erase()函数可以指定个数,指定位置 删除字符串当中的字符:

 上述给的 1 这个位置的参数就是 要删除的个数,这个位置的参数是有缺省值的,如果我们不给这个参数,那么就默认把这个位置后面的字符删光。

如果我们给的个数,超过了这个字符串的结尾,那么他也不会报错,会把后面的都删光,能删多少删多少。

上述的 erase()也是尽量少用,他也是有效率的问题。

 replace()在某一个区间当中,用传入的字符串替换到原字符串当中:

 c_str() 把这个string类的对象当中的字符串以c形式的方式返回:
 

	string s1("hello world");
	
	string filename = "text.txt";
	FILE* font = fopen(filename.c_str(), "r");

find()查找函数:

 他支持从 pos 位置开始寻找这个字符串或者是字符,这个pos位置是有缺省参数的,不传入pos的话 默认从 0 位置开始找。如果找到了,就返回第一个符合要求的,首字符下标,如果没有找到就返回 npos (-1)

比如下例子,我们要去把网址的 协议,域名,资源名切分出来:

	string url = "https://legacy.cplusplus.com/reference/string/string/find/";
	size_t pos1 = url.find("://");  // "://" 字符串之前的就是协议,其中 find 函数找到的是 ':' 这个字符的下标
	string protocaol;  // 存储域名的string类型的对象

	if (pos1 != string::npos) // find 函数如果寻找失败,返回 npos
	{
		protocaol = url.substr(0, pos1); // 把协议字符串 赋值给 protocaol
	}
	cout << protocaol << endl;

	size_t pos2 = url.find("/", pos1 + 3);
	string domain;
	string uri;

	if (pos2 != string::npos)
	{
		domain = url.substr(pos1 + 3, pos2 - (pos1 + 3));
	}
	cout << domain << endl;

	uri = url.substr(pos2 + 1);
	cout << uri << endl;

输出:

 rfind()函数,这个函数的功能和 find ()的功能完全是类似的,只不过find()是从前往后找,而find()是从后往前找。

 find_first_of()函数:

 传入一个字符串,或者是一个字符,从pos位置开始寻找(pos 缺省值 = 0)和传入的字符或者是字符字符串当中的任意一个字符相等的字符(第一个),找到之后返回这个字符的下标,如下在文档中给出的例子:

要求是把 字符串当中 "a" "e" "i" "o" "u" 的字符,全部改为 "*" :

std::string str ("Please, replace the vowels in this sentence by asterisks.");
  std::size_t found = str.find_first_of("aeiou");
  while (found!=std::string::npos)
  {
    str[found]='*';
    found=str.find_first_of("aeiou",found+1);
  }

  std::cout << str << '\n';

输出:

Pl**s*, r*pl*c* th* v*w*ls *n th*s s*nt*nc* by *st*r*sks.

上述是从前往后找的函数,还有一个函数和上述函数的功能是一样的,find_last_of()函数。

  当然,还有查找 不是传入的 字符串和 字符的函数:find_first_not_of 和 find_last_not_of ;

注意:

  • 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
  • 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。

 string类非成员函数

函数功能说明
operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>> (重点)输入运算符重载
operator<< (重点)输出运算符重载
getline (重点)获取一行字符串
relational operators (重点)大小比较

 字符串比较的重载运算符函数:

relational operators

 上述就是对应的接口,其实上述实现的接口,有限冗余,上述一个 重载运算符函数 重载了三个形参不同的函数,分别是 字符串类型 和 string 类 参数类型 变化,其实不用实现这么多,因为 如果是 string& 参数 传入 char* 类型的参数的时候,char* 在传参的时候可以隐式类型转换 为 string& 。

getline()函数和 C当中的 gets 有点像,我们在C++当中使用的 cin 输入流,和 C 当中的scanf()函数一样,当读到 空格 '\n'就会结束读入,那么我们上述cin 就不能读取字符串,所以我们就是用 getline ()来读入字符串。

例子,返回一个字符串当中,最后一个单词的 长度:

	string str;
	getline(cin, str);  // 读取字符串
	size_t pos = str.rfind(' ');
	if (pos != string::npos)
	{
		cout << str.size() - (pos + 1) << endl;
	}
	else
	{
		cout << str.size() << endl;
	}

getline 只 遇到 '\n' 才结束。

to_string  和  stoi

 

 to_string 可以把 内置类型 转换成string类型,这个函数返回的就是 string类型:
 

	string s1 = to_string(1234);
	string s2 = to_string(1.1);

	cout << s1 << endl;  //1234
	cout << s2 << endl; //1.100000

 如果是在C当中我们使用的是 itoa()函数把 int 类型转换成 字符串类型,但是这个函数不好用在于,接收的字符串类型,需要我们手动开空间。

 

如果是在 C 当中我们使用的是 atoi()来把 字符串类型转换成 int 类型:

 wstring , u16string ,u32string

 其实string是一个模板 typedef 出来的string。只不过这里面传入的是 char 类型:

 其实本源的类其实是 basic_string 这个类型,所以我们看到 关于string类的报错的时候,会看到     basic_string 字样。

 之所以这样做是因为,还有其他的string类型wstring , u16string ,u32string。

上述的本源也都是 basic_string。

上述三种类型其实不经常用,之所以把他区分开来是因为编码问题。

 我们现在经常使用的 编码格式 是 ascll 表的,就是 底层存储的值,对应的映射关系表。在计算机当中存储的值是二进制的,比如在 ascll 当中,一共就 200 多个,那么 8 个bite 位就可以存储了。存储的不同的二进制的值就代表着不同的字符,比如 0110 0000 对应的十进制是 97,那么这个二进制代表的就是 a 这个字符。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8自由度并联腿机器狗实现行走功能

1. 功能说明 本文示例将实现R309a样机8自由度并联腿机器狗行走的功能。 2. 并联仿生机器人结构设计 机器狗是一种典型的并联仿生四足机器人&#xff0c;其腿部结构主要模仿了四足哺乳动物的腿部结构&#xff0c;主要由腿部的节段和旋转关节组成。在设计机器狗的腿部结构时&…

echart实现地图展示

最近做的页面中需要展示省级地图精确到市级且悬浮到地区上时会显示一些信息 然后参考了网址&#xff1a; “绿色金融” - 江西省 - category-work,geo地理坐标,legend,series-map地图,series-scatter散点图,title标题,tooltip提示框,visualMap视觉映射 - makeapie echarts社区…

【玩转Linux操作】硬链接和软连接

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 欢迎大家访问“在下小吉.”&#xff08;偷偷告诉你这个是我的大号哦&#…

yolov8seg模型转onnx转ncnn

yolov8是yolo的最新版本&#xff0c;可做图像分类&#xff0c;目标检测&#xff0c;实例分割&#xff0c;姿态估计。 主页地址 这里测试一个分割模型。 模型如下 选yolov8n-seg模型&#xff0c;转成onnx&#xff0c;再转ncnn测试。 yolov8s-seg的ncnn版可以直接用这个 如果用…

【Django 网页Web开发】07. 快捷的表单生成 Form与MoudleForm(保姆级图文)

目录 注意 正规写法是 ModelForm&#xff0c;下面文章我多实现效果url.py新建3个html文件数据库连接model.py 数据表1. 原始方法view.pytestOrgion.html 2. Form方法view.pytestForm.html 3. MoudleForm方法给字段设置样式面向对象的思路&#xff0c;批量添加样式错误信息的显示…

搜索算法(三) 回溯法

1.回溯法 回溯法可以理解成一种特殊的深度优先算法&#xff0c;比起普通的DFS&#xff0c;多了还原当前节点的一步。 修改当前节点、递归子节点、还原当前节点。 本质是一种试错的思想。 维基百科&#xff1a; 2.例题 1&#xff09; 力扣https://leetcode.cn/problems/pe…

17_Linux根文件简介与Busybox构建文件系统

目录 根文件系统简介 文件目录简介 BusyBox简介 编译BusyBox构建根文件系统 修改Makefile添加编译器 busybox中文字符支持 配置 busybox 编译busybox 向根文件系统添加lib库 向rootfs的“usr/lib”目录添加库文件 创建其他文件夹 根文件系统初步测试 根文件系统简介…

行业应用|立仪光谱共焦位移传感器在玻璃方面的检测

项目&#xff1a;玻璃管管壁单边测厚 行业应用|立仪光谱共焦位移传感器在玻璃方面的检测 行业应用|立仪光谱共焦位移传感器在玻璃方面的检测 检测方案 用D35A7镜头对玻璃管管壁进行单边测厚&#xff0c;取三个点静态测量厚度并记录重复性。 1、采用D35A7R2S35镜头对玻璃管管…

Android Input子系统 - kernel

目录 前言 数据结构 输入子系统流程 前言 上一节有展示Android Input子系统的架构图,这里我们关心Linux kernel层 可以看到kernel层分为三层: 输入子系统设备驱动:处理与硬件相关的信息,调用input API注册输入设备,并把数据往上报 输入子系统核心层:为事件处理层和设…

Python之并发多线程操作

一、threading模块介绍 multiprocess模块的完全模仿了threading模块的接口&#xff0c;二者在使用层面&#xff0c;有很大的相似性 二、开启线程的两种方式 方式一 #方式一 from threading import Thread import time def sayhi(name):time.sleep(2)print(%s say hello %na…

迷你版ChatGPT开源,教你怎么用nanoGPT训练一个写小说的AI机器人!

大家好,我是千与千寻,好久不见,最近太忙了,去医院拔了颗智齿,这不是刚休息一天,就立刻来给大家分享ChatGPT的新奇项目了。 ChatGPT的功能确实是好用,但是我觉得有一个小缺点,就是反应的时间比较慢,原因是GPT-3.5/GPT-4.0的模型体积较大,比较占用内存空间。 同时大模…

10.ES6模块化规范(关键字 import,from,as,export的用法)

导入其他模块成员要使用关键字 import &#xff0c;导出需要使用关键字 export 我们明确一个概念&#xff0c;只有js与js之间需要使用import与export&#xff0c;如果是在html中引入js是不需要用import的&#xff0c;你导入的方式是直接srcxxx.js 目录 1 默认导入导出 2 …

【高危】Apache Inlong 存在JDBC反序列化漏洞

漏洞描述 Apache InLong 是可用于构建基于流式的数据分析、建模等一站式的海量数据集成框架。 在Apache Inlong受影响版本&#xff0c;由于未对接收的jdbcUrl参数过滤空格字符&#xff0c;导致可以利用空格绕过jdbcUrl中autoDeserialize参数过滤限制&#xff0c;通过认证的攻…

尚硅谷JUC极速版笔记

尚硅谷JUC极速版笔记 1、JUC概述1.1 进程和线程1.2 线程的状态&#xff08;6个&#xff09;1.3 wait和sleep1.4 并发与并行1.5 管程&#xff08;锁&#xff09;1.6 用户线程和守护线程 2、Lock接口2.1 复习synchronized&#xff08;java内置同步锁&#xff09;2.2 什么是Lock接…

设计模式详解之策略模式

作者&#xff1a;刘文慧 策略模式是一种应用广泛的行为型模式&#xff0c;核心思想是对算法进行封装&#xff0c;委派给不同对象来管理&#xff0c;本文将着眼于策略模式进行分享。 一、概述 我们在进行软件开发时要想实现可维护、可扩展&#xff0c;就需要尽量复用代码&#x…

LayUI前框框架普及版

LayUI 一、课程目标 1. 【了解】LayUI框架 2. 【理解】LayUI基础使用 3. 【掌握】LayUI页面元素 4. 【掌握】LayUI内置模块二、LayUI基本使用 2.1 概念 layui&#xff08;谐音&#xff1a;类UI) 是一款采用自身模块规范编写的前端 UI 框架&#xff0…

阿里云nginx配置https踩坑(配置完后访问显示无法访问此网站)

本人小前端一枚&#xff0c;最近在玩服务器部署自己的东西时踩了个坑&#xff01;&#xff01;&#xff01; server {listen 443 ssl;server_name localhost;ssl_certificate 证书.com.pem;ssl_certificate_key 证书.com.key;#后台管理静态资源存放location / { #文件目…

springboot+vue新闻稿件java在线投稿管理系统

本文介绍了新闻稿件管理系统的开发全过程。通过分析新闻稿件管理系统管理的不足&#xff0c;创建了一个计算机管理新闻稿件管理系统的方案。文章介绍了新闻稿件管理系统的系统分析部分&#xff0c;包括可行性分析等&#xff0c;系统设计部分主要介绍了系统功能设计和数据库设计…

微信小程序开发实战 ②②(全局数据共享)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

基于flask的web应用开发——访问漂亮的html页面以及页面跳转

目录 0. 前言1. html基本知识2. 编写html文本3. 在Flask中设置访问html4. 实现点击跳转 0. 前言 本节学习如何在flask应用程序下让用户访问你提前制作好的html页面 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;Pycahrm Comunity 2022.3 Python解释器版本&am…