C++学习笔记(十九)

一、vector容器

1. vector基本概念

功能:vector数据结构和数组非常相似,也称为单端数组

vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:并不是在原空间之后续接新空间,耳罩寻找更大的内存空间,然后将原数据拷贝到新空间,释放原空间

2. vector构造函数

函数原型:

vector<T> v;        // 采用模板实现类实现,默认构造函数

vector(v.begin(), v.end());        // 将v[begin(), end()) 区间中的元素拷贝给本身

vector(n, elem);        // 构造函数将n个elem拷贝给本身

vector(const vector &vec);        // 拷贝构造函数

#include <iostream>
#include <vector>

using namespace std;

void printVector(vector<int>&v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	// 1. 默认构造 无参构造
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);
	
	// 2. 通过区间方式构造
	vector<int>v2(v1.begin(), v1.end());
	printVector(v2);

	// 3. n个elem方式构造
	vector<int>v3(10, 100);
	printVector(v3);

	// 4. 拷贝构造
	vector<int>v4(v3);
	printVector(v4);
}

int main(int argc, char* argv[])
{
	test01();
	return 0;
}

3. vector赋值操作

函数原型:

vector& operator=(const vector &vec);        // 重载等号操作符

assign(beg, end);        // 将[beg, end)区间中的数据拷贝赋值给本身

assign(n, elem);        // 将n个elem拷贝赋值给本身

#include <iostream>
#include <vector>

using namespace std;

void printVector(vector<int>&v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	// 1. 等号赋值
	vector<int>v2;
	v2 = v1;
	printVector(v2);

	// 2. 区间赋值
	vector<int>v3;
	v3.assign(v1.begin(), v1.end());
	printVector(v3);

	// 3. n个elem赋值
	vector<int>v4;
	v4.assign(10, 100);
	printVector(v4);
}

int main(int argc, char* argv[])
{
	test01();
	return 0;
}

4. vector容量和大小

对vector容器的容量和大小操作

函数原型:

empty();        // 判断容器是否为空

capacity();        // 容器的容量

size();        // 返回容器中元素的个数

resize(int num);        // 重新指定容器的长度为num,若容器变长,则以默认值填充新位置

                                 // 如果容器变短,则末尾超出容器长度的元素被删除

resize(int num, elem);        // 重新指定容器的长度为num,若容器变长,则以elem值填充新位置

                                           // 如果容器变短,则末尾超出容器长度的元素被删除

#include <iostream>
#include <vector>

using namespace std;

void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int>v1;

	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	if (v1.empty())
	{
		cout << "v1为空..." << endl;
	}
	else
	{
		cout << "v1不为空..." << endl;
		cout << "v1的容量为:" << v1.capacity() << endl;
		cout << "v1的元素个数为:" << v1.size() << endl;
	}
	v1.resize(16);
	printVector(v1);
	cout << "v1的容量为:" << v1.capacity() << endl;
	cout << "v1的元素个数为:" << v1.size() << endl;

	v1.resize(20,100);
	printVector(v1);
	cout << "v1的容量为:" << v1.capacity() << endl;
	cout << "v1的元素个数为:" << v1.size() << endl;

	v1.resize(5);
	printVector(v1);
	cout << "v1的容量为:" << v1.capacity() << endl;
	cout << "v1的元素个数为:" << v1.size() << endl;
}

int main(int argc, char* argv[])
{
	test01();
	return 0;
}

5. vector插入和删除

函数原型:

push_back(ele);        // 尾部插入元素ele

pop_back();        // 删除最后一个元素

insert(const_iterator pos, ele);        // 迭代器指向位置pos插入元素ele

insert(const_iterator pos, int count, ele);        // 迭代器指向位置pos插入count个元素ele

erase(const_iterator pos);        // 删除迭代器指向的元素

erase(const_iterator start, const_iterator end);        // 删除迭代器从start到end之间的元素

clear();        // 删除容器中所有元素

#include <iostream>
#include <vector>

using namespace std;

void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int>v1;

	// 尾插
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);

	// 遍历
	printVector(v1);

	// 尾删
	v1.pop_back();
	v1.pop_back();
	printVector(v1);

	// 插入
	v1.insert(v1.begin(), 100);
	printVector(v1);

	v1.insert(v1.begin(), 2, 66);
	printVector(v1);

	// 删除
	v1.erase(v1.begin());
	printVector(v1);

	v1.erase(v1.begin(), v1.begin()+2);
	printVector(v1);

	// 清空
	v1.clear();
	printVector(v1);
}

int main(int argc, char* argv[])
{
	test01();
	return 0;
}

6. vector数据存取

函数原型:

at(int idx);        // 返回索引idx所指的数据

operator[idx];        // 返回索引idx所指的数据

front();        // 返回容器中第一个数据元素

back();        // 返回容器中最后一个数据元素

#include <iostream>
#include <vector>

using namespace std;

void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int>v1;
	
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}

	// 通过[]访问元素
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	// 通过at访问元素
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1.at(i) << " ";
	}
	cout << endl;

	cout << "第一个元素为:" << v1.front() << endl;

	cout << "最后一个元素为:" << v1.back() << endl;
}

int main(int argc, char* argv[])
{
	test01();
	return 0;
}

7. vector互换容器

函数原型:

swap(vec);        // 将vec与本身的元素互换

#include <iostream>
#include <vector>

using namespace std;

void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	
	vector<int>v2;
	v2.assign(10, 10);

	cout << "交换前:" << endl;
	cout << "v1:" << " ";
	printVector(v1);
	cout << "v2:" << " ";
	printVector(v2);

	v1.swap(v2);
	cout << "交换前:" << endl;
	cout << "v1:" << " ";
	printVector(v1);
	cout << "v2:" << " ";
	printVector(v2);
}

// 实际用途(巧用swap可以收缩内存空间)
void test02()
{
	vector<int>v1;
	for (int i = 0; i < 100000; i++)
	{
		v1.push_back(i);
	}
	cout << "v1的容量是:" << v1.capacity() << endl;
	cout << "v1的大小是:" << v1.size() << endl;

	v1.resize(3);
	cout << "v1的容量是:" << v1.capacity() << endl;
	cout << "v1的大小是:" << v1.size() << endl;

	// 巧用swap收缩内存
	vector<int>(v1).swap(v1);
	cout << "v1的容量是:" << v1.capacity() << endl;
	cout << "v1的大小是:" << v1.size() << endl;
}

int main(int argc, char* argv[])
{
	test01();
	test02();
	return 0;
}

vector<int>(v1).swap(v1);

v1在resize后,容量非常大,元素个数只有3

vector<int>(v1) ——> 利用v1目前的元素个数初始化一个匿名对象

swap(v1) ——> 指针的交换,v1指向匿名对象,匿名对象指向v1,当前行执行结束就会自动回收

总结:swap可以使两个容器互换,可以达到实用的收缩内存效果

8. vector预留空间

减少vector在动态扩展容量时的扩展次数

函数原型:

reserve(int len);        // 容器预留len个元素长度,预留位置不初始化,元素不可访问

#include <iostream>
#include <vector>

using namespace std;

void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int>v1;

	// 统计开辟次数
	int num = 0;
	int* p = NULL;
	for (int i = 0; i < 100000; i++)
	{
		v1.push_back(i);

		if (p != &v1[0])
		{
			p = &v1[0];
			num++;
		}
	}
	
	cout << "test01中num:" << num << endl;
}

void test02()
{
	vector<int>v1;

	// 统计开辟次数
	v1.reserve(100000);
	int num = 0;
	int* p = NULL;
	for (int i = 0; i < 100000; i++)
	{
		v1.push_back(i);

		if (p != &v1[0])
		{
			p = &v1[0];
			num++;
		}
	}

	cout << "test02中num:" << num << endl;
}

int main(int argc, char* argv[])
{
	test01();
	test02();
	return 0;
}

总结:如果数据量较大,可以一开始利用reserve预留空间

二、deque容器

1. deque基本概念

功能:双端数组,可以对头端进行插入删除操作

deque和vector区别:1)vector对于头部的插入删除效率低,数据量越大,效率越低

                                    2)deque相对而言,对头部的插入删除速度会比vector快

                                    3)vector访问元素时的速度会比deque快,这和两者内部实现有关 

deque内部工作原理:

deque内部有个中控器 ,维护每段缓冲区中的内容,缓冲区中存放真实数据

中控器维护的是每个缓冲区的地址,使得使用deque时想一片连续的内存空间

deque容器的迭代器也是支持随机访问的

2. deque构造函数

函数原型:

deque<T> deqT;        // 默认构造形式

deque(beg,end);        // 构造函数将[beg, end)区间中的元素拷贝给本身

deque(n, elem);        // 构造函数将n个elem拷贝给本身

deque(const deque &deq);        // 拷贝构造函数

#include <iostream>
#include <deque>

using namespace std;

void printDeque(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		// *it = 100; 报错:const只读
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	deque<int>d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	printDeque(d1);

	deque<int>d2(d1.begin(), d1.end());
	printDeque(d2);

	deque<int>d3(10, 100);
	printDeque(d3);

	deque<int>d4(d3);
	printDeque(d4);
}

int main(int argc, char* argv[])
{
	test01();
	return 0;
}

3. deque赋值操作

函数原型:

deque& operator=(const deque &deq);        // 冲澡等号操作符

assign(beg,end);        // 将[beg, end)区间中的数据拷贝赋值给本身

assign(n,elem);        // 将n个elem拷贝复制给本身

#include <iostream>
#include <deque>

using namespace std;

void printDeque(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	deque<int>d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	printDeque(d1);

	deque<int>d2;
	d2 = d1;
	printDeque(d2);

	deque<int>d3;
	d3.assign(d2.begin(), d2.end());
	printDeque(d3);

	deque<int>d4;
	d4.assign(10, 100);
	printDeque(d4);
}

int main(int argc, char* argv[])
{
	test01();
	return 0;
}

4. deque大小操作

函数原型:

deque.empty();        // 判断容器是否为空

deque.size();        // 返回容器中元素的个数

deque.resize(num);        // 重新指定容器的长度为num,若容器变长,则以默认值填充新位置

                                       // 如果容器变短,则末尾超出容器长度的元素被删除

deque.resize(num, elem);       // 重新指定容器的长度为num,若容器变长,则以默认值填充新位置

                                                // 如果容器变短,则末尾超出容器长度的元素被删除

#include <iostream>
#include <deque>

using namespace std;

void printDeque(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	deque<int>d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	printDeque(d1);

	if (d1.empty())
	{
		cout << "d1为空..." << endl;
	}
	else
	{
		cout << "d1不为空..." << endl;
		cout << "d1中元素的个数为:" << d1.size() << endl;
	}
	d1.resize(15);
	printDeque(d1);
	d1.resize(20,100);
	printDeque(d1);
	d1.resize(5);
	printDeque(d1);
}

int main(int argc, char* argv[])
{
	test01();
	return 0;
}

5. deque插入和删除

函数原型:

两端插入操作:

push_back(elem);        // 在容器尾部添加一个数据

push_front(elem);        // 在容器头部添加一个数据

pop_back();        // 删除容器最后一个数据

pop_front();        // 删除容器第一个数据

指定位置操作:

insert(pos, elem);        // 在pos位置插入一个elem元素的拷贝,返回新数据的位置

insert(pos, n, elem);        // 在pos位置插入n个elem数据,无返回值

insert(pos, beg, end);        // 在pos位置插入[beg, end)区间的数据,无返回值

clear();        // 清空容器的所有数据

erase(beg, end);        // 删除[beg, end)区间的数据,返回下一个数据的位置

erase(pos);        // 删除pos位置的数据,返回下一个数据的位置

6. deque数据存取

at(int idx);        // 返回索引idx所指的数据

operator[idx];        // 返回索引idx所指的数据

front();        // 返回容器中第一个数据元素

back();        // 返回容器中最后一个数据元素

7. deque排序

算法:

使用时需要包含头文件:#include <algorithm>

sort(iterator beg, iterator end)        // 对beg和end区间内元素进行排序(默认从小到大)

对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其进行排序

#include <iostream>
#include <deque>
#include <stdlib.h>
#include <algorithm>

using namespace std;

void printDeque(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	deque<int>d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(rand()%100);
	}
	cout << "排序前:";
	printDeque(d1);
	cout << endl;

	cout << "排序后:";
	sort(d1.begin(), d1.end());
	printDeque(d1);
	cout << endl;
}

int main(int argc, char* argv[])
{
	test01();
	return 0;
}

三、STL案例

1. 案例描述

有五名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分和最低分,取平均分

2. 实现步骤

1)创建五名选手,放到vector中

2)遍历vector容器,取出来每一个选手,执行for循环,把十个评分存到deque容器中

3)sort算法对deque容器中分数排序,去除最高分和最低分

4)deque容器遍历,计算总分

5)获取平均分

3. 代码实现

#include <iostream>
#include <vector>
#include <string>
#include <deque>
#include <algorithm>
#include <ctime>

using namespace std;

// 选手类
class Person
{
public:
	Person(string name, float score)
	{
		this->m_Name = name;
		this->m_Score = score;
	}
	string m_Name;
	float m_Score;
};

// 创建选手
void createPerson(vector<Person>& v)
{
	string nameSeed = "ABCDE";
	for (int i = 0; i < 5; i++)
	{
		string name = "选手";
		name += nameSeed[i];

		float score = 0;

		Person p(name, score);
		
		// 将创建好的选手对象放入容器
		v.push_back(p);
	}
}

void setScore(vector<Person>& v)
{
	for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
	{
		// 将评委的分数放入deque容器中
		deque<int>dscore;
		for (int i = 0; i < 10; i++)
		{
			int score = rand() % 41 + 60; // 生成60-100的分数
			dscore.push_back(score);
		}
		// 测试
		/*cout << "姓名:" << (*it).m_Name << "分数:";
		for (deque<int>::iterator dit = dscore.begin(); dit != dscore.end(); dit++)
		{
			cout << *dit << " ";
		}
		cout << endl;*/

		// 排序
		sort(dscore.begin(), dscore.end());

		// 去掉最高分和最低分
		dscore.pop_back();
		dscore.pop_front();

		// 获取平均分
		int sum = 0;
		for (deque<int>::iterator dit = dscore.begin(); dit != dscore.end(); dit++)
		{
			sum += *dit;
		}
		float average = sum / dscore.size();

		// 将平均分赋值给选手
		(*it).m_Score = average;
	}
}

void showScore(vector<Person>& v)
{
	for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << "姓名:" << (*it).m_Name << " " << "平均分" << (*it).m_Score << endl;
	}
}

void test01()
{
	// 随机数种子
	srand((unsigned int)time(NULL));

	// 1.创建五名选手
	vector<Person>v;
	createPerson(v);

	// 测试
	/*for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << "--------------" << endl;
		cout << "姓名:" << (*it).m_Name << endl;
		cout << "平均分:" << (*it).m_Score << endl;
	}*/

	// 2.给五名选手打分
	setScore(v);

	// 3.显示最后得分
	showScore(v);
}

int main(int argc, char* argv[])
{
	test01();
	return 0;
}

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

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

相关文章

VMware 安装及创建一个 CentOS Stream 的详细指南

文章目录 1. 简介2. 下载和安装1&#xff09;通过官网安装2&#xff09;通过电脑管家安装 3. 下载操作系统镜像包4. 创建虚拟机结语 1. 简介 在过去&#xff0c;服务器通常是运行单一操作系统和应用程序的物理设备。这就导致了硬件资源浪费和管理复杂性的增加。为了解决这些问…

注册中心--zookeeper 安装并启动

zookeeper 安装/启动 注册中心--zookeeper安装步骤zookeeper常用命令 注册中心–zookeeper zookeeper官方下载地址 最早由雅虎开发&#xff0c;用来解决分布式系统中的一致性问题。功能&#xff1a;包括配置管理、集群的扩容和缩容、分布式锁等等。 安装步骤 1&#xff09;…

C++学习笔记(二十八):c++ 静态库及动态库的使用

静态库的使用 库的使用会很大程度减少我们的工作&#xff0c;本节对c中静态库和动态库的使用进行简单的介绍。静态链接库意味着这个库会被放到可执行文件中&#xff0c;在生成的exe中。动态链接库是在程序运行时链接的&#xff0c;可以在程序运行时调用加载库函数的方法来实现&…

Java项目:07 Springboot的客户管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 springboot客户管理系统 功能模块&#xff1a;登录修改密码客户列表充值列表消费记录客户类型 环境&#xff1a;IDEAjdk1.8Tomcat9MySQL5.7maven3.6…

基于Matlab/Simulink开发自动驾驶的解决方案

文章目录 处理自动驾驶数据 仿真自动驾驶场景 设计感知算法 设计规划和控制算法 生成代码和部署算法 集成和测试 参考文献 使用 MATLAB/Simulink开发自动驾驶&#xff0c;能够深入建模真实世界的行为、减少车辆测试并验证嵌入式软件的功能&#xff0c;从而推进自动驾驶感…

linux安装系统遇到的问题

这两天打算攻克下来网络编程&#xff0c;发现这也确实是很重要的一个东西&#xff0c;但我就奇了怪了&#xff0c;老师就压根没提&#xff0c;反正留在我印象的就一个tcp/ip七层网络。也说正好&#xff0c;把linux命令也熟悉熟悉&#xff0c;拿着我大一课本快速过过 连接cento…

AI大模型学习笔记一

一、商业观点&#xff1a;企业借助大模型获得业务增长可能 二、底层原理&#xff1a;transformer 1&#xff09;备注 ①下面每个步骤都是自回归的过程&#xff08;aotu-regressive&#xff09;&#xff1a;已输出内容的每个字作为输入&#xff0c;一起生成下一个字 ②合起来就…

服务器IP如何隐藏

说到 IP 地址&#xff0c;它足以作为服务器的定位标志&#xff0c;算是在互联网上的名片。因此&#xff0c;当一些黑客攻击服务器时&#xff0c;IP 地址便会成为首要目标。为保护服务器避免受到潜在的攻击和侦察&#xff0c;隐藏服务器的真实 IP 地址是一项重要的措施。 服务器…

花了三天的时间做了一个多功能 AI 助手

嗨&#xff01;我是团子&#xff0c;大家新年快乐呀~ 前几天看到一些好朋友在朋友圈晒自己的年度总结&#xff0c;立新年 Flag&#xff0c;看到大家一年满满的收获&#xff0c;再看看自己&#xff0c;不由得想再看看人家&#xff0c;然后再看看自己&#xff0c;然后再看看人家…

Android-基础

Activity生命周期 1.启动Activity&#xff1a;系统会先调用onCreate方法&#xff0c;然后调用onStart方法&#xff0c;最后调用onResume&#xff0c;Activity进入运行状态。 2.当前Activity被其他Activity覆盖其上或被锁屏&#xff1a;系统会调用onPause方法&#xff0c;暂停当…

seata分布式事务(与dubbo集成)

1.seata是什么? Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 2.seata的注解 GlobalTransactional&#xff1a;全局事务注解&#xff0c;添加了以后可实现分布式事务的回滚和提交&#xff0c;用法与spring…

数据分析-Pandas如何重塑数据表

数据分析-Pandas如何重塑数据表 数据表&#xff0c;时间序列数据在数据分析建模中很常见&#xff0c;例如天气预报&#xff0c;空气状态监测&#xff0c;股票交易等金融场景。数据分析过程中重新调整&#xff0c;重塑数据表是很重要的技巧&#xff0c;此处选择Titanic数据&…

FreeRTOS 学习相关笔记 附C语言内容补充

学习视频为【正点原子】手把手教你学FreeRTOS实时系统 文章目录 RTOS 入门裸机RTOSFreeRTOS任务调度方式任务状态 FreeRTOS 移植系统配置文件 API函数任务创建和删除动态方式创建任务静态方式创建任务删除任务 任务挂起和恢复函数调度器挂起与恢复临界区任务调度器的挂起和恢复…

anoconda 安装报错

表现形式&#xff1a;Output folder: D:\anoconda\Lib Extract: _nsis.py Extract: _system_path.py Output folder: D:\anoconda........................ 解决办法&#xff1a; 网址&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Sour…

Java循环语句

1&#xff1a;for循环结构 循环结构有三种语句&#xff0c;分别是&#xff1a; for循环 while循环 do…while循环 这三种循环可以做相同的事情&#xff0c;当然它们也有小的区别 1.1 for循环结构 这段代码的作用&#xff0c;是用来展示手机信息1000次。 还提到了这里的几…

Rust-trait

Rust语言中的trait是非常重要的概念。 在Rust中&#xff0c;trait这一个概念承担了多种职责。在中文里&#xff0c;trait可以翻译为“特征”“特点”“特性”等。 成员方法 trait中可以定义函数。用例子来说明&#xff0c;我们定义如下的trait: 上面这个trait包含了一个方法…

甜蜜而简洁 —— 深入了解Pytest插件pytest-sugar

在日常的软件开发中&#xff0c;测试是确保代码质量的关键步骤之一。然而&#xff0c;对于测试报告的生成和测试结果的可读性&#xff0c;一直以来都是开发者关注的焦点。Pytest插件 pytest-sugar 以其清晰而美观的输出&#xff0c;为我们提供了一种愉悦的测试体验。本文将深入…

Springboot WebFlux项目结合mongodb进行crud

第一步&#xff1a;创建项目 第二步&#xff1a;给mongodb插入数据 第三步&#xff1a;创建实体类 package org.cyl.test02.entity;// Task.java import lombok.Data;Data public class Task {private String id;private String description; }第四步&#xff1a;创建Reposito…

React Native 原生组件回调JS层方法和 JS 层调用原生组件的事件方法

一、原生组件回调 JS 层提供的事件方法 比如 TextInput 组件 onChangeText 属性&#xff0c;输入事件是发生在原生层的但是需要通知 JS 层发生了变化&#xff0c;并执行 JS 层的方法。 1、给原生组件添加一个按钮用于触发原生事件方法 在 XML 中添加一个按钮 为了方便让 Inf…

三、电脑软件路径移动方式

一、电脑文件移动 当我们想整理硬盘或者移动软件时&#xff0c;常常会遇到多种多样的问题&#xff0c;下面就来说明一下我遇到的问题 1.桌面 解释&#xff1a;移动路径会导致桌面快捷方式失效&#xff0c;下面以图片解答如何恢复 原理&#xff1a;桌面快捷方式保存在C:\Users…