C++回顾(十九)—— 容器string
19.1 string概述
-
1、string是STL的字符串类型,通常用来表示字符串。而在使用string之前,字符串通常是 用char * 表示的。string 与char * 都可以用来表示字符串,那么二者有什么区别呢。
-
2、string和 char * 的比较
(1)string是一个类, char*是一个指向字符的指针。
(2)string封装了char * ,管理这个字符串,是一个char * 型的容器。
(3)string不用考虑内存释放和越界。
(4)string管理char * 所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。 -
3、string提供了一系列的字符串操作函数(这个等下会详讲)
查找find,拷贝copy,删除erase,替换replace,插入insert
19.2 string构造
(1)默认构造函数:
string(); //构造一个空的字符串string s1。
(2)拷贝构造函数:
string(const string &str); //构造一个与str一样的string。如string s1(s2)。
(3)带参数的构造函数
string(const char *s); // 用字符串s初始化
string(int n,char c); // 用n个字符c初始化
例子:
完整示例代码:
#include <iostream>
#include <string>using namespace std;int main()
{string s1; //无参构造函数string s2("helloworld"); //有参构造函数string s3(10, 'a'); string s4(s2); //拷贝构造函数cout << s1 << endl; //重载了输出运算符 << cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;cin >> s1; //重载了输入运算符 >> cout << s1 << endl;s1 += "helloworld"; // 重载了 += 运算符if (s1 == s2) // 重载了 == 运算符{}s1 = s1 + s2; // 重载了 = 运算符return 0;
}
运行结果:
19.3 string使用
(1)string的存取字符操作:[ ] 或者 s.at( )
- string类的字符操作:
const char &operator[] (int n) const; // 常函数(不改变成员变量)
const char &at(int n) const; // 常函数(不改变成员变量)
char &operator[] (int n);
char &at(int n);
- operator[]和at()均返回当前字符串中第n个字符,但二者是有区别的。
主要区别在于at()在越界时会抛出异常,[ ]在刚好越界时会返回(char)0,再继续越界时,编译器直接出错。如果你的程序希望可以通过try,catch捕获异常,建议采用at()。
完整示例代码:
#include <iostream>
#include <exception>using namespace std;int main()
{string s("helloworld");cout << s[1] << endl; //重载了下标运算符s[1] = 'x';cout << s << endl;cout << s.at(1) << endl; //通过成员函数来访问下标为 1 的元素//cout << s[20000] << endl; //越界访问程序异常结束try{cout << s.at(10) << endl; //使用成员函数at(),越界访问会抛出异常}catch (exception &e){cout << e.what() << endl;}return 0;
}
运行结果:
(2)从string取得字符串首地址的操作:s.c_str( )
- const char *c_str() const; //返回一个以’\0’结尾的字符串的首地址
完整示例代码:
#include <iostream>
#include <string.h>
#include <string>using namespace std;int main()
{char buf[32] = {0};string s("helloworld");strcpy(buf, s.c_str()); //c_str()返回字符串的首地址cout << buf << endl;return 0;
}
运行结果:
(3)把string拷贝的操作:s.copy( )
把字符串s从第0给下标开始,拷贝5个字符到buf中去。
完整示例代码:
#include <iostream>
#include <string.h>using namespace std;int main()
{char buf[32] = {0};string s("helloworld");s.copy(buf, 5); //第二个参数表示拷贝5个字节,第三个参数是默认参数,拷贝的位置,默认是0cout << buf << endl;memset(buf, 0, sizeof(buf));s.copy(buf, 4, 5); // 拷贝四个字节,从下标为5的字符开始拷贝cout << buf << endl;return 0;
}
运行结果:
(4)string的长度:s.length() 与 s.empty()
完整示例代码:
#include <iostream>using namespace std;int main()
{string s("helloworld");cout << s.length() << endl;if (s.empty()){cout << "长度为空" << endl;}else{cout << "长度不为空" << endl;}return 0;
}
运行结果:
(5)string的赋值:重载的 = 运算符 与 s.assign()
示例代码:
#include <iostream>using namespace std;int main()
{string s1("helloworld");s1 = "hello"; //重载了=运算符cout << s1 << endl;const char *s = "this is test";s1.assign(s); // 把s这个字符串赋值给s1cout << s1 << endl;s1.assign(s, 7); // 把s这个字符串的前7个字符赋值给s1cout << s1 << endl;s1.assign(5, 'a'); //把5个a赋值给s1cout << s1 << endl;string s2("hey boy");s1.assign(s2); //把对象s2赋值给s1cout << s1 << endl;s1.assign(s2, 4, 3); // 把s2从第四个字符开始往后3个字符,赋值给字符串s1cout << s1 << endl;return 0;
}
运行结果:
(6)string字符串连接:重载 += 运算符 与 s.append()
示例代码:
#include <iostream>using namespace std;int main()
{string s1("helloworld");s1 += "1234"; //重载了 += 运算符cout << s1 << endl;string s2("abcdefg");s1 += s2;cout << s1 << endl;const char *s = "haha";s1.append(s);cout << s1 << endl;s1.append(s, 2); // 把 s 前两个字符加在s1后面cout << s1 << endl;s1.append(s2);cout << s1 << endl;s1.append(s2, 4, 2); // 把 s 第四个字符开始往后两个字符加在s1后面cout << s1 << endl;s1.append(10, 'x'); // 把10个x字符追加在字符串cout << s1 << endl;return 0;
}
运行结果:
(7)string的比较:s.compare()
示例代码:
#include <iostream>using namespace std;int main()
{string s1("helloworld");string s2("helloboy");const char *s = "hellogirl";if (s1.compare(s2) > 0){cout << s1 << " > " << s2 << endl;}if (s1.compare(s) > 0){cout << s1 << " > " << s << endl;}return 0;
}
运行结果:
(8)string的子串:s.substr()
示例代码:
#include <iostream>using namespace std;int main()
{string s("helloworld");cout << s.substr() << endl; // 返回完整的字符串scout << s.substr(5, 5) << endl; // 从下标五开始,往后五个字符return 0;
}
运行结果:
(9)string的查找和替换:s.find() 与 s.replace()
-
查找
int find(char c,int pos=0) const;
//从pos开始查找字符c在当前字符串的位置int find(const char *s, int pos=0) const;
//从pos开始查找字符串s在当前字符串的位置int find(const string &s, int pos=0) const;
//从pos开始查找字符串s在当前字符串中的位置注意:find函数如果查找不到,就返回-1
int rfind(char c, int pos=npos) const;
//从pos开始从后向前查找字符c在当前字符串中的位置
int rfind(const char *s, int pos=npos) const; int rfind(const string &s, int pos=npos) const;
//rfind是反向查找的意思,如果查找不到, 返回-1 -
替换
string &replace(int pos, int n, const char *s);
//删除从pos开始的n个字符,然后在pos处插入串s
string &replace(int pos, int n, const string &s);
//删除从pos开始的n个字符,然后在pos处插入串s
void swap(string &s2);
//交换当前字符串与s2的值
完整示例代码:
#include <iostream>
#include <string.h>using namespace std;int main()
{int p;string s1("helloworld");string s2("world");p = s1.find('o');cout << p << endl; // 4p = s1.find('x'); //不存在返回-1cout << p << endl; // -1p = s1.find('o', 5);cout << p << endl; // 6p = s1.find("ll");cout << p << endl; // 2p = s1.find(s2);cout << p << endl; // 5p = s1.rfind('o'); //反向查找(但是返回的位置还行从左边0开始)cout << p << endl; // 6s1.replace(5, 5, "xxx");cout << s1 << endl; // helloxxxxxs1.replace(5, 3, s2);cout << s1 << endl; // helloworldstring s3("helloworldhelloworldhelloworldhelloworld");p = s3.find("world");while (p != -1){s3.replace(p, strlen("world"), "x");p = s3.find("world", p + strlen("x"));}cout << s3 << endl;return 0;
}
运行结果:
(10)String的区间删除和插入:s.insert() 与 s.erase()
完整示例代码:
#include <iostream>using namespace std;int main()
{string s1("helloworld");string s2("12345");s1.insert(0, "this is ");// 从下标为0处,插入this iscout << s1 << endl; s1.insert(10, s2); // 从下标为10处,插入s2cout << s1 << endl; s1.insert(0, 5, 'x'); // 从下标为0处,插入5个xcout << s1 << endl;s1.erase(0, 20);cout << s1 << endl; // 删除下标0到20return 0;
}
运行结果:
相关文章:
C++回顾(十九)—— 容器string
19.1 string概述 1、string是STL的字符串类型,通常用来表示字符串。而在使用string之前,字符串通常是 用char * 表示的。string 与char * 都可以用来表示字符串,那么二者有什么区别呢。 2、string和 char * 的比较 (1)…...
Hadoop入门
数据分析与企业数据分析方向 数据是什么 数据是指对可观事件进行记录并可以鉴别的符号,是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合,它是可以识别的、抽象的符号。 他不仅指狭义上的数字,还可以是具有一…...
高校如何通过校企合作/实验室建设来提高大数据人工智能学生就业质量
高校人才培养应该如何结合市场需求进行相关专业设置和就业引导,一直是高校就业工作的讨论热点。亘古不变的原则是,高校设置不能脱离市场需求太远,最佳的结合方式是,高校具有前瞻性,能领先市场一步,培养未来…...
提升学习 Prompt 总结
NLP现有的四个阶段: 完全有监督机器学习完全有监督深度学习预训练:预训练 -> 微调 -> 预测提示学习:预训练 -> 提示 -> 预测 阶段1,word的本质是特征,即特征的选取、衍生、侧重上的针对性工程。 阶段2&…...
JavaScript学习笔记(2.0)
BOM--(browser object model) 获取浏览器窗口尺寸 获取可视窗口高度:window.innerWidth 获取可视窗口高度:window.innerHeight 浏览器弹出层 提示框:window.alert(提示信息) 询问框:window.confirm(提示信息) 输…...
直击2023云南移动生态合作伙伴大会,聚焦云南移动的“价值裂变”
作者 | 曾响铃 文 | 响铃说 2023年3月2日下午,云南移动生态合作伙伴大会在昆明召开。云南移动党委书记,总经理葛松海在大会上提到“2023年,云南移动将重点在‘做大平台及生态级新产品,做优渠道转型新动能,做强合作新…...
STM32F1开发实例-振动传感器(机械)
振动(敲击)传感器 振动无处不在,有声音就有振动,哒哒的脚步是匆匆的过客,沙沙的夜雨是暗夜的忧伤。那你知道理科工程男是如何理解振动的吗?今天我们就来讲一讲本节的主角:最简单的机械式振动传感器。 下图即为振动传…...
2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建
去年公司由于不断发展,内部自研系统越来越多,所以后来搭建了一个日志收集平台,并将日志收集功能以二方包形式引入自研系统,避免每个自研系统都要建立一套自己的日志模块,节约了开发时间,管理起来也更加容易…...
2023-3-10 刷题情况
打家劫舍 IV 题目描述 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大…...
如何建立一个成功的MES?
制造执行系统(MES)是一种为制造业企业提供实时生产过程控制、管理和监视的信息系统。一个成功的MES系统可以帮助企业提高生产效率,降低成本,提高产品质量,提高客户满意度等。下面是一些关键步骤来建立一个成功的MES系统…...
Kafka生产者幂等性/事务
Kafka生产者幂等性/事务幂等性事务Kafka 消息交付可靠性保障: Kafka 默认是:至少一次最多一次 (at most once) : 消息可能会丢失,但绝不会被重复发送至少一次 (at least once) : 消息不会丢失,但有可能被重复发送精确一次 (exact…...
JavaWeb--案例(Axios+JSON)
JavaWeb--案例(AxiosJSON)1 需求2 查询所有功能2.1 环境准备2.2 后端实现2.3 前端实现2.4 测试3 添加品牌功能3.1 后端实现3.2 前端实现3.3 测试1 需求 使用Axios JSON 完成品牌列表数据查询和添加。页面效果还是下图所示: 2 查询所有功能 …...
css制作动画(动效的序列帧图)
相信 animation 大家都用过很多,知道是 CSS3做动画用的。而我自己就只会在 X/Y轴 上做位移旋转,使用 animation-timing-function 规定动画的速度曲线,常用到的 贝塞尔曲线。但是这些动画效果都是连续性的。 今天发现个新功能 animation-timi…...
【设计模式】装饰器模式
装饰器模式 以生活中的场景来举例,一个蛋糕胚,给它涂上奶油就变成了奶油蛋糕,再加上巧克力和草莓,它就变成了巧克力草莓蛋糕。 像这样在不改变原有对象的基础之上,将功能附加到原始对象上的设计模式就称为装饰模式(D…...
Nginx配置实例-反向代理案例一
实现效果:使用nginx反向代理,访问 www.suke.com 直接跳转到本机地址127.0.0.1:8080 一、准备工作 Centos7 安装 Nginxhttps://liush.blog.csdn.net/article/details/125027693 1. 启动一个 tomcat Centos7安装JDK1.8https://liush.blog.csdn.net/arti…...
Java中IO流中字节流(FileInputStream(read、close)、FileOutputStream(write、close、换行写、续写))
IO流:存储和读取数据的解决方案 纯文本文件:Windows自带的记事本打开能读懂 IO流体系: FileInputStream:操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来 书写步骤:①创建字节输入流对象 …...
C#完全掌握控件之-combbox
无论是QT还是VC,这些可视化编程的工具,掌握好控件的用法是第一步,C#的控件也不例外,尤其这些常用的控件。常见控件中较难的往往是这些与数据源打交道的,比如CombBox、ListBox、ListView、TreeView、DataGridView. 文章…...
STL的空间配置器(allocator)
简答: 在CSTL中,空间配置器便是用来实现内存空间(一般是内存,也可以是硬盘等空间)分配的工具,他与容器联系紧密,每一种容器的空间分配都是通过空间分配器alloctor实现的。 解析: 1.两种C类对象实例化方式的异同在c中&a…...
linux系统莫名其妙的环境变量问题
今天使用Ubuntu20.04系统,使用less命令查看日志,发现日志中的“中文”显示为乱码; 使用vim命令查看该日志文件也显示为乱码; 使用more命令查看该日志文件则显示正常。 首先查询系统的字符集编码,发现编码正常支持中…...
使用 Microsoft Dataverse 简化的连接快速入门
重复昨天本地部署dynamics实例将其所有的包删除之后,再次重新下载回来。运行填写跟之前登陆插件一样的信息点击login 然后查看控制台,出现这样就说明第一个小示例就完成了。查看你的dy365平台下的 “我的活动”就可以看到刚刚通过后台代码创建的东西了。…...
PLSQL Developer 安装指南
PLSQL Developer 是 Oracle 的客户端。 下面以64位破解版的PLSQL Developer为例,进行PLSQL Developer 安装讲解。 0. 下载 PLSQL Developer https://download.csdn.net/download/Shipley_Leo/87557938 1. 根据操作系统选择对应“plsqldev.exe”可执行文件ÿ…...
腾讯云企业网盘2.5版本全新发布啦!!!
腾讯云企业网盘又又又更新啦!本期重点打磨管理协同、企业安全守护能力,同时也不断强化自身产品体验,助力企业高效办公~那么,此次更新具体有什么安全可靠的新功能呢?今天就带大家一起解锁~01协同管理,提升工…...
Excel职业版本(4)
图表 图表基本结构 组成元素 图表的分类 柱状图 介绍:在竖直方向比较不同类型的数据 适用场景:用于二维数据集,对于不同类型的数据进行对比,也可用于同一类型的数据在不同的时间维度的数据对比,通过柱子的高度来反…...
3-2 SpringCloud快速开发入门:Ribbon 实现客户端负载均衡
接上一章节Ribbon 是什么,这里讲讲Ribbon 实现客户端负载均衡 Ribbon 实现客户端负载均衡 由于 Spring Cloud Ribbon 的封装, 我们在微服务架构中使用客户端负载均衡调用非常简单, 只需要如下两步: 1、启动多个服务提供者实例并…...
ChatGPT,乌合之众的疯狂
最近ChatGPT有多火爆就不用我说了。公司里,从CEO到技术人员,乃至于门口的保安、食堂的大婶,没有一个不会聊两句ChatGPT的。连我20年未见的小学同学、三线城市警官,都问我这东西能不能给领导写汇报材料。 用不了多久,家…...
代码随想录刷题-数组-长度最小的子数组
文章目录长度最小的子数组习题暴力解法滑动窗口长度最小的子数组 本节对应代码随想录中:代码随想录,讲解视频:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili 习题 题目链接:209. 长度最小的子数…...
成功解决安装MySQL5.7提示公钥GPG密钥配置为file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
前言 大家好,我是沐风晓月,今天做MySQL5.7安装的时候遇到问题了,我们一起来复盘下这个问题,如果你使用我的方法没有解决,一定要留言给我,我们一起来排查和学习和完善。 本文收录于csdn 我是沐风晓月的专栏 【日常遇到的疑难问题和bug解决】 ,若点击无法跳转,请在csdn …...
vue配置环境变量
目录 创建配置文件 .env.development 文件 .env.production 文件 .env.dev 文件 使用变量 配置 package.json 文件 例子:在 api.js 使用 可以继续添加 创建配置文件 在根目录与 package.json 同级创建文件 .env.development、 .env.production、.env.dev 文件…...
js学习3(数组)
目录 结构图 数组操作 每日一练 结构图 数组操作 ## 数组中可以存储任何类型元素 ## 创建: 字面量([...])、创建对象(new Array(arr_len)) ## 遍历: 循环遍历、forEach(callback)、map(callback)、filter(callback)、every(callback)、some(callback)、…...
不用写代码也能开发,产品经理是怎么做到的?
产品经理再也不用求开发了……就在前几天,我做的小程序上线了! 从产品原型设计,前端开发后端开发,产品部署到运维,都是由我1个人完成的。 我是啥时候学会写代码的呢?不瞒你说,我一行代码都没写…...
柳州企业网站开发公司/网站管理和维护的主要工作有哪些
辉芒微单片机 单片机全系列 MTP制程可反复烧录 产品包括: FT60F02X FT60F021-RB FT60F022-RB FT60F023-RB FT60F024-RB FT60F024-DRB FT60F025-TRB FT60F02F-ERB FT60F01X FT60F010A-URB FT60F011A-RB FT60F22X FT60F223-RB FT60F227-RB 更多资料请联系唐…...
成都高端网站建设公司/北京seo顾问服务公司
最近工作的事情忙的我焦头烂额,经常出差,晚上回到家已经是凌晨一两点钟了。然后在这忙碌生活的背后,有一种不太充实的感觉,自己当初定下来的一些目标还没有去实施,特别是当初“三分钟热情”的学习没有好好地坚持下去&a…...
网站现在如何做推广/站长工具权重查询
大王是谁,大王当然就是我自己。 开玩笑,认真点说开园是为了督促自己学习,记录自己的经历,多一条让他人了解我的渠道。思维习惯了零和游戏,做点双赢的事情来扭转一下模式。新年坚持做一些事,来点实在的改变。…...
做网站挂靠服务器什么好/百度联系方式
目录前言一、报错截图?二、解决步骤总结前言 项目中遇到问题:前端控制台报错#Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘0‘) 提示:以下是本篇文章正文内容,下面案例可供参考 一、报错…...
比较冷门的视频网站做搬运/seo工具优化软件
1.CSS3动画 CSS3动画简介 通过改变元素的属性值来实现动画效果的。 animation实现动画主要由两部分组成:通过类似flash动画的关键帧来生明一个动画;在animation属性中调用关键帧声明的动画实现一个更为复杂的动画效果 animation属性的浏览器兼容性 CSS3…...
wordpress origin 下载/googleplay
在网上看了一篇介绍Lua面向对象的文件,觉得十分重要,于是把重点摘录下来。原文在http://blog.csdn.net/guang11cheng/article/details/7547253元表概念Lua中,面向对向是用元表这种机制来实现的。元表是个很“道家”的机制,很深遂&…...