【C++初阶】string类的常见基本使用

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、什么是STL
  • 二、string类概念总结
  • 三、string类的常用接口(重点)
      • 3.1 常见的四种构造(初始化)
      • 3.2 常见容量操作
        • 3.2.1 size
        • 3.2.2 empty
        • 3.2.3 clear
  • 四、string类对象的修改操作
      • 4.1 push_back
      • 4.2 append
      • 4.3 运算符重载+=
      • 4.4 insert
      • 4.5 erase
      • 4.6 swap
      • 4.7 c_str
      • 4.8 find
      • 4.9 pop_back
      • 4.10 substr
      • 4.11 rfind
      • 4.12 operator+
  • 五、迭代器iterator
      • 5.1 什么是迭代器
      • 5.2 常见的string类迭代器
        • 5.2.1 begin
        • 5.2.2 end
        • 5.2.3 rbegin + rend --- 反向迭代器
        • 5.2.4 const修饰的对象
  • 六、string类遍历操作
      • 6.1 string的底层重载operator[]
      • 6.2 迭代器遍历
      • 6.3 语法糖(范围for)
      • 6.4 补充:迭代器的意义
  • 七、string的读入与输出
      • 7.1 getline - 输入
      • 7.2 puts - 输出
  • 八、string转化为其他类型
  • 九、其他类型转string

一、什么是STL

STL(standard template libaray - 标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

STL的六大组件:

在这里插入图片描述

二、string类概念总结

  1. string是一个管理字符数组的类

  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门的函数用来操作string的常规操作。例如:push_back等(后面会详细介绍)

  3. string在底层实际是:basic_string;模板类的别名:typedef basic_string<char, char_traits, allocator> string

  4. 在使用string类时,必须包含头文件#include <string>

三、string类的常用接口(重点)

3.1 常见的四种构造(初始化)

  1. 构造空的string类对象,即空字符串
#include <iostream>
#include <string>
using namespace std;

int main()
{
	// 构造空的string类对象s1
	string s1;
	cout << "s1的内容为:" << s1 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

  1. C语言的格式字符串来构造string类对象
#include <iostream>
#include <string>
using namespace std;

int main()
{
	// 用C格式字符串构造string类对象s2
	string s2("hello world");
	cout << "s2的内容为:" << s2 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

  1. 拷贝构造函数
#include <iostream>
#include <string>
using namespace std;

int main()
{
	// 用C格式字符串构造string类对象s2
	string s2("hello world");
	// 拷贝构造
	string s3(s2);
	cout << "s3的内容为:" << s3 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

  1. string类支持赋值运算符重载=
#include <iostream>
#include <string>
using namespace	std;

int main()
{
	string s1 = "hello world";
	cout << s1 << endl;

	s1 = "hello China";
	cout << s1 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

3.2 常见容量操作

3.2.1 size

返回字符串的有效长度(不包含'\0'

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

int main()
{
	string s1("hello world");
	int s1_lengrh = s1.size();

	cout << "s1的有效长度为:" << s1_lengrh << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

注意:'\0’是标识字符串结束的特殊字符,不算有效字符!

3.2.2 empty

检测字符是否为空字符串。如果是空字符串返回true,否则返回false

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

int main()
{
	string s1;
	string s2("hello world");

	cout << s1.empty() << endl;
	cout << s2.empty() << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

3.2.3 clear

清空有效字符clear

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

int main()
{
	string s2("hello world");

	s2.clear();

	cout << "s2的内容为:" << s2 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

四、string类对象的修改操作

4.1 push_back

功能:尾插一个字符

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

int main()
{
	string s1("h");
	s1.push_back('i');
	cout << s1 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

4.2 append

功能:尾插字符串

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

int main()
{
	string s1("hello ");
	s1.append("world");
	cout << s1 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

4.3 运算符重载+=

既可以尾插一个字符,也能尾插一个字符串。

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

int main()
{
	string s1("h");
	// 尾插一个字符
	s1 += 'i';
	cout <<  "s1 = " << s1 << endl;

	string s2("hello ");
	// 尾插一个字符串
	s2 += "world";
	cout << "s2 = " << s2 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

4.4 insert

  • 功能:插入字符或者字符串
  • 缺点:效率低,特别是头插

【代码示例】

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

int main()
{
	string s1("world");
	// 头插
	s1.insert(0, "hello");
	cout << s1 << endl;
	
	// 限制插入的个数
	string s2("hello");
	s2.insert(0, "world", 3);
	cout << s2 << endl;

	// 配合迭代器
	string s3("11111");
	// 尾插3个x
	s3.insert(s3.begin() + 5, 3, 'x');
	cout << s3 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

4.5 erase

功能:删除某个位置的字符或者字符串

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

int main()
{

	string s1("hello world");
	// 从下标为2往后删除3个字符
	s1.erase(2, 3);
	cout << s1 << endl;

	string s2("hello world");
	// 不指定删除的个数,该下标往后全删除
	s2.erase(2);
	cout << s2 << endl;

	//头删
	string s3("hello world");
	s3.erase(s3.begin());
	
	//尾删
	s3.erase(s3.end() - 1);
	cout << s3 << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

4.6 swap

功能:交换

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

int main()
{
	string s1("hello");
	string s2("world");
	s1.swap(s2);
	cout << "s1 = " << s1 << endl;
	cout << "s2 = " << s2 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

4.7 c_str

功能:将string转化为C字符串

比如printf只能打印内置类型,如果想打印string类型,需要使用c_str

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

int main()
{
	string s1("hello world");

	printf("%s\n", s1.c_str());

	return 0;
}

【输出结果】

在这里插入图片描述

4.8 find

功能:查找字符。找到第一次出现的字符下标,如果没有找到会返回npos,本质就是-1

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

int main()
{
	string s1("hello world");
	int pos = s1.find("o");
	cout << "第一次出现的位置:" << pos << endl;

	// 还可以指定查找的起始位置
	pos = s1.find("o", 6);
	cout << "第二次出现的位置:" << pos << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

4.9 pop_back

功能:尾删一个字符

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

int main()
{
	string s1("hello world");
	s1.pop_back();
	cout << s1 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

4.10 substr

功能:截取子串

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

int main()
{
	string s1("hello world");
	// 从下标为0开始往后截取长度为5的子串
	cout << s1.substr(0, 5) << endl;

	// 如果没有第二个参数,默认截到尾
	cout << s1.substr(0) << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

4.11 rfind

功能:从字符串的后面开始往前找第一次出现的字符

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

int main()
{
	string s1("hello world");
	
	int pos = s1.rfind('o');
	cout << pos << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

4.12 operator+

string类重载了运算符+可以拼接2个字符串

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

int main()
{
	string s1("hello ");
	string s2("world");

	string s3 = s1 + s2;

	cout << s3 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

五、迭代器iterator

5.1 什么是迭代器

现阶段可以理解迭代器是像指针一样的类型,但也有可能是指针,也有可能不是指针。

string迭代器的语法形式:

// string::iterator是类型
// it是变量名
string::iterator it = xxx;

5.2 常见的string类迭代器

5.2.1 begin

【文档描述】

在这里插入图片描述

【代码演示】

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

int main()
{
	string s1("hello world");
	// 返回的是指向字符串的第一个字符
	string::iterator it = s1.begin();

	// 迭代器是像指针一样的类型
	// 因此解引用就可以访问第一个字符
	cout << *it << endl;

	return 0;
}

【程序结果】

在这里插入图片描述

5.2.2 end

【文档描述】

在这里插入图片描述

【代码示例】

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

int main()
{
	string s1("hello world");
	string::iterator it = s1.end() - 1;

	cout << *it << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

5.2.3 rbegin + rend — 反向迭代器

【文档描述】

在这里插入图片描述

【代码示例】

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

int main()
{
	string s1("hello world");
	string::reverse_iterator rit = s1.rbegin();

	while (rit != s1.rend())
	{
		cout << *rit;
		rit++;
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

注:如果觉得string::reverse_iterator太长,可以使用auto代替。

5.2.4 const修饰的对象

注:const修饰的对象不能用普通迭代器

看看以下代码

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

void print(const string& s)
{
	string::iterator sit = s.begin();
	while (sit != s.end())
	{
		cout << *sit;
		sit++;
	}
	cout << endl;
}

int main()
{
	string s1("hello world");
	//封装print函数来打印
	print(s1);

	return 0;
}

【错误报告】

在这里插入图片描述

const修饰的对象只能用const的迭代器

在这里插入图片描述

【正确代码】

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

void print(const string& s)
{
	string::const_iterator sit = s.begin();
	while (sit != s.end())
	{
		cout << *sit;
		sit++;
	}
	cout << endl;
}

int main()
{
	string s1("hello world");
	//封装print函数来打印
	print(s1);

	return 0;
}

【输出结果】

在这里插入图片描述

六、string类遍历操作

因为string底层是支持流提取>>,用cout就可以直接打印string字符串的内容,但是打印的结果比较固定。因此以下三种方式既可以访问遍历,也可以对其内容修改打印。

6.1 string的底层重载operator[]

相当于数组下标的访问

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

int main()
{
	string s2("hello world");

	for (int i = 0; i < s2.size(); i++)
	{
		// 遍历string字符串
		cout << s2[i];
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

当然还可以对字符串进行修改

以下是将字符串的内容都+1

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

int main()
{
	string s2("hello world");

	// 修改
	for (int i = 0; i < s2.size(); i++)
	{
		s2[i]++;
	}
	// 输出
	for (int i = 0; i < s2.size(); i++)
	{
		cout << s2[i];
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

注意:这里需要区分string和普通数组

  • s2[i]的底层是调用s2.operator[](i)函数
    在这里插入图片描述
  • 普通数组的底层是解引用操作
	char ch1[] = "abcdef";
	ch1[0];// 访问下标为0的元素

ch1[0]的底层含义是:*(ch1 + 0)

6.2 迭代器遍历

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

int main()
{
	string s1("hello world");
	string::iterator it = s1.begin();

	while (it != s1.end())
	{
		cout << *it;
		it++;
	}
	cout << endl;

	return 0;
}

【程序结果】

在这里插入图片描述

当然也可以对字符串的内容进行修改

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

int main()
{
	string s1("hello world");
	string::iterator it = s1.begin();

	while (it != s1.end())
	{
		(*it)++;
		it++;
	}

	it = s1.begin();

	while (it != s1.end())
	{
		cout << *it;
		it++;
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

在这里就有的人想,迭代器的代码要写这么多,还不如用下标来访问。所以,迭代器的意义是什么呢? 让我们接着往下看

6.3 语法糖(范围for)

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

int main()
{
	string s1("hello world");

	for (auto x : s1)
	{
		cout << x;
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

范围for同样支持修改

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

int main()
{
	string s1("hello world");

	// 修改
	for (auto& x : s1)
	{
		x++;
	}

	// 输出结果
	for (auto x : s1)
	{
		cout << x;
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

范围for虽然很香,但是有个致命的缺点:**不能倒着遍历,只有反向迭代器可以倒着遍历。 **

6.4 补充:迭代器的意义

范围for又和迭代器有啥关系呢?迭代器的意义又是什么呢?

  1. 其实,范围for代码短,之所以是这么好用是因为:范围for的底层就是用迭代器实现的!!!

我们可以利用反汇编来看看代码底层:

11111111

范围for的底层就是调用了beginend

  1. 迭代器提供了一种统一的方式访问和修改容器的数据

以下以vector容器为例

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v;
	// 尾插数据
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	// 迭代器
	vector<int>::iterator vit = v.begin();
	while (vit != v.end())
	{
		cout << *vit << ' ';
		vit++;
	}
	cout << endl;

	// 范围for
	for (auto e : v)
	{
		cout << e << ' ';
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

如果一个容器支持迭代器,那么它必定支持访问for,反之就不一定了。

这里再提一嘴,很多人认为下标访问是主流,但是使用下标访问的空间必须是连续的,所以当我拿出链表,阁下又该如何应对呢?因此迭代器是可以访问链表的。

  1. 迭代器可以和算法配合使用

这里给大家介绍一个浅浅介绍一个算法(后序会补充),-- sort

【文档描述】

在这里插入图片描述

【代码演示】

#include <vector>
#include <iostream>
#include <algorithm> // 算法库头文件
using namespace std;

int main()
{
	vector<int> v;
	// 尾插数据
	v.push_back(10);
	v.push_back(3);
	v.push_back(2);
	v.push_back(5);

	// 迭代器
	cout << "sort前:";
	for (auto x : v)
	{
		cout << x << ' ';
	}
	cout << endl;

	sort(v.begin(), v.end());
	
	// 迭代器打印sort后的结果
	cout << "sort后:";
	vector<int>::iterator vit = v.begin();
	while (vit != v.end())
	{
		cout << *vit << ' ';
		vit++;
	}
	cout << endl;

	return 0;
}

【程序结果】

在这里插入图片描述

七、string的读入与输出

7.1 getline - 输入

注意:cinscanf读取到空格或者回车就不再往后读取了

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

int main()
{
	string s1;
	// 输入
	cin >> s1;
	// 输出
	cout << s1 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

getline可以读入空格

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

int main()
{
	string s1;
	// 输入
	getline(cin, s1);
	// 输出
	cout << s1 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

7.2 puts - 输出

因为string类重载了流插入<<和流提取>>,因此可以支持cincout的输入输出。除此之外还能用puts来输出string类的字符串(自带换行的)。注意:putsprintf只能打印内置类型的字符串,因此可以用c_str转化为C语言的字符串

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

int main()
{
	string s1("hello world");
	puts(s1.c_str());

	return 0;
}

【输出结果】

在这里插入图片描述

八、string转化为其他类型

在这里插入图片描述

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

int main()
{
	// 转整型
	int convert1 = stoi("1111111");
	double convert2 = stod("3.14");
	float convert3 = stof("6.66");

	cout << convert1 << endl;
	cout << convert2 << endl;
	cout << convert3 << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

九、其他类型转string

在这里插入图片描述

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

int main()
{
	// 整型转string
	string s1 = to_string(1111);

	// double转string 
	string s2 = to_string(3.14);

	return 0;
}

【输出结果】

在这里插入图片描述

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

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

相关文章

zabbix自动注册服务器以及部署代理服务器

文章目录 Zabbix自动注册服务器及部署代理服务器一.zabbix自动注册1.什么是自动注册2.环境准备3.zabbix客户端配置4.在 Web 页面配置自动注册5.验证自动注册 二.部署 zabbix 代理服务器1.分布式监控的作用&#xff1a;2.环境部署3.代理服务器配置4.客户端配置5.web页面配置5.1 …

Opencv-C++笔记 (17) : 模板匹配

文章目录 1--概念2-- 方法3 结果3.1 ROI区域的获取使用自适应目标匹配 1–概念 opencv 提供了一个专门用于模板匹配的函数 cv::matchTemplate();其调用方式如下&#xff1a; void cv::matchTemplate(cv::InputArray image, // 用于搜索的输入图像, 8U 或 32F, 大小 W-Hcv::Inpu…

LabVIEW使用图像处理进行交通控制性能分析

LabVIEW使用图像处理进行交通控制性能分析 采用普雷维特、拉普拉斯、索贝尔和任意的空间域方法对存储的图像进行边缘检测&#xff0c;并获取实时图像。然而&#xff0c;对四种不同空间域边缘检测方法的核的性能分析。 以前&#xff0c;空路图像存储在数据库中&#xff0c;道路…

drawio----输出pdf为图片大小无空白(图片插入论文)

自己在写论文插入图片时为了让论文图片放大不模糊&#xff0c;啥方法都试了&#xff0c;最后摸索出来这个。 自己手动画图的时候导出pdf总会出现自己的图片很小&#xff0c;pdf的白边很大如下如所示&#xff0c;插入论文的时候后虽然放大不会模糊&#xff0c;但是白边很大会显…

看完《孤注一掷》:原来这类人最容易被电信诈骗!

最近&#xff0c;你看了诈骗电影《孤注一掷》吗&#xff1f; “想成功先发疯&#xff0c;不顾一切向钱冲&#xff1b;拼一次富三代&#xff0c;拼命才能不失败&#xff1b;今天睡地板&#xff0c;明天当老板&#xff01;”诈骗工厂里的被骗去打黑工的人们一次次高呼着朗朗上口…

HTTPS 的加密流程

目录 一、HTTPS是什么&#xff1f; 二、为什么要加密 三、"加密" 是什么 四、HTTPS 的工作过程 1.对称加密 2.非对称加密 3.中间人攻击 4.证书 总结 一、HTTPS是什么&#xff1f; HTTPS (Hyper Text Transfer Protocol Secure) 是基于 HTTP 协议之上的安全协议&…

c语言——拷贝数组

这段代码是一个简单的数组拷贝示例。它的功能是将一个原始数组 original 的内容拷贝到另一个数组 copied 中&#xff0c;并输出两个数组的元素。 代码执行过程如下&#xff1a; 首先&#xff0c;在 main() 函数中定义了一个整型数组 original&#xff0c;并初始化了它的元素。…

【java毕业设计】基于SSM+MySql的人才公寓管理系统设计与实现(程序源码)--人才公寓管理系统

基于SSMMySql的人才公寓管理系统设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于SSMMySql的人才公寓管理系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及论文的获取方式。更多毕业…

shell脚本之正则表达式

目录 一.常见的管道命令1.1sort命令1.2uniq命令1.3tr命令1.4cut命令1.5实例1.5.1统计当前主机连接状态1.5.2统计当前主机数 二.正则表达式2.1正则表达式的定义2.2常见元字符&#xff08;支持的工具&#xff1a;find&#xff0c;grep&#xff0c;egrep&#xff0c;sed和awk&…

23.8.16日总结

原先写的评论是每级评论用缩进来区分&#xff0c;所以最多设置的是九级评论&#xff0c;修改了排版和格式&#xff1a; 还有管理员页面&#xff0c;查看文章时可以进行点赞&#xff0c;收藏的操作&#xff0c;现在进行了修改&#xff0c;将相关操作隐藏。 还有点击查看未发布…

语聚AI公测发布,大语言模型时代下新的生产力工具

语聚AI 公测发布 距离语聚AI内测上线已经过去近1个月。 这期间&#xff0c;我们共邀请了近百位资深用户与行业专家加入语聚AI产品体验。通过大家的热情参与积极反馈&#xff0c;我们不断优化并完善了语聚AI的功能与使用体验。 经过研发团队不懈的努力&#xff0c;今天语聚AI终…

深入源码分析kubernetes informer机制(三)Resync

[阅读指南] 这是该系列第三篇 基于kubernetes 1.27 stage版本 为了方便阅读&#xff0c;后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 为什么需要resyncresync做了什么 为什么需要resync 如果看过上一篇&#xff0c;大概能了解&#xff0c;client数据主要通…

B树和B+树区别

B树和B树的区别 B树 B树被称为平衡树&#xff0c;在B树中&#xff0c;一个节点可以有两个以上的子节点。B树的高度为log M N。在B树中&#xff0c;数据按照特定的顺序排序&#xff0c;最小值在左侧&#xff0c;最大值在右侧。 B树是一种平衡的多分树&#xff0c;通常我们说m阶…

Unity-Linux部署WebGL项目MIME类型添加

在以往的文章中有提到过使用IIS部署WebGL添加MIME类型使WebGL项目在浏览器中能够正常加载&#xff0c;那么如果咱们做的是商业项目&#xff0c;往往是需要部署在学校或者云服务器上面的&#xff0c;大部分情况下如果项目有接口或者后台管理系统&#xff0c;后台基本都会使用Lin…

arcgis pro 3.0.2 安装及 geemap

arcgis pro 3.0.2 安装及 geemap arcgis pro 3.0.2 安装 arcgis pro 3 版本已经很多了&#xff0c;在网上找到资源就可以进行安装 需要注意的是&#xff1a;有的文件破解文件缺少&#xff0c;导致破解不成功。 能够新建地图就是成功了&#xff01; geemap安装 1.需要进行环…

FL Studio 21最新for Windows-21.1.0.3267中文解锁版安装激活教程及更新日志

FL Studio 21最新版本for Windows 21.1.0.3267中文解锁版是最新强大的音乐制作工具。它可以与所有类型的音乐一起创作出令人惊叹的音乐。它提供了一个非常简单且用户友好的集成开发环境&#xff08;IDE&#xff09;来工作。这个完整的音乐工作站是由比利时公司 Image-Line 开发…

Flutter源码分析笔记:Widget类源码分析

Flutter源码分析笔记 Widget类源码分析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/132259681 【介绍】&#x…

Spring源码深度解析一(IOCDI)

1. Spring架构设计 Spring框架是一个分层架构&#xff0c;他包含一系列的功能要素&#xff0c;并被分为大约20个模块 2. 设计理念 Spring是面向Bean的编程&#xff08;BOP&#xff1a;Bean Oriented Programming&#xff09;&#xff0c;Bean在Spring中才是真正的主角。Bean在…

物联网工程应用实训室建设方案

一、物联网工程应用系统概述 1.1物联网工程定义 物联网工程&#xff08;Internet of Things Engineering&#xff09;是一种以信息技术&#xff08;IT&#xff09;来改善实体世界中人们生活方式的新兴学科&#xff0c;它利用互联网技术为我们的日常生活活动提供服务和增益&am…

CI+JUnit5并发单测机制创新实践

目录 一. 现状问题 二. 分析原因 三. 采取措施 四. 实践步骤 五. 效能提升 资料获取方法 一. 现状问题 针对现如今高并发场景的业务系统&#xff0c;“并发问题” 终归是必不可少的一类&#xff08;占比接近10%&#xff09;&#xff0c;每次出现问题和事故后&#xff0c…