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

news2025/1/11 22:54:36

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.coloradmin.cn/o/1654561.html

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

相关文章

二层交换机与防火墙连通上网实验

防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量。它可以帮助防止未经授权的访问&#xff0c;保护网络免受攻击和恶意软件感染。防火墙可以根据预定义的规则过滤流量&#xff0c;例如允许或阻止特定IP地址或端口的流量。它也可以检测和阻止恶意软件、病毒和其他威…

【linux软件基础知识】-死锁问题

死锁问题 当两个或多个线程由于每个线程都在等待另一个线程持有的资源而无法继续时,就会发生死锁 如下图所示, 在线程 1 中,代码持有了 L1 上的锁,然后尝试获取 L2 上的锁。 在线程 2 中,代码持有了 L2 上的锁,然后尝试获取 L1 上的锁。 在这种情况下,线程 1 已获取 L…

这个簇状柱形图怎么添加百分比?

这个图表是excel默认的图表配色&#xff0c;有的人做出来都那个百分比&#xff0c;一起来做一个这样的图表。 1.插入图表 选中数据区域&#xff0c;点击 插入选项卡&#xff0c;在图表那一栏&#xff0c;点一下柱形图右侧那个倒三角&#xff0c;在弹邮对话框中&#xff0c;选…

vivado刷题笔记46

题目&#xff1a; Design a 1-12 counter with the following inputs and outputs: Reset Synchronous active-high reset that forces the counter to 1 Enable Set high for the counter to run Clk Positive edge-triggered clock input Q[3:0] The output of the counter c…

26_Scala集合常用API汇总

文章目录 1.mkString2.size&#xff0c;length&#xff0c;isEmpty,contains3.reverse ,length,distinct4.获取数据相关4.1数据准备4.2准确获取尾部last4.3 除了最后一个元素不要其他都要4.4从集合获取部分数据 5.删除数据5.1删除3个从左边5.2删除3个右边 6.切分数据splitAt(n:…

Windows下启动Tomcat显示乱码解决办法

1、Windows下启动Tomcat显示乱码 2、解决办法 找到 D:\apache-tomcat-9.0.89\conf下的logging.properties&#xff0c;找到java.util.logging.ConsoleHandler.encoding的值改为GBK&#xff0c;就可以了 完美解决&#xff01;显示正常的中文了

Ansible——playbook编写

一、简介 1.什么是playbook Ansible Playbook 是设定自动化任务的一种蓝图&#xff0c;可在无需人工干预或有限干预的前提下执行复杂的 IT 操作。Ansible Playbook 对一组或一类共同构成 Ansible 清单的主机执行。 Ansible Playbook 本质上是一些框架&#xff0c;是一些预先编…

指定地区|CSC高级研究学者赴澳大利亚访学交流

CSC高级研究学者均是正高或博导级的&#xff0c;学术背景较强&#xff0c;多数能DIY联系到国外合作机构。但也有些申请者因指定地域或学校&#xff0c;或须在短期内获取邀请函故而求助于我们。本案例D教授就指定澳大利亚的墨尔本地区&#xff0c;我们最终用维多利亚大学的邀请函…

企业是保留传统的MES还是换新的MES?

在选择上MES系统的时候&#xff0c;企业可以根据自身所处行业不同、当前阶段不同&#xff0c;以及业务需求的差异&#xff0c;对症下药&#xff0c;选择适合自己的解决方案。对于有些企业本来就有MES系统&#xff0c;但是已经过时过旧&#xff0c;就要考虑换新的MES系统了. 保留…

射频无源器件之巴伦

一. 巴伦的作用 Balun,balanced-unbalanced的缩写,即平衡-不平衡转换器,是一种三端口无源器件,其本质是通过电感线圈的相互耦合实现的信号转换。用于平衡信号(差分信号,即振幅相等、相位相差180 的两个信号)与非平衡信号(单端信号)的相互转换。 Balun是高频电路重要器…

深入探索 C++ 中 string 的用法:从基础到实践

C String 用法详解 C中的 std::string 是一个非常强大且灵活的类&#xff0c;用于处理字符串。std::string 类是C标准库中的一部分&#xff0c;它提供了丰富的成员函数来执行各种字符串操作&#xff0c;如连接、比较、查找、替换等。在本篇博客中&#xff0c;我们将深入探索 s…

uniapp实现下拉刷新效果-uniapp原生接口

onPullDownRefresh | uni-app官网 1、需要在 pages.json 里&#xff0c;找到的当前页面的pages节点&#xff0c;并在 style 选项中开启 enablePullDownRefresh 2、生命周期中添加onPullDownRefresh&#xff0c;下拉时获取数据 3、处理完数据后&#xff0c;停止下拉效果stopPul…

嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~

随着物联网和智能设备的快速发展&#xff0c;嵌入式开发和鸿蒙系统成为了当前技术领域的热门话题。鸿蒙系统作为华为推出的全场景分布式操作系统&#xff0c;旨在连接各种智能设备&#xff0c;提供无缝的跨设备体验。而南向开发则是鸿蒙系统中的一个重要方向&#xff0c;主要涉…

数据结构复习/学习9--堆/堆实现/升降序建堆/top-k问题

一、堆与完全二叉树 1.堆的逻辑与物理结构 2.父节点与子节点的下标 3.大小根堆 二、堆的实现&#xff08;大根堆为例&#xff09; 注意事项总结&#xff1a; 注意堆中插入与删除数据的位置和方法与维持大根堆有序时的数据上下调整 三、堆排序(基于上述的向上与向下调整建堆)…

【进程等待】是什么 | 为什么 | 怎么办 | wait阻塞等待

目录 进程等待是什么&#xff1f; 为什么要进程等待&#xff1f; 如何进程等待&#xff1f; wait 阻塞等待 进程等待是什么&#xff1f; 进程终止会把进程退出的数据&#xff08;退出码和退出信号&#xff09;存放到进程的PCB中保存下来&#xff0c;让父进程进行等待。…

在国企分公司做信息宣传新闻投稿的经验分享

作为一名国企分公司的信息宣传工作者,我亲历了从传统投稿方式到数字化转型的全过程,这段经历既充满了挑战,也收获了成长。回首最初的日子,那些用邮箱投稿的时光,至今仍让我感慨万千。 初尝辛酸,邮箱投稿的艰难岁月 刚接手信息宣传工作时,我满腔热情,却很快被现实的冷水浇了个透…

了解内存函数

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 前言 内存函数不止malloc、calloc、realloc、free还有memcpy、memmove、memset、memcmp。前四个的头文件是<stdlib.h>,后四个的头文件是<strin…

哪些博客类型是最受欢迎的?

在创建博客时&#xff0c;您可能会想到的最常见的问题之一是哪些是最受欢迎的博客类型&#xff1f;有许多不同类型的博客涉及广泛的主题&#xff0c;兴趣和受众。对于一个成功的博客&#xff0c;你需要提前计划并选择适合你的利基市场。在本文中&#xff0c;我们将分享您可以立…

Navicat导出表结构到Excel或Word

文章目录 sql语句复制到excel复制到Word sql语句 SELECTcols.COLUMN_NAME AS 字段,cols.COLUMN_TYPE AS 数据类型,IF(pks.CONSTRAINT_TYPE PRIMARY KEY, YES, NO) AS 是否为主键,IF(idxs.INDEX_NAME IS NOT NULL, YES, NO) AS 是否为索引,cols.IS_NULLABLE AS 是否为空,cols.…

OpenMV 图像串口传输示例

注意&#xff1a;本程序根据 OpenMV采集图片通过串口发送&#xff0c;PC接收并保存为图片 更改。 一、例程说明 这个例程主要实现了以下功能: 1. OpenMV 端采集图像:使用OpenMV开发板上的摄像头采集实时图像数据。 2. 通过串口传输图像数据:将采集到的图像数据打包成字节流,…