C++学习————第十天(string的基本使用)

1、string 对象类的常见构造  

(constructor)函数名称                      功能说明:
string() (重点)                                 构造空的string类对象,即空字符串
string(const char* s) (重点)            用C-string来构造string类对象
string(size_t n, char c)                        string类对象中包含n个字符c
string(const string&s) (重点)          拷贝构造函数

void test_string1() {
	//常用
	string s1; //定义
	string s2("hello world"); //拷贝构造
	string s3(s2);

	//不常用 了解
//从s2的第三个字符开始拷贝,拷贝5个字符,如果5大于后面的字符数,到'\0'停止
	string s4(s2, 3, 5);
	string s5(s2, 3); //从s2的第三个字符开始拷贝
	string s6(s2, 3, 30);
	string s7("hello world", 5);
	string s8(10, 'x');

	cout << "s1 = " << s1 << endl;
	cout << "s2 = " << s2 << endl;
	cout << "s3 = " << s3 << endl;
	cout << "s4 = " << s4 << endl;
	cout << "s5 = " << s5 << endl;
	cout << "s6 = " << s6 << endl;
	cout << "s7 = " << s7 << endl;
	cout << "s8 = " << s8 << endl;
}

2、string的隐式类型转换和构造

void test_string2()
{
	string s1("hello world"); //构造
	string s2 = "hello world"; //隐式类型转换
	const string& s3 = "hello world";// 临时对象具有常性,加const
 }

3、string类对象的容量操作

void test_string3()
{
  string s1("hello world");
  cout << s1.size() << endl;
//capacity 比 实际空间少一个,有一个多的是预留给\0
  cout << s1.capacity() << endl;
  cout << s1.max_size() << endl;
}

4、string的遍历

void test_string4() {
	// 遍历方式:下标 + []
	string s1 = "hello world";
	for (int i = 0; s1[i]; i++)
	{
		cout << s1[i] << " ";
	}
	cout << endl;

	//遍历方式2:迭代器
	string::iterator it1 = s1.begin();
	while (it1 != s1.end()) { 
		cout << *it1 << " ";
		++it1;
	}
	cout << endl;

	cout << typeid(it1).name() << endl;
	
	//遍历方式3:范围for
	// 底层:就是迭代器
	for (auto e : s1) {
		cout << e << " ";
	}
}

注意:迭代器中的begin和end

5、reverse逆置

void test_string5() //反向迭代器
{
	string s1("hello world");
	string::const_iterator it1 = s1.begin();
	//auto it1 = s1.begin();
	while (it1 != s1.end())
	{
		//*it1 += 3;// 不能修改
		cout << *it1 << " ";
		++it1;
	}
	string s2("hello world");

	string::reverse_iterator it2 = s2.rbegin();
	while (it2 != s2.rend()) {
		*it2 += 3;
		cout << *it2 << " ";
		++it2;
	}
}

6、const

7、sort排序

void test_string6()
{
	string s1("hello world");
	cout << s1 <<endl;

	//按字典序排序
	sort(s1.begin(), s1.end());
	
	//第一个和最后一个参与排序
	sort(++s1.begin(), --s1.end());

	//前五个排序
	sort(s1.begin(), s1.begin() + 5);
	cout << s1 << endl;
}

8、插入删除

a、push_back、append的后插

void test_string7()
{
	string s1("hello world");
	cout << s1 << endl;

	s1.push_back('x');
	cout << s1 << endl;
	
	s1.append(" yyyyyy!! ");
	cout << s1 << endl;

	s1 += 'z';
	s1 += "wwwwww";
	cout << s1 << endl;
}

b、insert插入、erase删除

    s.insert(1, "111");//在1位置后插入111 
    s.erase(1, 2);//从1位置开始删两个

9、resize和reserve

注意:

resize :    影响size  、capacity

reserve : 只影响capacity

void test_string11()
{
	string s1;
	s1.resize(5, '0'); //初始值
	cout << s1 << endl;

	// 再扩容
	s1.reserve(100);
	cout << s1.size() << "  " << s1.capacity() << endl;

	//reserve 在vs下不会缩容,没有规定
	s1.reserve(20);
	cout << s1.size() << "  " << s1.capacity() << endl;

	s1.resize(10);
	cout << s1.size() << "  " << s1.capacity() << endl;

	s1.resize(120);
	cout << s1.size() << "  " << s1.capacity() << endl;

   //由此发现resize影响capacity、size
   (当再开辟空间大于原先capacity才会影响capacity), 
   reserve不影响size

	//插入(空间不够扩容)
	string s2("hello world");
	s2.resize(20, 'x'); //不会清掉之前的字符,在后面填写
	cout << s2 << endl;

	// 删除
	s2.resize(5); 
}

10、查找

a、find、rfind

find     : 从前往后查找,并且返回所在下标

rfind    : 从后往前查找

substr : 获得子串

void test_string12()
{
    string s = "aabaabaab";
    cout << s.find("aa") << endl;//查找字符串“aa”首次出现位置 0
    cout << s.find("aa", 3) << endl;//查找下标3开始(即第四个字符开始)字符串“aa”首次出现位置  3
    cout << s.find('a') << endl;//查找字符串'a'首次出现位置  0
    cout << s.find('a', 3) << endl;//查找下标3开始(即第四个字符开始)字符串“aa”首次出现位置  3
    cout << s.rfind("aa") << endl;//查找字符串“aa”最后一次出现位置  6
}

b、查找第一个大于或大于等于的字符

x=lower_bound(b+1,b+m+1,y)-b;//从[first,last)中找第一个大于等于y的元素的地址,-b是转化为下标
x=upper_bound(b+1,b+m+1,y)-b;//同理,只不过找第一个大于的

c、查找某一字符串中任意字符首次/末次出现位置

cout << s.find_first_of("hark") << endl;
cout << s.find_last_of("a") << endl;

d、查找不是某一字符串中字符的首次/末次出现位置

    cout << s.find_first_not_of("hark") << endl;
    cout << s.find_last_not_of("hark") << endl;

11、c_str

1、用处可以用在文件使用上,如:

// 文件操作
void TestFile()
{
	string file("test.cpp");
	FILE* fout = fopen(file.c_str(), "r");
	//.c_str()作用是吧一个string串转换成一个C - style的串,
	// 以"/0"null character结尾,返回的是一个指向该C - style串的常指针。
	char ch = fgetc(fout);
	while (ch != EOF)
	{
		cout << ch;
		ch = fgetc(fout);
	}
}

2、c_str比较

void test_string13()
{
	string a = "abc";
	string b = a;

	//a.c_str() == b.c_str()比较的是存储字符串位置的地址,
	// a和b是两个不同的对象,内部数据存储的位置也不相同,因此不相等
	if (a.c_str() == b.c_str())cout << "True" << endl;
	else cout << "False" << endl;
}

12、substr 取子串

  1. str = str.substr(cnt); //取从cnt下标开始一直到结束的所有字符

  2. str = str.substr(cnt,m); //取从cnt下标开始的m个字符

13、字符串与数字的相互转化

a、字符串转数字

  1. string s="12";

  2. int y=stoi(s);

b、数字转字符串

     string x=to_string(12);

14、大小写转化

transform(s.begin(),s.end(),s.begin(),::tolower);
transform(s.begin(),s.end(),s.begin(),::toupper);

15、sizeof 和strlen在char*和string中的使用

void test_string17()
{
	char buff1[] = "abcd";
	char buff2[] = "瓦特";
	string s1("abcd");

	cout << sizeof(buff1) << endl; // 5, '\0'算一个字节
	cout << sizeof(buff2) << endl; // 5,一个汉字两个字节,'\0'算一个字节
	cout << sizeof(s1) << endl; // 40

	cout << strlen(buff1) << endl; // 4
	cout << strlen(buff2) << endl; // 4,一个汉字两个字节
	//cout << strlen(s1) << endl; // 不能计算
}

16、string的底层实现

类域定义:

namespace bit
{
	class string {
	public: 
		//迭代器实现
		typedef char* iterator;
		iterator begin();
		iterator end();


		//string(); //无参构造
		//string(const char* str);
		string(const char* str = ""); //全缺省

		~string();
		const char* c_str() const;

		size_t size() const; //长度
		char& operator[](size_t pos); //打印


	private:
		// char _buff[16];

		char* _str;
		size_t _size;
		size_t _capacity;
	};
}

函数实现:

namespace bit
{
	//string::string() 
	//{
	//	_str = new char[1] {'\0'};
	//	_size = 0;
	//	_capacity = 0;
	//}
	string::iterator string::begin() 
	{
		return _str;
	}
	string::iterator string::end()
	{
		return _str + _size;
	}
	string::string(const char* str)
		:_str(new char[strlen(str) + 1])
		, _size(strlen(str))
		, _capacity(strlen(str))
	{
		strcpy(_str, str);
	}

	string::~string()
	{
		delete[] _str;
		_str = nullptr;
		_size = _capacity = 0;
	}

	const char* string:: c_str() const
	{
		return _str;
	}

	size_t string::size() const
	{
		return _size;
	}

	char& string::operator[](size_t pos)
	{
		assert(pos < _size);
		return _str[pos];
	}

}

函数测试:

namespace bit{
	void test_string1()
	{
		bit::string s1("hello world");
		cout << s1.c_str() << endl;

		bit::string s2;
		cout << s2.c_str() << endl;

		for (size_t i = 0; i < s1.size(); i++)
		{
			s1[i]++;
			cout << s1[i] << " ";
		}
		cout << endl;
		
		//封装:屏蔽了底层实现细节,提供了一种简单通用访问容器的方式
		string::iterator it1 = s1.begin();
		while (it1 != s1.end())
		{
			cout << *it1 << " ";
			++it1;
		}
		cout << endl;

		//范围for底层也是迭代器
		for (auto e : s1)
		{
			cout << e << " ";
		}
		cout << endl;
		
	}
}



string相关题型:

1、字符串相加

2、仅仅反转字母

3、字符串中第一个唯一字符

4、字符串中最后一个单词长度

5、验证回文串

6、字符串相加

7、反转字符串II

8、反转字符串III

9、字符串相乘

10、找出字符串中第一个只出现一次的字符

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

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

相关文章

Java_从入门到JavaEE_11

一、抽象类及抽象方法 1.认识抽象类及抽象方法 应用场景&#xff1a;当一个方法必须在父类中出现&#xff0c;但是这个方法又不好实现&#xff0c;就把该方法变成抽象方法&#xff0c;交给非抽象的子类去实现 实例&#xff1a; //抽象类 public abstract class 类名{//抽象方…

Ansible----playbook模块之templates模块、tags模块、roles模块

目录 引言 一、templates模块 &#xff08;一&#xff09;关键信息 &#xff08;二&#xff09;实际操作 1.定义主机组 2.设置免密登录 3.分别建立访问目录 4.定义模板文件 5.创建playbook文件 6.执行剧本 7.验证结果 二、tags模块 &#xff08;一&#xff09;创建…

stm32_RTC_2_HAL——stm32CudeMX

介绍 RTC&#xff08;实时时钟&#xff09;不仅仅提供计数功能&#xff0c;它是一个完整的时钟和日历模块&#xff0c;用于提供日期和时间信息。RTC 能够提供年、月、日、星期、时、分、秒等时间信息&#xff0c;并且通常具有闹钟功能&#xff0c;可以用于定时唤醒或触发事件。…

Qt | QLineEdit 类(行编辑器)

01、上节回顾 Qt | QComboBox(组合框)02、QLineEdit 1、QLineEdit 类是 QWidget 类的直接子类,该类实现了一个单行的 输入部件,即行编辑器,见右图 2、验证器(QValidator 类)和输入掩码简介:主要作用是验证用户输入的字符是否符合验证器 的要求,即限制对用户的输入,比…

详细介绍ARM-ORACLE Database 19c数据库下载

目录 1. 前言 2. 获取方式 2.1 ORACLE专栏 2.2 ORACLE下载站点 1. 前言 现有网络上已有非常多关于ORACLE数据库机下载的介绍&#xff0c;但对于ARM平台的介绍不多&#xff0c;借此机会我将该版的下载步骤做如下说明&#xff0c;希望能够一些不明之人提供帮助和参考 2. 获…

【STM32G474】利用Cpp编写STM32代码后,Cubemx修改配置后代码报错147个error,如何处理?

问题描述 打开Cubemx&#xff0c;添加TIM7用于定时器精准延时&#xff0c;生成代码后&#xff0c;Keil提示有147个error。 之前是Cubemx是没有问题的&#xff0c;是利用Cpp编写stm32&#xff08;将Keil改为Version6&#xff09;后才导致Cubemx配置失败&#xff1a; debug成功…

[学习笔记]CyberDog小米机器狗 开发学习

1、机器狗本身是UbuntuROS2系统 2、控制机器人只需要了解lcm和Ros topic通讯 3、传感器数据&#xff08;包括一些imu(/imu)、激光雷达(/scan)&#xff09;会进行topic的一个广播。 仿真环境通信接口&#xff1a; -命令输入(见后续运控说明) 运控lcm数据接口 Motion man…

Gmail邮箱怎么注册?2024年完整指南(包含跳过手机号验证)

一、为什么要注册Gmail邮箱&#xff1f; 全球通用性&#xff1a;Gmail是一个全球性的邮件服务平台&#xff0c;被广泛认可和信赖。因为客户对于Gmail的接受度高&#xff0c;无需担心邮件被自动标记为垃圾邮件。 整合营销工具&#xff1a;通过Gmail账号&#xff0c;你可以轻松…

CleanMyMac X 4.15.3 版本发布

CleanMyMac X 4.15.3 版本发布&#xff0c;一款苹果 macOS 系统好用的伴侣软件&#xff0c;其包含 1.一键深度清理。2.系统垃圾专清。3.大/旧文件专清。4.系统提速。5.性能悬浮窗。6.恶意软件防护。7.隐私保护。8.软件卸载器。9.软件更新器等 9 大功能&#xff0c;为您的苹果电…

Flask-HTTP请求、响应、上下文、进阶实验

本节主要目录如下&#xff1a; 一、请求响应循环 二、HTTP请求 2.1、请求报文 2.2、Request对象 2.3、在Flask中处理请求 2.4、请求钩子 三、HTTP响应 3.1、响应报文 3.2、在Flask中生成响应 3.3、响应格式 3.4、Cookie 3.5、session&#xff1a;安全的Cookie 四、…

[公开课学习]台大李宏毅-自注意力机制 Transformer

自注意力机制 存在一些问题&#xff0c;将vector set/sequence作为input&#xff0c;例如&#xff1a; 文字处理&#xff1a;将文字用one-hot表示&#xff0c;或者向量空间的向量表示&#xff0c;然后进行翻译任务等语音处理&#xff1a;25ms音频作为一个向量&#xff0c;10m…

初识C++ · 模板初阶

目录 1 泛型编程 2 函数模板 3 类模板 1 泛型编程 模板是泛型编程的基础&#xff0c;泛型我们碰到过多次了&#xff0c;比如malloc函数返回的就是泛型指针&#xff0c;需要我们强转。 既然是泛型编程&#xff0c;也就是说我们可以通过一个样例来解决类似的问题&#xff0c…

pytorch基础: torch.unbind()

1. torch.unbind 作用 说明&#xff1a;移除指定维后&#xff0c;返回一个元组&#xff0c;包含了沿着指定维切片后的各个切片。 参数&#xff1a; tensor(Tensor) – 输入张量dim(int) – 删除的维度 2. 案例 案例1 x torch.rand(1,80,3,360,360)y x.unbind(dim2)print(&…

gitlab集群高可用架构拆分部署

目录 前言 负载均衡器准备 外部负载均衡器 内部负载均衡器 (可选)Consul服务 Postgresql拆分 1.准备postgresql集群 手动安装postgresql插件 2./etc/gitlab/gitlab.rb配置 3.生效配置文件 Redis拆分 1./etc/gitlab/gitlab.rb配置 2.生效配置文件 Gitaly拆分 1.…

BACnet转MQTT网关智联楼宇json格式自定义

智能建筑的BACnet协议作为楼宇自动化领域的通用语言&#xff0c;正逐步迈向更广阔的物联网世界。随着云计算和大数据技术的飞速发展&#xff0c;如何将BACnet设备无缝融入云端生态系统&#xff0c;成为众多楼宇管理者关注的焦点。本文将以一个实际案例&#xff0c;揭示BACnet网…

60、郑州大学附属肿瘤医院 :用于预测胃癌患者术后生存的深度学习模型的开发和验证[同学,我们的人生应当是旷野]

馒头老师要说的话&#xff1a; 我近期看了一下北京的脑机公司&#xff0c;大概是我之前对这一行业太过于乐观&#xff0c;北京的BCI公司和研究所&#xff0c;比上海、深圳、杭州甚至是重庆都要少&#xff0c;门槛也要高很多。也有我自己的原因&#xff0c;有时站的太高&#x…

92、动态规划-最小路径和

思路&#xff1a; 还是一样&#xff0c;先使用递归来接&#xff0c;无非是向右和向下&#xff0c;然后得到两种方式进行比较&#xff0c;代码如下&#xff1a; public int minPathSum(int[][] grid) {return calculate(grid, 0, 0);}private int calculate(int[][] grid, int …

ubuntu_Docker安装配置

什么是docker? Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有…

为什么要梯度累积

文章目录 梯度累积什么是梯度累积如何理解理解梯度累积梯度累积的工作原理 梯度累积的数学原理梯度累积过程如何实现梯度累积 梯度累积的可视化 梯度累积 什么是梯度累积 随着深度学习模型变得越来越复杂&#xff0c;模型的训练通常需要更多的计算资源&#xff0c;特别是在训…

深度学习笔记_10YOLOv8系列自定义数据集实验

1、mydaya.yaml 配置方法 # 这里分别指向你训练、验证、测试的文件地址&#xff0c;只需要指向图片的文件夹即可。但是要注意图片和labels名称要对应 # 训练集、测试集、验证机文件路径&#xff0c;可以是分类好的TXT文件&#xff0c;也可以直接是图片文件夹路径 train: # t…
最新文章