Day05 C++STL入门基础知识三——String容器(上)概念-构造-赋值-拼接-查找-替换【全面深度剖析+例题代码展示】

news2025/1/16 20:58:59

文章目录

  • 1. 基本概念
    • 1.1 本质
    • 1.2 string与char*的区别
    • 1.3 特点
  • 2. 构造函数
    • 2.1 四种构造
    • 2.2 举例展示
  • 3. 赋值操作
    • 3.1 七种赋值函数原型(operator等号赋值/assign成员函数赋值)
    • 3.2 举例展示
  • 4. 拼接操作
    • 4.1 七种拼接函数原型
    • 4.2 举例展示
  • 5. 查找操作
    • 5.1 八种查找函数原型
    • 5.2 find和rfind 相同点和区别
    • 5.3 举例展示
  • 6. 替换操作
    • 6.1 两种函数原型
    • 6.2 举例展示
    • 6.3 深度思考
  • 7. 今日完成情况
  • 8. 明天任务计划
  • 埋下的种子终会开花!

请不要相信,胜利像山坡上的蒲公英那样唾手可得!但请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!

1. 基本概念

1.1 本质

  • string是C++中的字符串,本质是一个类

1.2 string与char*的区别

那有小伙伴会问了,C++中的string和C中的char*有区别呢???

答案如下:

  • char* 是一个指针
  • string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器,使用时需加头文件#include<string.h>

1.3 特点

  • string类内部封装了很多成员方法(举几个常见的例子)
    • find 查找
    • copy 构造
    • delete 删除
    • replace 替换
    • insert 插入
  • string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责

2. 构造函数

2.1 四种构造

  1. 无参(默认)构造
    string(); 直接创建一个空的字符串
  2. 传参构造
    string(const char* s); 通过传入C的字符串来构造出C++的string类型字符串
  3. 拷贝构造
    string(const string& str); 通过一个已知的string类型的str初始化另一个string对象
  4. 字符构造(需要给定字符的个数n)
    string(int n,char ch); 通过n个字符ch进行初始化

2.2 举例展示

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
//string的构造函数

void text01() {
	string s1;	//默认构造
	
	const char *str = "123abc";
	string s2 (str); //传参构造
	cout << "s2=" << s2 << endl;

	string s3(s2); //拷贝构造 
	cout << "s3=" << s3 << endl;

	string s4(8, 'x');
	cout << "s4=" << s4 << endl;
}

int main() {
	text01();
}

在这里插入图片描述

3. 赋值操作

3.1 七种赋值函数原型(operator等号赋值/assign成员函数赋值)

  1. string& operator=(const char*s);
    char*类型的字符串,直接赋值给当前的字符串
  2. string& operator=(const string&s);
    把字符串s直接赋给当前的字符串
  3. string& operator=(char c);
    把字符赋给当前的字符串
  4. string& assign=(const char*s);
    把字符串s赋值给当前字符串
  5. string& assign=(const char*s,int n);
    把字符串s的前n个字符赋值给当前字符串
  6. string& assign=(cosnt string&s);
    把字符串s赋值给当前字符串
  7. string& assign=(int n,char c);
    把n个字符c赋给字符串

3.2 举例展示

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
//string赋值操作
void text01() {
	string s1;
	s1 = "hello world";
	cout << "s1=" << s1 << endl;
	//直接用等号将"hello world"赋值给s1

	string s2;
	s2 = s1;
	cout << "s2=" << s2 << endl;
	//用等号的引用传递将s1赋值给s2
	
	string s3;
	s3 = 'a';
	cout << "s3=" << s3 << endl;
	//直接用等号传字符给s3

	string  s4;
	s4.assign("Hi,friends!");
	cout << "s4=" << s4 << endl;
	//用成员函数将"Hi,friends!"赋给s4

	string s5;
	s5.assign("helloworld", 5);
	cout << "s5=" << s5 << endl;
	//用成员函数将"helloworld"的前5个字符赋给s4

	string s6;
	s6.assign(s5);
	cout << "s6=" << s6 << endl;
	//用成员函数将s5赋给s6

	string s7;
	s7.assign(8, 'k');
	cout << "s7=" << s7 << endl;
	//用成员函数将8个k赋给s7
}

int main() {
	text01();
}

在这里插入图片描述

4. 拼接操作

4.1 七种拼接函数原型

  1. string& operator+=(const char*s);
    重载+=操作符,结尾处拼接一个字符串
  2. string& operator+=(char c);
    重载+=操作符,结尾处拼接一个字符
  3. string& operator+=(const string&s);
    重载+=操作符,结尾处拼接一个为s的字符串
  4. string& assign=(const char*s);
    把字符串s连接到当前字符串结尾
  5. string& assign=(const char*s,int n);
    把字符串s的前n个字符连接到当前字符串结尾
  6. string& assign=(cosnt string&s);
    同operator+=(const string& str)
  7. string& assign=(const string&s,int pos,int n);
    字符串s中从pos开始的n个字符连接到字符串结尾

4.2 举例展示

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;

void text01() {
	//用 “+=” 运算符
	string s1 = "二〇二三,";
	s1 += "跟着阿亮学STL";
	cout << "s1=" << s1 << endl;
	//拼接一个字符串

	s1 += '!';
	cout << "s1=" << s1 << endl;
	//拼接一个字符

	string s2 = "行嘛?";
	s1 += s2;
	cout << "s1=" << s1 << endl;
	//用+=拼接一个string类型的字符串
}

void text02() {
	string s1 = "I";
	s1.append(" Love ");
	cout << "s1=" << s1 << endl;
	//直接拼接字符串

	s1.append("You.wQ12ea0=adjf", 4);
	cout << "s1=" << s1 << endl;
	//拼接字符串前n个字符

	string s2 = " And do you love me, too??? ";
	s1.append(s2);
	cout << "s1=" << s1 << endl;
	//用.append拼接一个string类型的字符串

	string s3 = "I love, but ……";
	s1.append(s3, 0, 6);
	cout << "s1=" << s1 << endl;
	//从s3的第0个字符,向后截取6个字符
	//string& assign=(const string&s,int pos,int n);
	//从字符串的pos开始截取,向后截取n个字符
}

int main() {
	text01();
	cout << endl;
	text02();
	return 0;
}

在这里插入图片描述
在这里插入图片描述

5. 查找操作

5.1 八种查找函数原型

  • int find(const string& str,int pos = 0) const; 查找str第一次出现位置,从pos开始查找
  • int find(const char*s, int pos = 0) const; 查找s第一次出现的位置,从pos开始查找
  • int find(const char*s, int pos, int n) const; 从pos位置查找s的前n个字符第一次位置
  • int find(const char c, int pos = 0) const; 查找字符c第一次出现的位置
  • int rfind(const string& str,int pos = npos) const; 查找str最后一次出现位置,从pos开始查找
  • int rfind(const char*s, int pos = npos) const; 查找s最后一次出现的位置,从pos开始查找
  • int rfind(const char*s, int pos, int n) const; 从pos位置查找s的前n个字符最后一次位置
  • int frind(const char c, int pos = 0) const; 查找字符c最后一次出现的位置

5.2 find和rfind 相同点和区别

  • 相同点:
    • find和rfind查找字符串时默认都是返回int类型的下标的值,找到立即停止,不会再往下继续找
    • 如果查找不到,则返回-1
  • 不同点:
    • find是从左往右查找,找的是第一次出现的位置;rfind是从右往左查找,找最后一次出现的位置
    • 如果不特别标明pos,find默认从第一个字符开始索引,rfind默认从最后一个开始索引

5.3 举例展示

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
//字符串查找
void text01() {
	//用find查找
	
//	默认从下标为0处开始查找第一次出现的位置
	string s1 = "abcdefgbc";
	int pos1 = s1.find("bc");	
	cout << "pos1=" << pos1 << endl;
	
//从下标为2处开始查找,找不到返回-1
	int pos11=s1.find("bc",2);
	cout << "pos1=" << pos11 << endl;
	
//表示从s2下标为0处找字符串前4个字符第一次的位置
	string s2 = "abcdefgfabceabc";
	int pos2 = s1.find("abcef", 0 , 4);
	cout << "pos2=" << pos2 << endl;

	//表示从s1下标为5处开始找第一次出现字符f的位置
	int pos3 = s1.find('f' , 5);
	cout << "pos3=" << pos3 << endl;
}


void text02() {
	//用refind查找

	//默认从最后一个元素开始往前查找字符串最后一次出现的位置
	string s1 = "abcdefgabcabdersdabcdefsbfabh";
	int pos1 = s1.rfind("d2e");
	cout << "pos1=" << pos1 << endl;
	
	//从下标为pos开始向前查找字符串最后一次出现的位置,找不到返回-1
	int pos2 = s1.rfind("def", 2);
	int pos22 = s1.rfind("def", 18);
	cout << "pos2=" << pos2 << endl;
	cout << "pos22=" << pos22 << endl;

	//从下标为pos开始向前查找字符串的前n个字符最后一次位置
	int pos3 = s1.rfind("abcdtyrref", 30, 4);
	cout << "pos3=" << pos3 << endl;

	//从下标为pos处向前索引找到字符c最后一次出现的位置
	int pos4 = s1.rfind('c', 21);
	cout << "pos4=" << pos4 << endl;
}

int main() {
	text01();	
	cout << "----------------------------------------------------" << endl;
	text02();
	return 0;
}

在这里插入图片描述

6. 替换操作

6.1 两种函数原型

  • string& replace(int pos, int n, const string& str); 替换从pos开始n个字符为字符串str
  • string& replace(int pos, int n, const char*s); 替换从pos开始的n个字符为字符串s
  • 解释为从……位置起,多少个字符,替换为……的字符串

6.2 举例展示

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
void text01() {
	//从下标为1处替换字符串的前3个字符,则"bcd"改为"123",s1="a123efg"
	string s1 = "abcdefg";
	s1.replace(1, 3,"123");
	cout << "s1=" << s1 << endl;
}
int main() {
	text01();
	return 0;
}

在这里插入图片描述

6.3 深度思考

  • string& replace(int pos, int n, const char*s);

所替换的字符串s中字符的个数小于等于n的值还好说(即所替换字符串数比原字符串str需要换的字符数比小,直接替换即可)(也就是要的多,给的少,多换少,直接换进行),但如果所替换的字符串s中字符的个数大于需要替换字符的个数n的值怎么办呢???(即要换的少,给你的多,少换多,你是一个字符换一个字符这么算还是直接删去原来较少的字符,全部换成较多的字符)

举个例子来说

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
void text02() {
	string s2 = "abcdefg";
	s2.replace(1, 3, "1234");
	cout << "s2=" << s2 << endl;
	//答案是"a123efg"还是"a1234efg"
}
int main() {
	text02();
	return 0;
}

在这里插入图片描述

正确思路为从1号位置起的3个字符"bcd"替换为”1234“,即先删掉原字符串的字符,再直接把替换的加上

7. 今日完成情况

今天上午一直在串门,没有太长时间,也没学太多QAQ

  • 线性代数第一章第三节课程+习题
  • STL中string容器(上)
  • 每日一题

8. 明天任务计划

  • 线性代数第一章第四、五节+习题
  • STL中string容器(下)、vector容器、deque容器
  • 每日一题
  • Java第三章

埋下的种子终会开花!

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

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

相关文章

分布式概念

目录一、什么是分布式二、分布式与集群的关系三、软件架构演变四、RPC是什么1.RPC思想原理2.服务之间的交互可以用两种方式五、分布式思想与基本概念1.高并发2.高可用3.注册中心4.负载均衡5.服务雪崩6.熔断7.限流8.API网关9.服务跟踪10.弹性云一、什么是分布式 《分布式系统原…

Python流程控制语句之循环语句

上一篇&#xff1a;Python流程控制语句之选择语句 文章目录前言一、while 循环二、for 循环1. 进行数值循环2. 遍历字符串三、循环嵌套总结前言 生活中很多问题都无法一次解决&#xff0c;就像谚语所说&#xff1a;罗马不是一天建成的。一些事物必须周而复始地运转才能保证其存…

linux并发控制详解

目录 1.并发控制 1.1.并发概念 1.2.并发问题 2.多CPU核心 3.解决 4.中断屏蔽 5.原子操作 6.自旋锁 7.自旋锁衍生读写自旋锁 7.1.自旋锁与读写自旋锁的对比&#xff1a; 8.读写自旋锁衍生顺序锁 9.RCU 10.信号量 11.互斥体&#xff08;互斥锁&#xff09; 11.1.互…

2023起点上,一段迷茫的自我倾诉

大家新年快乐。 回顾记忆中渐渐远去的2022。 我曾想象随着一年过去我就能取得很大的进步&#xff0c;“彻底”改变自己的生活状态。其实不过幻想罢了&#xff0c;人才不会无缘无故进步呢。 我曾一度沉溺于网络世界中的关注&#xff0c;想象着自己将可以取得一些成就&#xff…

【每日一道智力题】三个火枪手(快来看人生哲理)

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的激励…

Qt 之 QSystemTrayIcon

文章目录一、QSystemTrayIcon是什么二、属性三、公共类型四、信号提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、QSystemTrayIcon是什么 QSystemTrayIcon类为应用程序在系统托盘中提供一个图标。 如下图&#xff1a; 现代操作系统通常在桌面上提…

“深度学习”学习日记。与学习有关的技巧--Bacth Normalization

2023.1.25 现在已经学习过了&#xff0c;如果我们设置了合适的权重初始值&#xff0c;则各层的激活值分布会呈现适当的广度&#xff0c;从而可以时神经网络模型顺利的进行学习。 而 batch normalization算法 的思想就是为了使得各层有适当的广度&#xff0c;“强制性”地调整…

No package ‘vips‘ found系列问题解决方案

目录 系列报错集合 错误1 错误2 错误3 解决方案清单 系列报错集合 错误1 No package vips found Package vips was not found in the pkg-config search path. Perhaps you should add the directory containing vips.pc to the PKG_CONFIG_PATH environment variable N…

医疗实体及关系识别挑战赛

赛题概要 请本赛题排行榜前10的队友通过作品提交源代码&#xff0c;模型以及说明文档&#xff0c;截止时间为09/27/23:59:59.若文件过大&#xff0c;可发送至官网邮箱&#xff1a;AICompetitioniflytek.com。若截止时间内未提交&#xff0c;官方回通过电话联系相关选手&#x…

JavaEE8-Bean的生命周期

目录 1.Bean执行原理分析 2.Bean生命周期 2.1.实例化Bean&#xff1a;为Bean分配内存空间。&#xff08;相当于买房&#xff0c;从无到有&#xff09; 2.2.设置属性&#xff1a;Bean注入和装配。&#xff08;执行依赖类的注入&#xff1a;A需要使用B的方法&#xff0c;先初…

win32com操作word API精讲 第六集 Range(四)对齐和缩进

本课程《win32com操作word API精讲&项目实战》同步在B站、今日头条、视频号及本公众号发布。其中本平台以发布文字教程为主&#xff0c;所有平台ID均为&#xff1a;一灯编程 今天是大年初二&#xff0c;一灯在此祝愿各位朋友兔年吉祥&#xff0c;达成所想。 本节课主要讲解…

机器学习(六):模型评估

文章目录 模型评估 一、分类模型评估 二、 回归模型评估 三、拟合 1、欠拟合 2、过拟合 模型评估 模型评估是模型开发过程不可或缺的一部分。它有助于发现表达数据的最佳模型和所选模型将来工作的性能如何。 按照数据集的目标值不同&#xff0c;可以把模型评估分为分类…

Python信用卡欺诈检测 [TensorFlow]

Python信用卡欺诈检测 [TensorFlow] 提示&#xff1a;前言 Python 信用卡欺诈检测 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录Python信用卡欺诈检测 [TensorFlow]前言一、导入包二、加载数据三、加载数据四、 …

WebAssembly编译之(1)-asm.js及WebAssembly原理介绍

WebAssembly介绍及产生历程 1、什么是WebAssembly、为什么WASM&#xff1f; 我们知道Web的应用几乎涵盖了大半个互联网应用&#xff1b;越多越多的Web应用层出不穷&#xff0c;而然Web最致命的劣势就是其在浏览其的运行效率特忙&#xff0c;尤其是web游戏的体验不佳。 而Web…

ubuntu安装Espeak实现tts文字转语音

目录参考一、介绍二、安装安装包安装查看安装版本和espeak-data路径直接尝试安装中文包三、生产wav文件四、代码引入参考 ubuntu完美安装espeak支持中文和粤语 不再报错:Full dictionary is not installed for ‘zh’ 一、介绍 **用途&#xff1a;**可识别多语言的朗读软件 …

JavaEE day4 初识CSS

HTML如果说是前端网页中的骨架 那么CSS就是用来对骨架进行排版美化的、 CSS全称为 Cascading Style Sheets 层叠样式表 预备知识&#xff1a; html中的所有元素都有两个通用的属性&#xff1a;id和class id&#xff1a;唯一标识符&#xff0c;一个html组成元素中&#xff…

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】

Leave no stone unturned. 竭尽全力 文章目录1. 基本概念1.1 功能1.2 与普通数组相同点与不同点1.3 动态扩展2. 构造函数2.1 功能描述2.2 函数原型2.3 代码展示3. 赋值操作3.1 函数原型3.2 代码展示4. 容量及大小4.1 函数原型4.2 代码展示4.2.1 empty()4.2.1.1 代码展示4.2.1.2…

恶意代码分析实战 1 静态分析基础技术

1.1 Lab 1-1 对Lab01-01.exe和Lab01-01.dll进行分析 问题 将文件上传至http://www.VirusTotal.com进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗? 首先查看Lab-01-01.exe。 然后查看Lab01-01.dll。 这两个文件应该都是恶意文件。 这些文件是什么时候编译的?…

20230125英语学习

Office Buzzwords You’re Using That Annoy All Your Co-workers 说话之道&#xff1a;避开办公室行话的“雷区” Joining a new office means having to learn how to communicate with your team.But in order to do that well, it sometimes means having to learn your …

索引优化示例

目录 1.单表优化 2.两表优化 3.三表优化 4.总结 1.单表优化 创建索引前 (1)先按照where条件创建索引 按照查询条件中的三个项目创建索引&#xff0c;并且索引中的项目存在顺序&#xff0c;分别是1,2和3。 (2)创建索引 type 变成了 range,这是可以忍受的。但是 extra 里使用…