string类篇超超超详解,40余个成员函数详细解释(图文)!看完包会!!

news2025/1/18 3:31:05

本篇目标

  1. constructor
  2. operator=
  3. Elements access
  4. Iterators
  5. Capacity
  6. Modifiers
  7. String operations
  8. member contants
  9. 其他函数

一、constructor(对象的创建)

void StrTest1()
{
	string s1;//直接构造
	cout << s1 << endl;//string里内置了流插入、流提取的函数重载,可直接打印

    string s2("hello world");//字符常量构造,有隐式类型转换
	cout << s2 << endl;

	string s3("hello world", 5);//取常量字符串的前5个进行打印
	cout << s3 << endl;

	string s4(s3); //拷贝构造
	cout << s4 << endl;

	string s5(s2, 2);//从s2的第二个字符开始(0 1 2 也就是l位置,若不给长度,直接全部拷贝)
	cout << s5 << endl;

	string s6(s2, 2, 4);//从第二个字符开始拷贝,到第四个字符
	cout << s6 << endl;

	string s7(7, 'x');//用7个x对其进行初始化
	cout << s7 << endl;

	string s8(s2.begin(), s2.end());//调用begin和end成员函数,其返回迭代器(迭代器很像指针,但不只指针)
	cout << s8 << endl;
}

 注意:end是返回指向容器最后一个位置下一个的迭代器,所以构造s8时,他的区间是左闭右开“[  )”的.

二、operator=(给对象赋值)

void StrTest2()
{
	string s2 = "hello world";//创建对象时直接初始化 ,相当于s2("hello world")
	cout << s2 << endl;

	string s3 = s2;//用类对象赋值初始化
	cout << s3 << endl;

	s2 = "5569";
	cout << s2 << endl;

	//string s4 = 'c';//错误,不能在创建对象时进行赋值字符
	string s4;
	cout << s4 << endl;

	s4 = 'a';
	cout << s4 << endl;

}

三、Element access(元素访问)

3.1 oeprator[]

void StrTest3()
{
    string s3 = "hello world";//len = 11
	cout << s3 << endl;
	cout << s3.size() << endl;//可以看到,size=11,size是没有把'\0'算入的
	for (int i = 0; i < s3.size(); i++) {
		s3[i]++;
		cout << s3[i] ;
	}
	cout << endl;

}

若是用const修饰对象 

3.2 at

void StrTest4()
{
	string s3 = "hello world";
	const string s4 = "hello world";
	cout << s3 << endl;
	for (int i = 0; i < s3.size(); i++)
	{
		s3.at(i)++;
		cout << s3.at(i)<<' ';
	}
	cout << endl;
}

3.3 back&front

void StrTest5()
{
	string s3 = "hello world";
	cout << s3.back() << endl;
	cout << s3.front() << endl;
}

 

 四、Iterator(迭代器)

4.1 begin&end

 在这里我们可以认为迭代器和指针很像(当然迭代器不知包括指针),begin()返回指向首字符的指针

end返回指向最后一个字符的下一个位置的指针

下面我们将用3种不同的方式遍历串

void StrTest6()
{
	string s3 = "hello world";
	//方法一 operator[]
	for (int i = 0; i < s3.size(); i++) {
		cout << s3[i];
	}
	cout << endl;
	//方法二 at
	for (int i = 0; i < s3.size(); i++) {
		cout << s3.at(i);
	}
	cout << endl;
	//方法三 迭代器
	string::iterator it1 = s3.begin();
	while (it1 != s3.end())
	{
		*it1 += 3;
		cout << *it1;
		it1++;
	}
	cout << endl;
	//方法四 遍历for循环
	for (auto& e : s3) {
		cout << e;
	}
	cout << endl;
}

 4.2 rbegin&rend

 这里的r有反向的意思,reversebegin和reverseend

下面使用这两个函数遍历字符串

void StrTest7()
{
	string s2("hello world");
	//从rbegin到rend
	//反向打印
	string::reverse_iterator it1 = s2.rbegin();
	while (it1 != s2.rend())
	{
		cout << *it1;
		it1++;
	}
	cout << endl;
	//正向打印
	//从rend到rbegin
	string::reverse_iterator it2 = s2.rend()-1;//指向第一个字符

	while (it2 != s2.rbegin())
	{
		cout << *it2;
		it2--;
	}
	cout << *it2;
	cout << endl;
}

4.3 cbegin&cend& crbegin&crend

void StrTest8()
{
	string s3 = "hello world";
	string::const_iterator it1 = s3.cbegin();//这里的it1指向的内容就不能再改变了
	//其余的cend 、 crend 、 crbegin 除了是_const 以外,其他和前面两个函数一摸一样,不再赘述
}

五、Capacity(空间)

5.1 size&length&max_size

这两个都是返回字符串的长度,功能都基本相同

 

void StrTest9()
{
	string s1 = "hello world";//实际长度为12,包含'\0'
	cout << s1.length() << endl;
	cout << s1.size() << endl;
}

可以看出,vs编译器是不把'\0'算入size和length中的,编译器不同,得出的实际效果也就不同

可以看到,在64位机器下,编译器能给的最大空间很大很大,但实际上却给不了这么大的空间(即便身价500亿,亦不能随时掏出1个亿) 

5.2 capacity

那么当我们扩大字符串长度/缩小,capacity会有变化吗 

void StrTest9()
{
	string s1 = "hello world";//实际长度为12,包含'\0'
	cout << s1.length() << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
	cout << s1.capacity() << endl;
	s1 = "xxx";
	cout << s1.capacity() << endl;
}

可以很明显的看出,当我们扩大字符串的长度时,capacity会自动扩大,但当我们缩小字符串长度时,capacity却不会随之变小(capacity只扩大不缩小) 

5.3 resize

void StrTest9()
{
	string s1 = "hello world";//实际长度为12,包含'\0'
	cout << s1.length() << endl;
	cout << s1.size() << endl;
	cout << s1.max_size() << endl;
	cout << s1.capacity() << endl;
	s1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
	cout << s1.capacity() << endl;
	s1 = "xxx";
	cout << s1.capacity() << endl;

	//扩容至25,其余补充为c
	s1.resize(25, 'c');
	cout << s1 << endl;
	cout << s1.capacity() << endl;
	cout << s1.length() << endl;
	cout << s1.size() << endl;

	//扩容至50,这是会发现capacity也随之改变至70
	s1.resize(50,'X');
	cout << s1 << endl;
	cout << s1.capacity() << endl;
	cout << s1.length() << endl;
	cout << s1.size() << endl;

	//缩容至25
	s1.resize(25);//你会发现capacity不会变小,capacity只大不变小
	cout << s1 << endl;
	cout << s1.capacity() << endl;
	cout << s1.length() << endl;
	cout << s1.size() << endl;

}

5.4 reserve

void StrTest10() {
	string s1 = "hello world";
	cout << s1 << endl;
	cout << s1.capacity() << endl;//15
	cout << s1.length() << endl;//11
	cout << s1.size() << endl;//11

	//现在我们来扩大capacity,那么capacity就一定是50吗?
	s1.reserve(50);
	cout << s1.capacity() << endl;//63 ,编译器其可能觉得50不好,自动优化到63
	cout << s1.length() << endl;//11
	cout << s1.size() << endl;//11

	//那现在我们来缩小capacity,你觉得有可能吗
	s1.reserve(25);
	cout << s1.capacity() << endl;//63 ,capacity还是63,根本不听你的
	cout << s1.length() << endl;//11
	cout << s1.size() << endl;//11

	//再次缩小
	s1.reserve(20);
	cout << s1.capacity() << endl;//63,还是没有缩小
	cout << s1.length() << endl;//11
	cout << s1.size() << endl;//11


	//再次缩小
	s1.reserve(13);//15 ,为什么这次就缩小了呢?
	//是因为其中内置了一个大小为15的数组,当空间小于15时(也就是串小于15),会先存储到这个buffer区中
	cout << s1.capacity() << endl;//15,
	cout << s1.length() << endl;//11
	cout << s1.size() << endl;//11
}

注意:可以利用reserve提高插入数据的效率,避免增容带来的开销,一把开好,省得麻烦(如果知道要用多少) 

 5.5 clear&empty&shrink_to_fit

一、clear

作用很直观也很简单的一个成员函数,清楚字符串中所有有效字符,使其长度变为0

void StrTest11()
{
	//空间大小不变,长度变为0
	string s1 = "hello world";
	cout << s1 << endl;
	cout << s1.capacity() << endl;//15
	cout << s1.size() << endl;

	s1.clear();
	cout << s1.capacity() << endl;//15
	cout << s1.size() << endl;
}

 二、empty

 若有效字符个数为0,返回true,否则返回false

三、shrink_to_fit

void StrTest12() {
	string s1 = "hello world";
	cout << s1 << endl;
	s1.reserve(100);
	cout << s1.capacity() << endl;//111
	s1.shrink_to_fit();
	cout << s1.capacity() << endl;//还是15,储存在数组中
}

 六、Modifiers(修改器)

6.1 oeprator+=

void StrTest13()
{
	string s1 = "hello,";
	string s2 = "xiaoyutongxue";
	s1 += s2;
	cout << s1 << endl;

	string s3 = "hello,";
	s3 += "xiaoyutongxue";
	cout << s3 << endl;

	string s4 = "ok";
	s4 += 'x';
	cout << s4 << endl;
}

6.2 append 

void StrTest14()
{
	string s3 = "hello";
	string s4 = "world";
	char ch[] = "good";
	//添加字符串对象
	s3.append(s4); 
	cout << s3 << endl;

	//添加字符串对象的一部分
	s3.append(s4, 1, 100);
	cout << s3 << endl;

	//添加字符数组
	s3.append(ch);
	cout << s3 << endl;

	///添加字符数组的n个字符
	s3.append(ch, 3);
	cout << s3 << endl;

	//追加常量字符串
	s3.append("66666");
	cout << s3 << endl;

	///追加n个字符x
	s3.append(15, 'x');
	cout << s3 << endl;

	//interator
	string s5 = "5月12日";
	string s6 = "mu qin jie kuai le!";
	s6.append(s5.begin(), s5.end());//左闭右开[ ),不用减一
	cout << s6 << endl;

}

6.3 push_back

 在串的尾部尾插一个字符c

6.4 assign

 这些重载函数的参数都差不多,我就不再赘述了,直接代码呈现

void StrTest15()
{
    //用字符串对象覆盖
	string s1 = "hello world";
	cout << s1 << endl;
	string s2 = "xiaoyutongzhi";
	s1.assign(s2);
	cout << s1 << endl;

	//用一部分字符串对象覆盖
	s1.assign(s2, 6, 100);
	cout << s1 << endl;

	//用一个字符数组覆盖
	char ch[] = "mu qin jie kuai le";
	s1.assign(ch);
	cout << s1 << endl;

	//用字符数组的n个字符覆盖
	s1.assign(ch, 5);
	cout << s1 << endl;

	//迭代器覆盖
	s1.assign(s2.begin(), s2.end());
	cout << s1 << endl;
}

6.5 insert

void StrTest16() {
	string s1 = "hello ";
	string s2 = "xiaoyutongzhi";
	//s1.insert(6,s2);
	//cout << s1 << endl;

	//s1.insert(6, s2, 6, 100);
	//cout << s1 << endl;

	/*s1.insert(s1.end(), 6, 'x');
	cout << s1 << endl;*/

	/*s1.insert(s1.end(),  'x');
	cout << s1 << endl;*/

	s1.insert(s1.end(), s2.begin(), s2.end());
	cout << s1 << endl; 

}

6.6 erase

void StrTest16() {

	string s1 = "hello ";
	string s2 = "xiaoyutongzhi";
	string s3 = "xiaoyutongzhi";
	s1.erase();
	cout << s1 << endl;
	cout << s1.capacity() << endl;
	cout << s1.size() << endl;

	s2.erase(6, 100);
	cout << s2 << endl;

	//删除p位置的内容
	s3.erase(s3.begin());
	cout << s3 << endl;

	s3.erase(s3.begin(), s3.end()-2);//左闭右开
	cout << s3 << endl;
}

 注意:若pos位置大于字符串长度,则抛异常

6.7 replace

void StrTest1()
{
	string s1 = "xxxxxxxxxxx";
	cout << s1.size() << endl;
	string s2 = "cccccc";
	cout << s1 << endl;

	//1.类对象替换
	s1.replace(0, 3, s2);
	cout << s1 << endl;
	cout << s1.size() << endl;
	//说明会将从第0个位置开始,长度为三的字符替换,并追加s2剩余字符->size扩大
	//若len>字符串长度,默认替换到字符串尾

	//2.迭代器替换
	s1 = "xxxxxxxxxxx";
	s1.replace(s1.begin(), s1.begin()+2 , s2);
	cout << s1 << endl;
	cout << s1.size() << endl;

	//3.固定替换长度(类对象)
	s1 = "xxxxxxxxxxx";
	s1.replace(0, 3, s2, 0, 3);
	//若sublen大于len,则在替换的末尾追加
	cout << s1 << endl;
	cout << s1.size() << endl;

	//
}

 6.8 swap

void StrTest2()
{
	//交换后,size和capacity(属性)也会交换
	string s1 = "xxxxxxxx";
	string s2 = "ssssssssssssssssssssss";
	cout << "s1 = " << s1 << endl;
	cout << "s1.size() = " << s1.size() << endl;
	cout << "s1.capacity() = " << s1.capacity() << endl;

	cout << "s2 = " << s2 << endl;
	cout << "s2.size() = " << s2.size() << endl;
	cout << "s2.capacity() = " << s2.capacity() << endl;

	s1.swap(s2);
	cout << "s1 = " << s1 << endl;
	cout << "s1.size() = " << s1.size() << endl;
	cout << "s1.capacity() = " << s1.capacity() << endl;

	cout << "s2 = " << s2 << endl;
	cout << "s2.size() = " << s2.size() << endl;
	cout << "s2.capacity() = " << s2.capacity() << endl;
}

6.9 pop_back

七、 String operations:

7.1 c_str

 

void STRTest1()
{
	//1.c_str函数
	string s = "hello world";
	//返回一个与s中存储的字符串相同的常量字符串,最后还有'\0'
	char* str = new char[s.length() + 1];
	//strcpy(str, s);这里直接用s是不行的,因为s是对象名,而不是一个char*
	strcpy(str, s.c_str());//这样就可以,返回一个常量字符串
	cout << s.c_str() << endl;
	cout << str << endl;
	delete[] str;
	str = nullptr;
  }

7.2 copy 

void STRTest2()
{
	string s = "hello world";
	char str[20];
	int length = s.copy(str, 3, 0);
	//这里若是不把str的length处设置为'\0',下面打印就打印未初始化的随机值
	str[length] = '\0';
	cout << str << endl;
	cout << length << endl;

}

 7.3 find

void STRTest3()
{
	string s = "hello worldho";
	string s1 = "world";
	char s2[5] = "ld";
	size_t pos1 = s.find('h', 0);
	cout << pos1 << endl;
	size_t pos2 = s.find('o', 1);
	cout << pos2 << endl;
	size_t pos3 = s.find(s1, 0);
	cout << pos3 << endl;
	size_t pos4 = s.find(s2, 0);
	cout << pos4 << endl;
}

7.4 rfind 

void STRTest4()
{
	string s1 = "hehello heorange hehe";
	string s2 = "he";
	size_t pos1 = s1.rfind('o',1110);
	size_t pos2 = s1.rfind(s2,1110);
	cout << pos1<<endl;
	cout << pos2 << endl;
}

7.5 find_first_of

 

void STRTest5()
{
	string s1 = "hello world hehe haha orange";
	size_t pos = s1.find_first_of("wld", 0);
	cout << pos << endl;//此处找到l下标为2
	//也可以把指定元素的字符全部改为*

		std::size_t found = s1.find_first_of("aeiou");
		while (found != std::string::npos)
		{
			s1[found] = '*';
			found = s1.find_first_of("aeiou", found + 1);
		}
		std::cout << s1 << '\n';
}

 7.6 substr

void STRTest6()
{
	//用find如何提取协议、域名和资源
	string s1 = "https://gitee.com/chen-1/qi-training-record";
	size_t pos1 = s1.find(':');
	size_t pos2 = s1.find('/', pos1 + 3);
	size_t pos3 = s1.find('/', pos2 + 1);
	cout << s1.substr(0, pos1-0)<<endl;//左闭右开,右边减去左边是元素个数
	cout << s1.substr(pos1+3, pos2-pos1-3)<<endl;//取出第二段
	cout << s1.substr(pos2 + 1) << endl;//取出第三段
}

八、非成员函数 

8.1 operator+

void STRTest7() {
	string s1 = "hello";
	string s2 = "world";
	string s3 = s1 + s2;
	cout << s3 << endl;

	string s4 = s1 + "xxxxxx";
	cout << s4 << endl;

	//这就是为什么要写成全局函数而不写成成员函数的原因->要支持非对象成为第一个参数
	string s5 = "xxxxx" + s1;
	cout << s5 << endl;

	//不能是string s5 = "xxxx"+"xxxx"; 不能对内置类型进行运算符重载,至少要有一个自定义类型
}

8.2 string类同样支持比较(用ASCLL比较)

注意:运算符优先级流插入大于比较符号,注意加括号 

8.3  getline

可以从流中读取空格(cin就不行),读入str中

cin默认空格或换行是多个值之间的分割

getline默认换行是多个读入值之间的分割,也可以控制分隔符delim

九、其他函数

9.1 to_string、stoi

void STRTest8()
{
	int x = 0, y = 90;
	cin >> x >> y;
	string s = to_string(x + y);
	cout << s << endl;
	//stoi 字符串转成整形
	int ret = stoi(s);
	cout << ret << endl;
}

十、ok了,也是写完了,hp-1000000000000000

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

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

相关文章

C# 在Excel中添加筛选器并执行筛选 (日期筛选、文本筛选、数字筛选)

自动筛选器是 Excel 中的一个基本但极其有用的功能&#xff0c;它可以让你根据特定的条件来自动隐藏和显示你的数据。当有大量的数据需要处理时&#xff0c;这个功能可以帮你快速找到你需要的信息&#xff0c;从未更加有效地分析和处理相关数据。 下面将介绍如何使用免费.NET …

depcheck检查项目中未被使用的依赖

depcheck是一个用于分析项目中依赖项的工具&#xff0c;可以查看&#xff1a;每个依赖项是如何使用的&#xff0c;哪些依赖项是无用的&#xff0c;以及哪些依赖项在package.json 1、安装 npm install -g depcheck # 必须全局安装2、可配置文件.depcheckrc&#xff08;不配置 直…

SCP收容物171~180

注 &#xff1a;此文接SCP收容物161~170,本文只供开玩笑 ,与steve_gqq_MC合作 --------------------------------------------------------------------------------------------------------------------------------- 目录 scp-171 scp-172 scp-173 scp-174 scp-175 …

第五十八节 Java设计模式 - 适配器模式

Java设计模式 - 适配器模式 我们在现实生活中使用适配器很多。例如&#xff0c;我们使用存储卡适配器连接存储卡和计算机&#xff0c;因为计算机仅支持一种类型的存储卡&#xff0c;并且我们的卡与计算机不兼容。 适配器是两个不兼容实体之间的转换器。适配器模式是一种结构模…

MySQL用SQL取三列中最大的数据值

1、有如下数据&#xff1a; ABC000097.0600330.72330.720069.650027.8827.85086.92086.92219.42219.4219.41 需要展示为如下形式&#xff1a; ABC结果列0000097.06097.060330.72330.72330.7200669.65009.6527.8827.85027.8886.92086.9286.92219.42219.4219.41219.42 解决办…

OpenText ETX 助力 SMS 集团提高生产力、降低成本并实现全球协作

OpenText ETX 助力 SMS 集团提高生产力、降低成本并实现全球协作 SMS 集团存在的挑战 需要一个可以在全球范围内轻松访问的解决方案&#xff1b;需要一个系统&#xff0c;能够无缝运行图形要求苛刻的基于服务器的应用程序&#xff1b; 结果 1、通过全球用户访问数据&#x…

x264 帧类型代价计算原理:slicetype_slice_cost 函数分析

x264 x264 是一个开源的视频编码库,它实现了H.264/AVC标准。H.264是一种广泛使用的压缩标准,用于视频流、视频下载、蓝光光盘以及许多其他形式的数字视频分发。x264 以其高压缩效率和良好的视频质量而著称,是许多视频编辑软件和视频播放器的默认编解码器。 以下是关于 x26…

做一个属于自己的软件-pyside6快速上手教程

首先环境需要安装python3和pip&#xff0c;软件使用pycharm&#xff0c;安装也都很简单 首先需要安装pyside6,在终端执行&#xff1a; pip install pyside6 然后进入可视化编辑界面 pyside6-designer 进入后创建即可 可以从左侧点击鼠标拉组件进入到中间的工作区&#xff…

服务器通的远程桌面连接不上,关于服务器通畅但远程桌面连接不上问题的专业分析

在日常的企业IT管理中&#xff0c;服务器远程桌面连接是一个重要的操作功能。然而&#xff0c;有时会出现服务器网络通畅&#xff0c;但远程桌面无法连接的情况。 问题分析 1. 防火墙或安全组设置问题&#xff1a;服务器的防火墙或安全组可能阻止了远程桌面连接的端口&#xf…

人工神经网络(科普)

人工神经网络&#xff08;Artificial Neural Network&#xff0c;即ANN &#xff09;&#xff0c;是20世纪80 年代以来人工智能领域兴起的研究热点。它从信息处理角度对人脑神经元网络进行抽象&#xff0c; 建立某种简单模型&#xff0c;按不同的连接方式组成不同的网络。在工程…

关于使用git拉取gitlab仓库的步骤(解决公钥问题和pytho版本和repo版本不对应的问题)

先获取权限&#xff0c;提交ssh-key 虚拟机连接 GitLab并提交代码_gitlab提交mr-CSDN博客 配置完成上诉步骤之后&#xff0c;执行下列指令进行拉去仓库的内容 sudo apt install repo export PATHpwd/.repo/repo:$PATH python3 "实际路径"/repo init -u ssh://gitxx…

JVM调优工具命令详解(JVM调优看这一篇就够了)

Jmap 此命令可以用来查看内存信息,实例个数以及占用内存大小 1 jmap ‐histo 14660 #查看历史生成的实例 2 jmap ‐histo:live 14660 #查看当前存活的实例,执行过程中可能会触发一次full gc 打开log.txt,文件内容如下: num:序号 instances:实例数量 bytes:占用空间大小 class…

PostgreSQL源码安装

文章目录 一、先决条件检查二、源码安装1、获取源代码2、编译安装1.运行 configure2.运行make 3、PostgreSQL的配置4、安装contrib目录下的工具 三、初始化数据库1、创建数据库管理员2、创建数据库实例3、启动和停止数据库4、设置数据库密码 四、PostgreSQL的简单配置1、pg_hba…

重新定义社交:Facebook的未来愿景与颠覆力量

在当今数字化社会中&#xff0c;Facebook作为全球最大的社交媒体平台&#xff0c;其未来愿景和颠覆力量备受关注。本文将深入探讨Facebook如何重新定义社交&#xff0c;以及其未来发展中的新趋势和影响。 1. 智能化社交体验 Facebook致力于利用人工智能技术提供更智能、个性化…

智慧公厕的未来价值分析和创新设计

智慧公厕正在逐渐成为现代城市建设的重要组成部分。通过全面的数据云端化和自动化技术&#xff0c;智慧公厕实现了高效的数据分析和协作&#xff0c;提升了运行效率和管理水平。未来&#xff0c;智慧公厕将以“景厕融合”的目标发展&#xff0c;结合前沿科技和创新设计&#xf…

数据仓库作业六:第9章 分类规则挖掘

目录 第9章 分类规则挖掘第一题第二题第三题第四题 第9章 分类规则挖掘 第一题 1、设网球俱乐部有打球与气候条件的历史统计数据如下表1所示。它有“天气”、“气温”、“适度”和“风力”4个描述气候的条件属性&#xff0c;类别属性为“是”与“否”的二元取值&#xff0c;分…

【八大排序算法】插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序

文章目录 一、排序的相关概念二、排序类型三、排序算法实现插入排序1.直接插入排序2.希尔排序 选择排序3.简单选择排序4.堆排序 交换排序5.冒泡排序6.快速排序递归实现非递归实现 7.归并排序递归实现非递归实现 8.计数排序 四、总结 一、排序的相关概念 排序&#xff1a;根据数…

护照OCR识别接口如何对接

护照OCR识别接口也叫护照文字识别OCR,指的是传入护照照片&#xff0c;精准识别静态护照图像上的文字信息&#xff0c;包括姓名、签发地点、签发机关、护照号码、签发日期等信息。那么护照文字识别OCR接口如何对接呢&#xff1f; 首先我们找到一家有护照OCR识别接口的服务商数脉…

618购物狂欢,爆款清单来袭!这些好物你绝对不能错过!

一年一度的618购物狂欢&#xff0c;无疑是每年消费者们翘首以盼的盛大节日。每到618&#xff0c;各大电商平台纷纷推出诱人的优惠活动&#xff0c;琳琅满目的商品让人眼花缭乱。在这个充满惊喜与期待的时刻&#xff0c;我们为您精心挑选了一份爆款清单&#xff0c;这些好物不仅…

java02

泛型 泛型&#xff1a;编译时检查类型是不是正确&#xff0c;减少类型转换造成的错误。 代码复用性提升。 1.泛型类 T是类型形参&#xff0c;创建对象时传入类型实参。 如果不指定类型&#xff0c;按照object类型处理。不支持基本数据类型。 class Student<T>{ pr…