【C++第三阶段】string容器

以下内容仅为当前认识,可能有不足之处,欢迎讨论!


文章目录

  • string容器
    • 基本概念
    • 构造函数
    • 赋值操作
    • 拼接操作
    • 字符串查找和替换
    • 字符串比较
    • 字符串存取
    • 字符串插入和删除
    • 字符串子串


string容器

基本概念

本质👉string是C++风格的字符串,string本质上是一个类。

string VS char *

char *是一个指针。

string是类,里面封装char* , 类管理该字符串,是一个char*型的容器。

特点:

string类内部封装很多成员方法,例如查找find , 拷贝copy , 删除delete , 替换replace ,插入insert。

string管理char*分配内存,不用担心复制越界和取值越界等,由类内部负责。

构造函数

无参构造,字符串初始化,拷贝构造函数,以及n字符c初始化。

n字符c必须要是单引号。

以下是代码示例。

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

void test0403() {
	//先定义一个常量字符串
	const char* str = "hello world";

	//无参构造函数
	string no_param_str;

	//有参构造函数
	string param_str(str);

	//拷贝构造函数
	string copy_str(param_str);

	//n字符c构造函数
	string nc_str( 10,'?');

	cout << "无参构造:" << no_param_str << endl;
	cout << "有参构造:" << param_str << endl;
	cout << "拷贝构造:" << copy_str << endl;
	cout << "n字符c构造:" << nc_str << endl;


}

int main() {

	test0403();

	system("pause");
	return 0;
}

运行截图:

image-20240403164039020

赋值操作

提供7种赋值操作。方法为自己写的myAssign

const char *s 是双引号的字符出串,const string &s是单独的字符串变量名字。

  • char * 类型字符串,赋值给当前的字符串
  • string & operator =(const char *s);
  • 把字符串s赋值给当前的字符串
  • string & operator=(const string &s);
  • 字符赋值给当前的字符串
  • string & operator=(char c);
  • 把字符串赋给当前的字符串
  • string & assign(const char *s);
  • 把字符串s的前n个字符赋值给当前的字符串
  • string & assign(const char *s,int n );
  • 把字符串赋值给当前字符串
  • string & assign(const string &s);
  • 用n个字符c赋值给当前字符串
  • string & assign(int n , char c);
void myAssign() {
	string str_a = "hello"; //1.
	string str_b = str_a;  //2.

	//string& operator = (const string & str);
	string str_c;
	str_c = 'a';

	string str_d;
	str_d.assign(str_c);

	//char *b = 'abcdefg';
	string str_e;
	str_e.assign("hello,world", 11);

	string str_f;
	str_f.assign(str_e);

	string str_g;
	str_g.assign(str_e,0 ,5); //从0到4,5个字符

	string str_h;
	str_h.assign(5, 'w');

	cout << "str a = " << str_a <<" . " <<endl;
	cout << "str b = " << str_b <<" . " <<endl;
	cout << "str c = " << str_c <<" . " <<endl;
	cout << "str d = " << str_d <<" . " <<endl;
	cout << "str e = " << str_e <<" . " <<endl;
	cout << "str f = " << str_f <<" . " <<endl;
	cout << "str g = " << str_g <<" . " <<endl;
	cout << "str h = " << str_h << " . " << endl;



}

image-20240407203653931

拼接操作

提供7种拼接操作。

  • 直接拼接字符数组

  • string & operator+=(const char * str);

  • 拼接单个字符

  • string & operator+=(const char c);

  • 拼接字符串

  • string & operator +=(const string & str);

  • 追加至末尾单个字符

  • string & append(const char *s);

  • 追加字符串的前n个字符至当前字符末尾

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

  • 追加字符串

  • string & append(const string &s);

  • 从pos位置开始,追加n个字符到当前字符串末尾

  • string & append(const string &s , int pos , int n);

void myAppend() {
	string str = "aaa";
	cout << "str = " << str << endl;

	
	str += 'b';
	cout << "str = " << str << endl;

	str += "c";
	cout << "str = " << str << endl;

	str.append("e"); //当我输入'e'时,说没有这个重载。
	cout << "str = " << str << endl;

	str.append("world,hello", 5);
	cout << "str = " << str << endl;

	str.append("hello");
	cout << "str = " << str << endl;

	str.append("microsoft visual", 0, 9);
	cout << "str = " << str << endl;
}

image-20240407203124496

字符串查找和替换

查找:查找指定字符串是否存在

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

rfind的索引仍然是从左往右来看的,但是查找时是从右往左。

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

代码示例

void myFind() {
	string str = "hello,world,olleh,dlrow";
	string test = "le";
	int a, b, c, d, e, f, g, h;
	

	a = str.find(test, 0);
	cout << a << endl;

	b = str.find("el", 0);
	cout << b << endl;

	c = str.find("e", 0,10);
	cout << c << endl;

	d = str.find('e', 0);
	cout << d << endl;

	e = str.rfind(test, -1);//从row那里开始从右往左找,应该是14,
	cout << e << endl;

	f = str.rfind("l", -1);//从row那里开始从右往左找,应该是19
	cout << f << endl;

	g = str.rfind("le", -1,2);//从row开始从右往左找,从右往左第3个位置开始找,应该是14
	cout << g << endl;

	h = str.rfind('l', -1);//从row那里开始从右往左找,应该是19
	cout << h << endl;

}

image-20240407212149095

替换:在指定位置替换字符串

  • pos位置起始的n个字符替换成str
  • string & replace (int pos , int n , const string& str);
  • pos位置起始的n个字符替换成s
  • string & replace(int pos , int n , const char* s);
void myReplace() {
	string str = "hello,world;";
	string test = "?????";
	str.replace(0, 3, test);
	cout << str << endl;

	str.replace(0, 5, "a");
	cout << str << endl;

}

image-20240407212528184

字符串比较

比较按照字符串的ASCII码比较

  • 与字符串s比较

  • int compare(const string &s) const;

  • int compare (const char *s) const;

void myCompare() {
	string str = "hello";
	string rts = "hello";

	int result = str.compare(rts);
	if (result==0) {
		cout << "两者一样" << endl;
	}
	else {
		cout << "两者不一样" << endl;
	}
}

image-20240407214801444

字符串存取

两种方式

char& operator[] (int n );

char& at(int n);

void myInOut() {
	string str = "hello?world";
	cout << str[1] << endl;

	cout << str.at(2) << endl;
}

image-20240407214948544

字符串插入和删除

四种方式

string& insert(int pos , const char* s);插入字符串

string& insert(int pos , const string& str);插入字符串

string& insert(int pos , int n , char c);在指定位置插入n个字符c

string& erase(int pos , int n =npos);删除从pos开始的n个字符

void myInsertDelete() {
	string str = "空空如也";
	str.insert(0, "?");
	cout << "str = " << str << endl;

	str.insert(3, "!!!") ;
	cout << "str = " << str << endl;

	str.insert(5, 5, '.');
	cout << "str = " <<str<< endl;

	str.erase(5, 2);
	cout << "str = " << str << endl;
}

这个位置说的是字符的具体位置,不是索引。

image-20240407215620139

字符串子串

从字符串中获取想要的子串。

string substr(int pos = 0 , int n = npos) const;

void mySubString() {
	string str = "hello";
	string sub = str.substr(0, 4);
	cout << "sub = " << sub << endl;
}

image-20240407220057016


以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!

学吧,学无止境,太深了

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

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

相关文章

php校园活动报名系统vue+mysql

开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp/Laravel 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 运行环境:phpstudy/wamp/xammp等本选题则旨在通过标签分类管理等方式&#xff0c;管理员&#xff1b;首页、个人中心、学生管理、…

EPSON推出XV-9100CD为检测车身所处姿势状态提供解决方案

陀螺仪传感器是电子稳定控制系统中不可缺少的传感器之一。与通常的民用部件相比&#xff0c;用于车载的部件有一些特殊要求。因为涉及安全&#xff0c;所以高可靠性是必备条件。在制动组件等高温条件下的耐久性、受振动或撞击时不会产生异常输出亦是十分重要的条件。爱普生推出…

Python景区票务人脸识别系统(V2.0),附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

4、双指针-移动零

首先不能复制&#xff0c;只能在原数组是哪个操作&#xff0c;那么很多集合的方式就不行了。当然在现实开发中肯定是可以的。目前按照题目来说是不可以的。所以我们可以思考下&#xff0c;是否可以通过交换来实现。 初始化一个变量 to 为 0。这个变量的目的是跟踪非零元素应该…

书籍《笔记的方法》读后感

读完《笔记的方法》有几周的时间&#xff0c;书里有些记录的内容&#xff0c;觉得非常有价值的&#xff0c;自己的观点&#xff0c;当下读书&#xff0c;其实并没有那么高大尚&#xff0c;就是存粹陶冶下情操&#xff0c;读书还是有一定作用的&#xff0c;毕竟看书只能慢慢来&a…

数字反转(StringBuffer)

题目 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();StringBuffer s new StringBuffer();//字符串转为整型数if(n>0) {s.append(n);String ss s.reverse().toString()…

C++的List类(一):List类的基本概念

目录 前言 List类的基本概念 List的构造函数 List类迭代器的使用 List的功能 List的元素访问 List与vector比较 前言 vector的insert和erase都会导致迭代器失效list的insert不会导致迭代器失效&#xff0c;erase会导致迭代器失效 insert导致失效的原因是开辟了新空间后…

2024人工智能与机器人系统国际学术会议(ICAIRS2024)

2024人工智能与机器人系统国际学术会议(ICAIRS2024) 会议简介 2024人工智能与机器人系统国际学术会议(ICAIRS2024)将在杭州举行。该会议旨在为人工智能和机器人系统的专家学者提供一个平台&#xff0c;以分享最新的研究成果、交流思想、探讨学术问题&#xff0c;并促进跨学科…

云仓酒庄旗下雷盛红酒入驻香港星怡SingLa餐厅共绘美食美酒新篇章

近日&#xff0c;云仓酒庄旗下品牌雷盛红酒正式入驻香港餐厅星怡SingLa&#xff0c;这一跨界合作不仅为香港市民和游客带来了全新的味蕾享受&#xff0c;也标志着美食与美酒文化的很好结合&#xff0c;共同绘就了一幅精彩绝伦的美食美酒新篇章。 云仓酒庄一直以来都致力于为消费…

Python基础较难理解的知识

在Python的基础知识中&#xff0c;有一些概念和特性可能相对难以理解。下面是一些较为常见且具有挑战性的主题&#xff0c;每个主题都会提供实例以帮助解释。 1. 面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09; 面向对象编程是一种程序设计思想&…

系统思考—深度学习

JSTO第431期《深度学习》&#xff0c;我们将深入探讨组织中的深度学习究竟意味着什么。深度学习不仅仅是从数据和不同观点中获取信息&#xff0c;更关键的是如何将这些信息转化为知识&#xff0c;并通过反思和实际行动来验证和修正我们的假设。 在J&S&#xff0c;我们设立…

Octopus V2:设备端super agent的高级语言模型

论文&#xff1a;Octopus v2: On-device language model for super agent论文地址&#xff1a;https://arxiv.org/abs/2404.01744模型主页&#xff1a;https://huggingface.co/NexaAIDev/Octopus-v2 Octopus-V2-2B Octopus-V2-2B 是一款具有20亿参数的开源先进语言模型&#…

【C语言】——指针八:指针运算笔试题解析

【C语言】——指针八&#xff1a;指针运算笔试题解析 一、题一二、题二三、题三四、题四五、题五六、题六七、题七 一、题一 //程序输出结果是什么 int main() {int a[5] { 1,2,3,4,5 };int* ptr (int*)(&a 1);printf("%d, %d", *(a 1), *(ptr - 1));return…

设置模式——备忘录模式

备忘录模式 备忘录模式&#xff08;Memento Design Pattern&#xff09;&#xff0c;也叫快照&#xff08;Snapshot&#xff09;模式。指在不违背封装原则前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便之后恢复对象为先前…

HarmonyOS实战开发-通过screenshot模块实现屏幕截图 。

介绍 本示例展示全屏截图和屏幕局部截图。 本示例通过screenshot模块实现屏幕截图 &#xff0c;通过window模块实现隐私窗口切换&#xff0c;通过display模块查询当前隐私窗口。 效果预览 使用说明&#xff1a; 点击右上角图标打开弹窗&#xff0c;选择截屏&#xff0c;展示…

【前端Vue】Vue3+Pinia小兔鲜电商项目第4篇:静态结构搭建和路由配置,1. 准备分类组件【附代码文档】

Vue3ElementPlusPinia开发小兔鲜电商项目完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;认识Vue3&#xff0c;使用create-vue搭建Vue3项目1. Vue3组合式API体验,2. Vue3更多的优势,1. 认识create-vue,2. 使用create-vue创建项目,1. setup选项的写法和执行…

以诚待人,用心做事,做到最好,追求更好

无数个日日夜夜&#xff0c;终于换来了这样一份努力的证明。 2023年&#xff0c;收获满满&#xff0c;前一阵子拿到了证书&#xff0c;忘记拍照了&#xff0c;今天抽空记录一下 收获&#xff01;又得到一份肯定&#xff0c;这份荣誉证书将伴随我一直为了进步而奋斗&#xff1a…

云备份day04

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C云备份项目 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容介绍了文件工具了类的实现 文章目录 云备份day041.文件…

2024 软考备考资料+教学视频+历史真题及答案(含2023)(中级软件设计师)免费分享

2024软考备考资料教学视频历史真题及答案(含2023)&#xff08;中级软件设计师&#xff09;免费分享 最近软考报名结束了&#xff0c;马上五月份就要考试&#xff0c;想必很多人都在迎战软考吧。在此我分享一下我整理的一些软考备考资料&#xff0c; 其中包含 教学视频 、教学…

Linux系统中网络协议栈优化

在现代计算机网络中&#xff0c;网络协议栈是实现网络通信的核心组件之一。在Linux系统中&#xff0c;网络协议栈的优化对于提高网络性能、降低延迟、增强安全性等方面至关重要。本文将深入探讨Linux系统中网络协议栈的优化方法和技术&#xff0c;包括使用更快的网络协议栈和禁…