【c++】map和set的封装

1.红黑树源码

我们使用上节课的红黑树源码来封装map和set.
因为map存的是(key,value),set存的是(key),为了我们set和map使用同一个类模板(红黑树),所以我们先要修改红黑树结点中存的数据类型,我们使用模板来初始化,根据实列化来决定结点中存的是pair,还是只有一个数据

做出修改:代码中所有key的地方用data代替,而data的数据类型是T,当是set实列化的时候T就是int(一种),当是map的时候T就是pair,比方说pair<string,int>

#include<iostream>
#include<string>
using namespace std;
enum Colour
{
	RED,
	BLACK

};
template<class  T>
struct rbtreenode
{
	rbtreenode<T>* _left;
	rbtreenode<T>* _right;
	rbtreenode<T>* _parent;
	T _data;
	Colour _col;
	
	rbtreenode(const T& data)
		:_left(nullptr)
		, _right(nullptr)
		, _parent(nullptr)
		, _data(data)
		, _col(RED)

		

	{}



};

template<class  T>
class rbtree
{
	typedef  rbtreenode<T> node;
public:
	void spinleft(node* parent)
	{
		node* subr = parent->_right;
		node* subrl = subr->_left;

		parent->_right = subrl;
		if (subrl)
			subrl->_parent = parent;

		subr->_left = parent;
		node* ppnode = parent->_parent;
		parent->_parent = subr;




		if (ppnode == nullptr)
		{

			_root = subr;
			subr->_parent = nullptr;


		}
		else
		{

			if (ppnode->_left == parent)
			{
				ppnode->_left = subr;
				subr->_parent = ppnode;

			}
			else
			{

				ppnode->_right = subr;
				subr->_parent = ppnode;


			}


		}







	

	}
	void spinright(node* parent)
	{

		node* subl = parent->_left;
		node* sublr = subl->_right;



		parent->_left = sublr;
		if (sublr)
			sublr->_parent = parent;



		subl->_right = parent;
		node* ppnode = parent->_parent;
		parent->_parent = subl;

		if (ppnode == nullptr)
		{

			_root = subl;
			subl->_parent = nullptr;


		}
		else
		{

			if (ppnode->_left == parent)
			{
				ppnode->_left = subl;
				subl->_parent = ppnode;

			}
			else
			{

				ppnode->_right = subl;
				subl->_parent = ppnode;


			}


		}




	



	}

	void spinlr(node* parent)
	{
		node* subl = parent->_left;
		node* sublr = subl->_right;
		//int bf = sublr->_bf;

		spinleft(parent->_left);
		spinright(parent);



	/*	if (bf == 1)
		{
			subl->_bf = -1;
			sublr->_bf = 0;
			parent->_bf = 0;
		}
		else if (bf == -1)
		{

			subl->_bf = 0;
			sublr->_bf = 0;
			parent->_bf = 1;



		}
		else
		{
			subl->_bf = 0;
			sublr->_bf = 0;
			parent->_bf = 0;

		}*/

	}
	void spinrl(node* parent)
	{
		node* subr = parent->_right;
		node* subrl = subr->_left;
		//int bf = subrl->_bf;


		spinright(subr);
		spinleft(parent);
	/*	if (bf == 1)
		{

			parent->_bf = -1;
			subr->_bf = 0;
			subrl->_bf = 0;
		}
		else if (bf == -1)
		{

			parent->_bf = 0;
			subr->_bf = 1;
			subrl->_bf = 0;


		}
		else
		{
			subr->_bf = 0;
			subrl->_bf = 0;
			parent->_bf = 0;

		}*/
	}

	bool insert(const T& data)
	{
		if (_root == nullptr)
		{
			_root = new node(data);
			_root->_col = BLACK;
			return true;

		}
		node* cur = _root;
		node* parent = nullptr;
		while (cur)
		{
			if (cur->_data > data)
			{
				parent = cur;
				cur = cur->_left;


			}
			else if (cur->_data < data)
			{
				parent = cur;
				cur = cur->_right;



			}
			else
			{

				return false;
			}







		}
		cur = new node(data);
		if (parent->_data > data)
		{
			parent->_left = cur;



		}
		else
		{

			parent->_right = cur;


		}
		cur->_parent = parent;
		while (parent && parent->_col == RED)
		{
			node* grandfather = parent->_parent;
			if (parent == grandfather->_left)
			{
				node* uncle = grandfather->_right;
				if (uncle && uncle->_col == RED)
				{
					parent->_col = BLACK;
					uncle->_col = BLACK;
					grandfather->_col = RED;


					cur = grandfather;
					parent = cur->_parent;



				}
				else
				{
					if (cur == parent->_right)
					{
						spinright(grandfather);
						parent->_col = BLACK;
						grandfather->_col = RED;
					}

					else
					{
						spinleft(parent);
						spinright(grandfather);
						cur->_col = BLACK;
						grandfather->_col = RED;


					}

					break;







				}












			}
			else
			{

				node* uncle = grandfather->_left;
				if (uncle && uncle->_col == RED)
				{
					parent->_col = BLACK;
					uncle->_col = BLACK;
					grandfather->_col = RED;


					cur = grandfather;
					parent = cur->_parent;



				}
				else
				{
					if (cur == parent->_left)
					{
						spinleft(grandfather);
						parent->_col = BLACK;
						grandfather->_col = RED;
					}

					else
					{
						spinright(parent);
						spinleft(grandfather);
						cur->_col = BLACK;
						grandfather->_col = RED;


					}



					break;



				}













			}














		}
		_root->_col = BLACK;
		return true;

	}

	bool Check(node* cur)
	{
		if (cur == nullptr)
			return true;

		if (cur->_col == RED && cur->_parent->_col == RED)
		{
			cout << cur->_key<< "存在连续的红色节点" << endl;
			return false;
		}

		return Check(cur->_left)
			&& Check(cur->_right);
	}

	bool IsBalance()
	{
		if (_root && _root->_col == RED)
			return false;

		return Check(_root);
	}

	void inorder()
	{

		_inorder(_root);


	}
	void _inorder(node* root)
	{
		if (root == nullptr)
			return;

		_inorder(root->_left);
		cout << root->_data  << endl;
		_inorder(root->_right);




	}

	node* Find(const T& data)
	{
		node* cur = _root;
		node* parent = nullptr;
		while (cur)
		{
			if (cur->_data > data)
			{
				parent = cur;
				cur = cur->_left;


			}
			else if (cur->_data < _data)
			{
				parent = cur;
				cur = cur->_right;



			}
			else
			{

				return cur;
			}
		}
	
	
		return nullptr;
	
	
	
	
	
	
	
	}

	


private:


	int treeheight(node* root)
	{
		if (root == nullptr)
			return 0;
		int leftheight = treeheight(root->_left);
		int rightheight = treeheight(root->_right);
		return leftheight > rightheight ? leftheight + 1 : rightheight + 1;

	}


	node* _root = nullptr;




};
int main()
{
	rbtree<int>st;
	int a[] = //{ 16,3,1 };//测试右旋
			  //{ 16,32,58 };//测试左旋
		//{ 8,3,1,10,6,4};//测试右左旋

	{ 4, 2, 6, 1, 3, 5, 15, 7, 16,14 };


	for (auto e : a)
	{
		st.insert(e);



	}

	st.inorder();
	int ret = st.IsBalance();
	cout << endl;
	cout << ret;

}

2.set和map类的简单封装

在这里插入图片描述

#pragma once
#include"rbtree.h"
namespace zjw
{
	template<class K,class V>
	class map {
	public:



	private:
		rbtree<K,pair<K,V>>_st;
	};
}

#pragma once
#include"rbtree.h"
namespace zjw
{
	template<class K>
	class set {
	public:



	private:
		rbtree<K, K>_st;
	};
}

3.map和set调用底层rbtree的insert函数

在这里插入图片描述

#pragma once
#include"rbtree.h"
namespace zjw
{
	template<class K,class V>
	class map {
	public:
		bool insert(cosnt pair<K, V>& kv)
		{
		
			return _st.insrt(kv);
		
	
		}


	private:
		rbtree<K,pair<K,V>>_st;
	};
}

#pragma once
#include"rbtree.h"
namespace zjw
{
	template<class K>
	class set {
	public:
		bool insert(const K& key)
		{
			return _st.insert(key);
		
	
		}


	private:
		rbtree<K, K>_st;
	};
}

4.阶段测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5._data的元素提取

因为我们不管是map还是set,他们插入都是根据第一个模板参数比较大小,来确定插入当前结点的左还是右,但是为什么之前的代码没有报错??
因为如果是map的话,pair也是可以比较大小的,规则是第一个大的大。第一个一样大,就比较第二个,第二个谁大就大
在这里插入图片描述
但是我们回顾之前的map和set都是按照第一个比较,所以我们可以这样做。在map和set类中定义内部类,如果rbtree中有需要比较data大小时,初始化一个内部类取data第一个内容来比较,我们只需要在map和set中初始化一个内部类对象即可返回data的第一个内容。
在这里插入图片描述

在rbtree中需要比较_data的地方都需要使用类对象来返回data的第一个内容

#pragma once
#include<iostream>
#include<string>
using namespace std;
enum Colour
{
	RED,
	BLACK

};
template<class  T>
struct rbtreenode
{
	rbtreenode<T>* _left;
	rbtreenode<T>* _right;
	rbtreenode<T>* _parent;
	T _data;
	Colour _col;

	rbtreenode(const T& data)
		:_left(nullptr)
		, _right(nullptr)
		, _parent(nullptr)
		, _data(data)
		, _col(RED)



	{}



};

template<class K,class  T,class OFKEY>
class rbtree
{
	typedef  rbtreenode<T> node;
public:
	void spinleft(node* parent)
	{
		node* subr = parent->_right;
		node* subrl = subr->_left;

		parent->_right = subrl;
		if (subrl)
			subrl->_parent = parent;

		subr->_left = parent;
		node* ppnode = parent->_parent;
		parent->_parent = subr;




		if (ppnode == nullptr)
		{

			_root = subr;
			subr->_parent = nullptr;


		}
		else
		{

			if (ppnode->_left == parent)
			{
				ppnode->_left = subr;
				subr->_parent = ppnode;

			}
			else
			{

				ppnode->_right = subr;
				subr->_parent = ppnode;


			}


		}









	}
	void spinright(node* parent)
	{

		node* subl = parent->_left;
		node* sublr = subl->_right;



		parent->_left = sublr;
		if (sublr)
			sublr->_parent = parent;



		subl->_right = parent;
		node* ppnode = parent->_parent;
		parent->_parent = subl;

		if (ppnode == nullptr)
		{

			_root = subl;
			subl->_parent = nullptr;


		}
		else
		{

			if (ppnode->_left == parent)
			{
				ppnode->_left = subl;
				subl->_parent = ppnode;

			}
			else
			{

				ppnode->_right = subl;
				subl->_parent = ppnode;


			}


		}








	}

	void spinlr(node* parent)
	{
		node* subl = parent->_left;
		node* sublr = subl->_right;
		//int bf = sublr->_bf;

		spinleft(parent->_left);
		spinright(parent);



		/*	if (bf == 1)
			{
				subl->_bf = -1;
				sublr->_bf = 0;
				parent->_bf = 0;
			}
			else if (bf == -1)
			{

				subl->_bf = 0;
				sublr->_bf = 0;
				parent->_bf = 1;



			}
			else
			{
				subl->_bf = 0;
				sublr->_bf = 0;
				parent->_bf = 0;

			}*/

	}
	void spinrl(node* parent)
	{
		node* subr = parent->_right;
		node* subrl = subr->_left;
		//int bf = subrl->_bf;


		spinright(subr);
		spinleft(parent);
		/*	if (bf == 1)
			{

				parent->_bf = -1;
				subr->_bf = 0;
				subrl->_bf = 0;
			}
			else if (bf == -1)
			{

				parent->_bf = 0;
				subr->_bf = 1;
				subrl->_bf = 0;


			}
			else
			{
				subr->_bf = 0;
				subrl->_bf = 0;
				parent->_bf = 0;

			}*/
	}

	bool insert(const T& data)
	{
		OFKEY sk;
		if (_root == nullptr)
		{
			_root = new node(data);
			_root->_col = BLACK;
			return true;

		}
		node* cur = _root;
		node* parent = nullptr;
		while (cur)
		{
			if (sk(cur->_data) > sk(data))
			{
				parent = cur;
				cur = cur->_left;


			}
			else if (sk(cur->_data) < sk(data))
			{
				parent = cur;
				cur = cur->_right;



			}
			else
			{

				return false;
			}







		}
		cur = new node(data);
		if (sk(parent->_data) > sk(data))
		{
			parent->_left = cur;



		}
		else
		{

			parent->_right = cur;


		}
		cur->_parent = parent;
		while (parent && parent->_col == RED)
		{
			node* grandfather = parent->_parent;
			if (parent == grandfather->_left)
			{
				node* uncle = grandfather->_right;
				if (uncle && uncle->_col == RED)
				{
					parent->_col = BLACK;
					uncle->_col = BLACK;
					grandfather->_col = RED;


					cur = grandfather;
					parent = cur->_parent;



				}
				else
				{
					if (cur == parent->_right)
					{
						spinright(grandfather);
						parent->_col = BLACK;
						grandfather->_col = RED;
					}

					else
					{
						spinleft(parent);
						spinright(grandfather);
						cur->_col = BLACK;
						grandfather->_col = RED;


					}

					break;







				}












			}
			else
			{

				node* uncle = grandfather->_left;
				if (uncle && uncle->_col == RED)
				{
					parent->_col = BLACK;
					uncle->_col = BLACK;
					grandfather->_col = RED;


					cur = grandfather;
					parent = cur->_parent;



				}
				else
				{
					if (cur == parent->_left)
					{
						spinleft(grandfather);
						parent->_col = BLACK;
						grandfather->_col = RED;
					}

					else
					{
						spinright(parent);
						spinleft(grandfather);
						cur->_col = BLACK;
						grandfather->_col = RED;


					}



					break;



				}













			}














		}
		_root->_col = BLACK;
		return true;

	}

	bool Check(node* cur)
	{
		if (cur == nullptr)
			return true;

		if (cur->_col == RED && cur->_parent->_col == RED)
		{
			cout << cur->_data << "存在连续的红色节点" << endl;
			return false;
		}

		return Check(cur->_left)
			&& Check(cur->_right);
	}

	bool IsBalance()
	{
		if (_root && _root->_col == RED)
			return false;

		return Check(_root);
	}

	void inorder()
	{

		_inorder(_root);


	}
	void _inorder(node* root)
	{
		if (root == nullptr)
			return;

		_inorder(root->_left);
		cout << root->_data << endl;
		_inorder(root->_right);




	}

	node* Find(const T& data)
	{
		OFKEY sk;
		
		node* cur = _root;
		node* parent = nullptr;
		while (cur)
		{
			if (sk(cur->_data) > sk(data))
			{
				parent = cur;
				cur = cur->_left;


			}
			else if (sk(cur->_data) < sk(data))
			{
				parent = cur;
				cur = cur->_right;



			}
			else
			{

				return cur;
			}
		}


		return nullptr;







	}




private:


	int treeheight(node* root)
	{
		if (root == nullptr)
			return 0;
		int leftheight = treeheight(root->_left);
		int rightheight = treeheight(root->_right);
		return leftheight > rightheight ? leftheight + 1 : rightheight + 1;

	}


	node* _root = nullptr;




};

6.迭代器

template<class T,class Pef,class Ptr>
struct _rbtreeIterator
{


	typedef rbtreenode<T> node;
	typedef _rbtreeIterator<T, Pef, Ptr> Self;
	Node* _node;
public:
	_rbtreeIterator(Node* node)
		:_node(node)
	{
	  //默认构造
	
	}

	Self& operator++()
	{
	 //迭代器++
	
	
	}

	Self& operator--()
	{
		//迭代器--


	}
	bool operator!=(Self& s)
	{
	   //两个结点是否是同一结点
	
	
	}
	Pef operator*()
	{
	  
	  //重载*
	
	
	}
	Ptr operator->()
	{
	
	  //重载->
	
	}

};

上面迭代器封装在list里面有说过

template<class T,class Pef,class Ptr>
struct _rbtreeIterator
{


	typedef rbtreenode<T> node;
	typedef _rbtreeIterator<T, Pef, Ptr> Self;
	Node* _node;
public:
	_rbtreeIterator(Node* node)
		:_node(node)
	{
	  //默认构造







	
	}

	Self& operator++()
	{
	 //迭代器++
	
	
	}

	Self& operator--()
	{
		//迭代器--


	}
	bool operator!=(Self& s)
	{
	   //两个结点是否是同一结点
		return _node != s._node;
	
	
	}
	Pef operator*()
	{
	  
	  //重载*
		return _node->_data;
	
	
	}
	Ptr operator->()
	{
	
	  //重载->
		return &_node->_data
	
	}

};

重点说一下迭代器++和–,
在这里插入图片描述

	Self& operator++()
	{
	 //迭代器++
		if (_node->_right)
		{
			Node* next = _node->_right;
			while (next->_left)
			{
				next = next->_left;
			
		
			}
	_node = next;
       }

		
	
	}

如果_node没有右结点的话,迭代器++下一个位置应该是哪里呢?
比方说_node在6的位置
在这里插入图片描述

	Self& operator++()
	{
	 //迭代器++
		if (_node->_right)
		{
			Node* next = _node->_right;
			while (next->_left)
			{
				next = next->_left;
			
		
			}


			_node = next;


		}
		else
		{
			Node* cur = _node;
			Node* parent = cur->_parent;
			while (parent && cur == parent->_right)//循环找孩子是父亲左的父亲,该父亲是下一个迭代器的结点
			{

				cur = parent;
				parent = parent->_parent;
			}

			_node = parent;
		

		}

	 return *this;
	
	}

同理–

	Self& operator--()
	{
		//迭代器--
		if (_node->_left)
		{
			Node* next = _node->_left;
			while (next->_right)
			{
				next = next->_right;


			}


			_node = next;


		}
		else
		{
			Node* cur = _node;
			Node* parent = cur->_parent;
			while (parent && cur == parent->_left)
			{

				cur = parent;
				parent = parent->_parent;
			}

			_node = parent;


		}
		return *this;


	}

红黑树调用迭代器


template<class K,class  T,class OFKEY>
class rbtree
{
	typedef  rbtreenode<T> node;
	typedef _rbtreeIterator<T, T&, T*>  iterator;
public:
	iterator begin()
	{
	 //红黑树根结点的最左结点为最小
		node* cur = _root->_left;
		while (cur)
		{
			cur = cur->_left;

		}
		return iterator(cur);
	
	
	}
	iterator end()
	{

    //空
		return iterator(nullptr);

	}

在这里插入图片描述
在这里插入图片描述

7.set迭代器测试

#pragma once
#include"rbtree.h"
namespace zjw
{
	template<class K>
	class set {
		struct SETOFKEY
		{
			const K& operator()(const K&key)
			{
			
				return key;
			
			
			
			}
		};

	public:
		typedef typename rbtree<K, K, SETOFKEY>::iterator iterator;
		bool insert(const K& key)
		{
			return _st.insert(key);
		
	
		}
		iterator begin()
		{
			return _st.begin();
		
		}

		iterator end()
		{
			return _st.end();
		
		
		}


	private:
		rbtree<K, K,SETOFKEY>_st;
	};

	void testset()
	{
		set<int>s;
		int a[] = { 4, 2, 6, 1, 3, 5, 15, 7, 16,14 };


		for (auto e : a)
		{
			s.insert(e);



		}
		set<int>::iterator it = s.begin();
		while (it != s.end())
		{


			cout << *it << endl;
			++it;


		}

	
	
	}



}
#include<iostream>
#include<string>
#include"mymap.h"
#include"myset.h"
using namespace std;
int main()
{
	//zjw::testmap();
	zjw::testset();


}

在这里插入图片描述

8.map迭代器测试

#pragma once
#include"rbtree.h"
namespace zjw
{
	template<class K,class V>
	class map {
		struct MAPOFKEY
		{
			const K& operator()(const pair<K,V>&kv)
			{ 

				return kv.first;
		
			}
		};

	public:
		typedef typename rbtree<K, pair<K,V>, MAPOFKEY>::iterator iterator;
		bool insert(const pair<K, V>& kv)
		{
		
			return _st.insert(kv);
		
	
		}
		iterator begin()
		{
			return _st.begin();

		}

		iterator end()
		{
			return _st.end();


		}


	private:
		rbtree<K,pair<K,V>, MAPOFKEY>_st;
	};
	void testmap()
	{
		map<string, int>sr;
		sr.insert(make_pair("b", 1));
		sr.insert(make_pair("think", 1));
		sr.insert(make_pair("cool", 1));
		map<string, int>::iterator it = sr.begin();
		//	//auto it = dic.begin();
		while (it != sr.end())
		{


			cout << it->first << ":" << it->second << endl;
			++it;
		}
		cout << endl;
	

	}



}
#include<iostream>
#include<string>
#include"mymap.h"
#include"myset.h"
using namespace std;
int main()
{
	zjw::testmap();
	//zjw::testset();


}

在这里插入图片描述

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

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

相关文章

苹果永久版安装PD虚拟机:Parallels Desktop 19 一键激活版

Parallels Desktop 19是一款功能强大的虚拟机软件&#xff0c;专为Mac用户设计&#xff0c;允许用户在同一台Mac电脑上同时运行Windows、Linux等多个操作系统&#xff0c;而无需额外的硬件设备。 下载地址&#xff1a;https://www.macz.com/mac/9581.html?idOTI2NjQ5Jl8mMjcuM…

Java环境搭建(二)Notepad++和IDEA的下载

Notepad&#xff08;不推荐使用&#xff09; 高级记事本 下载地址 Notepad (juxinwk1.cn) 下载安装后一直下一步就可以了 注&#xff1a;改一下路径还有建立快捷方式&#xff08;自己选择&#xff09; IDEA 集成环境 下载地址 IntelliJ IDEA – the Leading Java and Kotl…

展馆展厅设计施工流程

1、需求分析和确定&#xff1a; 与客户沟通&#xff0c;了解客户需求&#xff0c;对展馆展厅的用途、面积、功能、展品特点等进行分析&#xff0c;并确定设计方案。 2、方案设计 根据需求确定设计方案&#xff0c;包括平面布局、展品陈列、展示方式、照明等。设计师需要提供设计…

防静电劳保鞋:工业安全中的隐形守护者

在工业生产环境中&#xff0c;静电问题常常被忽视&#xff0c;然而它却是许多安全事故的潜在隐患。静电不仅可能损坏敏感的电子设备&#xff0c;更在易燃易爆环境中构成严重威胁。因此&#xff0c;防静电措施在工业安全中显得尤为重要。在众多防静电措施中&#xff0c;防静电劳…

618有哪些好物值得推荐?收下这份618必买好物清单

随着618购物节的脚步越来越近&#xff0c;你是不是已经开始摩拳擦掌&#xff0c;准备大肆采购一番了&#xff1f;在这个购物狂欢节里&#xff0c;要说哪些宝贝最值得你入手&#xff0c;那一定少不了数码家电类&#xff01;今天就给大家整理了一些我往期自用过还不错的数码家电好…

各种姿势打穿企业内网

以前不是说要讲隧道吗&#xff1f;&#xff1f;&#xff1f; 鸽了这么久终于想起来了&#xff01;&#xff01;&#xff01; 1.本次实验环境拓扑 先来讲一下本次的实验环境吧&#xff0c;这样会更加清晰明了一点 首先我们是拿到了win7&#xff0c;然后最终目标上线内网的Wi…

回收站删除的照片怎么恢复?7个实用方法为你找回照片!

“我刚刚在对电脑上的照片进行清理&#xff0c;不小心错删了一张还需要的照片&#xff0c;但是在使用回收站时&#xff0c;将它删除了&#xff0c;有什么恢复回收站照片的简单方法吗&#xff1f;” 照片是我们生活点滴的见证&#xff0c;无论是外出旅游还是日常琐碎&#xff0c…

SpringBoot环境隔离Profiles

前言 通常我们开发不可能只有一个生产环境&#xff0c;还会有其它的开发&#xff0c;测试&#xff0c;预发布环境等等。为了更好的管理每个环境的配置项&#xff0c;springboot也提供了对应的环境隔离的方法。 直接上干货 知识点 激活环境方法 1&#xff0c;在application…

树莓派3B+入门(无外设)

昨日刚到一块树莓派3B&#xff0c;甚是喜爱&#xff0c;然半宿未眠 1、下载 在官网先下载烧录文件https://www.raspberrypi.com/software/ 下载完毕打开&#xff0c;选择&#xff0c;根据自己板子型号定 操作系统用最新的就行&#xff0c;64位不太稳定 储存卡&#xff0c;需…

代码随想录算法训练营第二十九天|39. 组合总和、40.组合总和II、131.分割回文串

39. 组合总和 文档讲解代码随想录 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 这道题目的关键点&#xff1a; candidates &#xff1a;无重复元素的数组、candidates 中的数字可以无限制重复被选取。 与之前做过的组合问题的区别&#xff1a; 组合问题…

Leetcode2391. 收集垃圾的最少总时间

Every day a Leetcode 题目来源&#xff1a;2391. 收集垃圾的最少总时间 解法1&#xff1a;前缀和 收集垃圾的时间分为两部分&#xff1a; 垃圾车收拾垃圾的时间&#xff1a;垃圾车收拾一单位的任何一种垃圾都需要花费 1 分钟。三辆垃圾车行驶的时间&#xff1a;每辆垃圾车…

windows部署腾讯tmagic-editor03-DSL 解析渲染

创建项目 将上一教程中的editor-runtime和hello-editor复制过来 概念 实现 创建hello-ui目录 渲染节点 在hello-ui下创建 Component.vue 文件 由于节点的type是由业务自行定义的&#xff0c;所以需要使用动态组件渲染&#xff0c;在vue下可以使用component组件来实现 c…

软考笔记随记

原码:(0正1负) 原码是最直观的编码方式,符号位用0表示正数,用1表示负数,其余位表示数值的大小。 例如,+7的原码为00000111,-7的原码为10000111。 原码虽然直观,但直接用于加减运算会导致计算复杂,且0有两种表示(+0和-0),不唯一。 反码: 反码是在原码的基础上得…

绘唐2跟绘唐3有什么区别

绘唐2跟绘唐3有什么区别 这款产品的最大亮点在于其高度精准的语音克隆能力&#xff0c;利用先进的模型&#xff0c;能够捕捉到用户独特的音调、音高和调制方式&#xff0c;使用户能够以前所未有的方式复制和利用自己的声音。仅需10秒钟的录制时间&#xff0c;即可实现声音的克…

【C语言】自定义类型之---结构体超详解(结构体的定义使用、指针结构体,内存对齐,......代码详解)

目录 前言&#xff1a; 一&#xff1a;结构体 1.1&#xff1a;什么是结构体&#xff1f; 1.2&#xff1a;结构体类型的声明 1.3&#xff1a;结构体变量的定义 1.4&#xff1a;结构体的内存对齐 1.5&#xff1a;结构体传参 二&#xff1a;位段 2.1&#xff1a;位段是什…

docker镜像容器常用命令

常用基础命令1、docker info #查看docker版本等信息 2、docker search jenkins #搜索jenkins镜像 3、docker history nginx #查看镜像中各层内容及大小,每层对应的dockerfile中的一条指令。 4、docker network ls #显示当前主机上的所有网络 5、docker logs nginx …

2024MySQL8安装与绿色版Navicat连接【提供安装包】数据库

视频教程面向人群和使用方法&#xff1a; 1&#xff1a;大学生【解决老师作业或自己兴趣学习需要】; 2&#xff1a;第一次需要安装MySQL的开发者【需要简单使用&#xff0c;因为项目会用到】 3&#xff1a;老手二倍速&#xff0c;新手老老实实按照教程一倍速模仿视频操作&am…

【虚拟机】深入理解java虚拟机【内存溢出实例】

目录 一、问题解析 二、粉丝福利 一、问题解析 通过简单的小例子程序&#xff0c;演示java虚拟机各部分内存溢出情况&#xff1a; (1).java堆溢出&#xff1a; Java堆用于存储实例对象&#xff0c;只要不断创建对象&#xff0c;并且保证GC Roots到对象之间有引用的可达&am…

[数据集][目标检测]卡车抓斗卸车检测数据集VOC+YOLO格式213张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;213 标注数量(xml文件个数)&#xff1a;213 标注数量(txt文件个数)&#xff1a;213 标注类别…

ROS从入门到精通4-3:制作Docker镜像文件Dockerfile

目录 0 专栏介绍1 为什么需要Dockerfile&#xff1f;2 Dockerfile书写原则3 Dockerfile常用指令3.1 FROM3.2 MAINTAINER3.3 RUN3.4 ADD3.5 COPY3.6 CMD3.7 ENV3.8 EXPOSE3.9 WORKDIR3.10 ARG 4 Dockerfile构建ROS工程实例 0 专栏介绍 本专栏旨在通过对ROS的系统学习&#xff0…