C#简单数据结构类和常用泛型结构类

news2024/12/25 14:07:38

文章目录

      • 1.简单数据结构类
        • (1)动态数组Arraylist
        • (2)栈Stack
        • (3)队列Queue
        • (4)哈希表Hashtable
      • 2.泛型
      • 3.常用泛型数据结构类
        • (1)列表List
        • (2)字典Dictionary
        • (3)顺序存储和链式存储
        • (4)泛型双向链表Linkedlist
        • (5)泛型栈和队列

1.简单数据结构类

(1)动态数组Arraylist

Arraylist是C#封装好的类,本质是一个object类型的数组,可以使用该类提供的方法进行增删改查。

using System.Collections;//需要引用命名空间
using System;
namespace Test
{
	class Program
	{
		public static void Main(string[] args)
		{
            ArrayList array = new ArrayList();
            //增  存储任意对象
            array.Add(1);
            array.Add("nihao");
            array.Add(true);
            array.Add(new object());
            ArrayList array2 = new ArrayList(); //拼接array2
            array2.Add(123);
            array.AddRange(array2);//从后面依次累加
            array.Insert(1,"1234567");//将元素插到指定位置
            //删
            array.Remove(1);//从前往后删除指定元素
            array.RemoveAt(2);//移除第二个位置的元素
            array.Clear();//清空
            //
            array.Add(1);
            array.Add("nihao");
            array.Add(true);
            //改
            array[1] = 999;
            //查
            Console.WriteLine(array[0]);//得到第0个位置的元素
            bool position = array.Contains("nihao");//查看ArrayList是否有该元素
            int index = array.IndexOf(true);//正向查找元素,返回的是索引位置,找不到为-1
            index = array.LastIndexOf(true);//反向查找元素,返回的是索引位置,找不到为-1
            //遍历
            int count = array.Count;//元素长度
            int capacity = array.Capacity;//容量 避免产生大量垃圾
            for(int i = 0 ; i< array.Count ; i++)//for循环遍历
            {
                Console.WriteLine(array[i]);
            }
            foreach(var item in array)//迭代器遍历
            {
                Console.WriteLine(item);
            }
            //装箱拆箱
            int num = 0;
            array[0] = 1;//装箱 栈内存到堆内存
            num = (int)array[0];//拆箱 堆内存到栈内存
		}
	}
}

(2)栈Stack

Stack是C#封装好的类,它的本质也是object [ ] 数组 , 只是封装了特殊的存储规则,stack 是栈存储容器 , 栈是一种先进后出的数据结构

先存入的数据后获取 , 后存入的数据先获取

在这里插入图片描述

using System.Collections;//需要引用命名空间
using System;
namespace Test
{
	class Program
	{
		public static void Main(string[] args)
		{
        	Stack stack = new Stack();
            //增
            stack.Push(1);
            stack.Push("123");
            stack.Push(true);
            stack.Push(new object());
            //取 栈中没有删的概念
            Console.WriteLine(stack.Pop());//System.Object
            Console.WriteLine(stack.Pop());//True
            //查 只能查看栈顶的元素
            Console.WriteLine(stack.Peek());//123
            Console.WriteLine(stack.Peek());//123
            bool have = stack.Contains(1);//true
            //改 无法改变其中的元素,只可以压和弹
            stack.Clear();//清空
            stack.Push(1);
            stack.Push(1.2f);
            stack.Push("哈哈哈");
            //遍历
            Console.WriteLine(stack.Count);//3 
            foreach(var item in stack)//foreach遍历 是查看不是弹出 从栈顶到栈底
            {
                Console.WriteLine(item);
            }
            object[] o = stack.ToArray();//转换为object数组后遍历 从栈顶到栈底
            for (int i = 0; i < o.Length; i++)
            {
            	Console.WriteLine(o[i]);
            }
            while( stack.Count > 0 )//循环弹栈
            {
                object p = stack.Pop();
            }
            //装箱拆箱
            int num = 0;
            stack.Push(num);//装箱 栈内存到堆内存
            stack.Pop();//拆箱 堆内存到栈内存
        }
	}
}

(3)队列Queue

Stack是C#封装好的类,它的本质也是object[]数组 , 只是封装了特殊的存储规则,Queue 是队列存储容器,队列是一种先进先出的数据结构

先存入的数据先获取 , 后存入的数据后获取

在这里插入图片描述

using System.Collections;//需要引用命名空间
using System;
namespace Test
{
	class Program
	{
		public static void Main(string[] args)
		{
            Queue queue = new Queue();
            //增
            queue.Enqueue(1);
            queue.Enqueue("123");
            queue.Enqueue(true);
            queue.Enqueue(new object());
            //取
            Console.WriteLine(queue.Dequeue());//1
            Console.WriteLine(queue.Dequeue());//123
            //查
            Console.WriteLine(queue.Peek());//true
            Console.WriteLine(queue.Peek());//true
            bool have = queue.Contains(true);//true
            //改 只能清空后改变
            queue.Clear();
            queue.Enqueue(1);
            queue.Enqueue(2);
            queue.Enqueue(3);
            //遍历
            Console.WriteLine(queue.Count);//3
            foreach(object item in queue)//foreach遍历 是查看不是取出 从队首到队尾
            {
                Console.WriteLine(item);
            }
            object[] o = queue.ToArray();//转换为object数组后遍历 从队首到队尾
            for (int i = 0; i < o.Length; i++)
            {
            	Console.WriteLine(o[i]);
            }
            while( queue.Count > 0 )//循环出列
            {
                object p = queue.Dequeue();
            }
            //装箱拆箱
            int num = 0;
            queue.Enqueue(num);//装箱 栈内存到堆内存
            num = (int)queue.Dequeue();//拆箱 堆内存到栈内存
        }
	}
}

(4)哈希表Hashtable

Hashtable ( 又称散列表 ) 是基于键的哈希代码组织起来的 键 / 值 对,它的主要作用是高数据查询的效率

使用键来访问集合中的元素

using System.Collections;//需要引用命名空间
using System;
namespace Test
{
	class Program
	{
		public static void Main(string[] args)
		{
        	Hashtable hashtable = new Hashtable();
            //增 键是唯一的
            hashtable.Add(1,1);//键 1 ,值 1
            hashtable.Add(true,"123");//键true ,值 123 
            hashtable.Add(false,false);//键false ,值 false
            //删 只能通过键去删除
            hashtable.Remove(1);//通过删除键 来删除值 如果没有键则无反应
            hashtable.Clear();//清空
            
            hashtable.Add(1,1);
            hashtable.Add(2,2);
            hashtable.Add("year",3);
            hashtable.Add(true,3);
            //查
            Console.WriteLine(hashtable[true]);//3 通过键查值找不到返回空
            bool have = hashtable.Contains("year");//true 键查找
            bool havekey = hashtable.ContainsKey("year");//true 键查找
            bool havevalue = hashtable.ContainsValue("123");//true 值查找
            //改 只能改键对应的值 无法修改键
            hashtable[true] = 100.9f; 
            //遍历
            Console.WriteLine(hashtable.Count);//对数
            //遍历所有键
            foreach(object item in hashtable.Keys)//注意要加Keys
            {
                Console.WriteLine("键:"item);
                Console.WriteLine("值:"hashtable[item]);
            }
            //遍历所有值
            foreach(object item in hashtable.Values)//注意要加Values
            {
                Console.WriteLine("值:"item);
            }
            //键值对一起遍历
            foreach(DictionaryEntry item in hashtable)//注意DictionaryEntry
            {
                Console.WriteLine("键:"item.Key"+值:"item.Value);
            }
            //迭代器遍历
            IDictionaryEnumerator myEnumerator = hashtable.GetEnumerator();
            bool flag = myEnumerator.MoveNext();
            while(flag) // 判断之后有没有
            {
                Console.WriteLine("键:{0} 值:{1}",myEnumerator.Key,myEnumerator.Value);
                flag = myEnumerator.MoveNext();
            }
            //装箱拆箱
            int i = 0;
            hashtable.Add(index,i);装箱 栈内存到堆内存
            i = hashtable[index];//拆箱 堆内存到栈内存
        }
	}
}

2.泛型

泛型实现了类型参数化 , 达到代码重用目的,通过类型参数化来实现同一份代码上操作多种类型,泛型相当于类型占位符,定义类或方法时使用替代符代表变量类型,当真正使用类或者方法时再具体指定类型

泛型分类

泛型类和泛型接口

基本语法:

class 类名 < 泛型占位字母 >

interface 接口名 〈 泛型占位字母 >

泛型函数

基本语法 : 函数名 < 泛型占位字母 > ( 参数列表 )

注意 : 泛型占位字母可以有多个 , 用逗号分开

using System;
namespace Test
{
    class TestClass<T>//泛型类(单参)
	{
    	public T value;
	}
    class TestClass2<A,B>//泛型类(多参)
	{
    	public A aValue;
        public B bValue;
	}
    class Test2
    {
        public void TestFun<T>(T value)//泛型方法(单参)
        {
            Console.WriteLine(value);
        }
        public void TestFun<T,U,V>(T t,U u,V v)//泛型方法(多参)
        {
        }
        public void TestFun1<T>()//泛型方法(逻辑处理)
        {
        	T t = default(T);
        }
        public T TestFun1<T>()//泛型方法(返回值)
        {
        	return default(T);
        }
    }
    class Test2<T>//泛型类中的泛型方法 与Test2算作两个类,泛型也看做名字的一部分
    {
    	public void Test<U>(U u)//泛型类中的泛型方法
    	{
    		
    	}
    }
    interface TestInterface<T>//泛型接口
    {
        T value
        {
            get;
            set;
        }
    }
    class Test:TestInterface<int>//继承泛型接口
    {
        public int num;
        public int value
        {
            get
            {
                return 0;
            }
            set
            {
            	num = value;
            }
        }
    }
    class Program
	{
    	public static void Main(string[] args)
		{
            //泛型类(单参)
            TestClass<int> t = new TestClass<int>();
            t.value = 10;//int类型
            TestClass<float> f = new TestClass<float>();
            f.value = 10.0f;//float类型
            //泛型类(多参)
            TestClass2<int,string> intstring = new TestClass2<int,string>();
            intstring.aValue = 10;
            intstring.bValue = "123";
            //泛型方法
            Test2 tt = new Test2();
            tt.TestFun<string>("nihao");
            //不同类型对象的相同逻辑处理就可以选择泛型
        }
    }
}

泛型约束

让泛型的类型有一定限制,关键字where,泛型约束一共有六种

using System;
namespace Test
{
    //值类型 where 泛型字母:struct
	class Test1<T> where T:struct
	{
		public T value;
		public void TestFun<K>(K k) where K:struct
    	{
        
    	}
	}
    //引用类型 where 泛型字母:class 
    class Test2<T> where T:class
	{
		public T value;
		public void TestFun<K>(K k) where K:class
    	{
        
    	}
	}
    //存在无参公共构造函数 where 泛型字母:new()
    class Test3<T> where T:new() //必须是具有公共构造函数的非抽象函数类型
	{
		public T value;
	}
    //类约束 where 泛型字母:类名
    class Test4<T> where T:Test1//某个类本身或者其派生类
	{
		public T value;
	}
    //接口约束 where 泛型字母:接口名
    class Test5<T> where T:IFly
	{
		public T value;
	}
    //另一个泛型约束  where 泛型字母:另一个泛型字母
    class Test6<T,U> where T:U//另一个泛型类型本身或者派生类型 T要么和U相同要么是U的派生
	{
		public T value;
        public void TestFun<K,V>(K k) where K:V
    	{
        
    	}
	}
    //------------测试类------------
    class Test1//用于Test3 Test4测试 
    {
        public Test1()
        {
        }
    }
    class Test2:Test1//用于Test4测试 
    {
    }
    class Test3//用于Test4测试 
    {
    }
    interface IFly//用于Test5测试 
    {
    }
    class Test4:IFly//用于Test5测试 
    {
    }
    //------------测试类------------
	class Program
		{
    		public static void Main(string[] args)
			{
                //值类型
                Test1<int> t1 = new Test1<int>();
                t1.TestFun<float>(1.3f);
                //引用类型
                Test2<Random> t2 = new Test2<Random>();
                t2.value = new Random(); 
                //存在无参公共构造函数
                Test3<Test1> t3 = new Test3<Test1>();
                //某个类本身或者其派生类
                Test4<Test1> t4 = new Test4<Test1>();
                Test4<Test2> t4 = new Test4<Test2>();
                //Test4<Test3> t4 = new Test4<Test3>();错误,必须是Test1类本身或者其派生类
                //某个接口的派生类型
                Test5<IFly> t5 = new Test5<IFly>();//接口本身或者派生接口
                t5.value = Test4;//派生类
                //另一个泛型类型本身或者派生类型
                Test6<Test4,IFly> t6 = new Test6<Test4,IFly>();
        	}
		}
}

约束的组合使用

class Test7<T> where T:class,new() //T必须是引用类型且具有无参的构造函数
{
}

多个泛型有约束

class Test7<T,K> where T:class,new() where K:struct //关键字where
{
}

3.常用泛型数据结构类

(1)列表List

  • List是C#封装好的类,本质是一个可变类型的泛型数组

    using System.Collections.Generic;//需要引用命名空间
    using System;
    namespace Test
    {
    	class Program
    	{
    		public static void Main(string[] args)
    		{
                //声明
    			List<int> list1 = new List<int>();
                List<int> list2 = new List<int>();
                //增
                list1.Add(1);
                list1.Add(2);
                list2.Add(3);
                list1.AddRange(list2);
                list1.Insert(0,999);
                //删
                list1.Remove(1);//删除元素1
                list1.RemoveAt(0);//删除第一个元素
                list1.Clear();//清空
                //
                list1.Add(1);
                list1.Add(2);
                //查
                //Console.WriteLine(list1[0]);//得到指定位置的元素
                bool have = list1.Contains(1);//查看元素是否存在
                int index = list1.IndexOf(2);//正向返回查找值的下标
                int lastIndex = list1.LastIndexOf(2);//反向返回查找值的下标
                //改
                list1[0] = 99;
                //遍历
                int length = list1.Count;//长度
                int capacity = list1.Capacity;//容量
                for (int i = 0 ; i < list1.Count; i++)
                {
                    Console.WriteLine(list1[i]);
                }
                foreach (var item in list1)
                {
                    Console.WriteLine(item);
                }
            }
        }
    }
    

(2)字典Dictionary

  • 可以将Dictionary理解为拥有泛型的Hashtable,只不过键值对类型从object变成了可以自己制定的泛型
using System.Collections.Generic;//需要引用命名空间
using System;
namespace Test
{
	class Program
	{
		public static void Main(string[] args)
		{
            //声明
            Dictionary<int,string> dictionary = new Dictionary<int,string>();//键int 值string
            //增
            dictionary.Add(1,"123");
            dictionary.Add(2,"456");
            dictionary.Add(3,"789");
            //删
            dictionary.Remove(1);
            dictionary.Remove(4);//删除没有的键没有反应
            dictionary.Clear();//清空
            //
            dictionary.Add(1,"123");
            dictionary.Add(2,"456");
            dictionary.Add(3,"789");
            //查
            Console.WriteLine(dictionary[1]);//123 通过键查看值
            //Console.WriteLine(dictionary[4]);//返回不存在的键会报错
            bool haveKey = dictionary.ContainsKey(1);//true 是否存在键为1的
            bool haveValue = dictionary.ContainsValue("123");//true 是否存在值为123的
            //改
            dictionary[1] = "555";
            //遍历
            int index = dictionary.Count;//长度
            foreach(var item in dictionary.Keys)//foreach遍历键值
            {
                Console.WriteLine(item);
                Console.WriteLine(dictionary[item]);
            }
            foreach(var item in dictionary.Values)//遍历值
            {
                Console.WriteLine(item);
            }
            foreach (KeyValuePair<int,string> item in dictionary)//KeyValuePair遍历键值
            {
            	Console.WriteLine("键{0},值{1}",item.Key,item.Value);
            }
        }
    }
}

(3)顺序存储和链式存储

数据结构, 就是人定义的 存储数据表示数据之间关系 的规则,常见的数据结构有数组 、 栈 、 队列 、 链表 、 树 、 图 、 堆 、 散列表等

学数据结构做的脑图

顺序存储 :

用一组地址连续的存储单元依次存储线性表的各个数据元素

数组 、 stack 、 Queue 、 List 、 ArrayList是顺序存储

只是数组 、 Stack 、 Queue 的组织规则不同而已

链式存储 〈 链接存储 ) :

用一组任意的存储单元存储线性表中的各个数据元素

单向链表 、 双向链表 、 循环链表是链式存储

链式存储实现:

using System;
namespace Test
{
	class LinkNode<T>//节点
	{
		public T value;
   	 	public LinkNode<T> nextNode;
        public LinkNode(T value)
        {
            this.value = value;
            this.nextNode = null;
        }
	}
	class LinderList<T>//单链表
	{
		public LinkNode<T> head;//头结点
		public LinkNode<T> tail;//尾节点
		public void AddTail(T value)//尾插法
		{
			LinkNode<T> newNode = new LinkNode<T>(value);
			if(head == null)//如果当前链表为空
			{
				head = newNode;
				tail = newNode;
			}
			else
			{
				tail.nextNode = newNode;//让尾的下一个指向新节点
				tail = newNode;//新节点变成新的尾巴
			}
		}
		public void RemoveNode(T value)
		{
			if(head == null)
			{
				return;
			}
			if(head.value.Equals(value))
			{
				head = head.nextNode;//头结点变为下一个节点
				if(head == null)//如果删除后头结点为空
				{
					tail = null;
				}
				return;
			}
			LinkNode<T> node = head;
			while(node != null)
			{
				if(node.nextNode.value.Equals(value))//如果下一个节点的值与要删除的值相同
				{
					node.nextNode = node.nextNode.nextNode;//那么指向下下个节点
					break;
				}
				node = node.nextNode;
			}
		}
	}
	class Program
	{
		public static void Main(string[] args)
		{
		LinderList<int> linderList1 = new LinderList<int>();
		linderList1.AddTail(1);
		linderList1.AddTail(2);
		linderList1.AddTail(3);
		linderList1.AddTail(4);
		linderList1.AddTail(5);
		linderList1.RemoveNode(1);//删除头结点
		linderList1.RemoveNode(3);//删除中间节点
		linderList1.RemoveNode(5);//删除尾节点
		LinkNode<int> node = linderList1.head;
		while(node!= null)
		{
			Console.WriteLine(node.value);
			node = node.nextNode;
		}
		}
	}
}

(4)泛型双向链表Linkedlist

Linkedlist是CSHARP封装好的类,他的本质是一个可变类型的泛型双向链表。

using System.Collections.Generic;//需要引用命名空间
using System;
namespace Test
{
	class Program
	{
		public static void Main(string[] args)
		{
            //声明
            LinkedList<int> linkedList = new LinkedList<int>();
            //链表对象需要掌握两个类,一个是链表本身LinkedList,一个是链表节点类LinkedListNode
            //增
            linkedList.AddFirst(10);//在链表头部添加元素
            linkedList.AddLast(20);//在链表尾部添加元素
            linkedList.AddLast(3);//在链表尾部添加元素
            linkedList.AddAfter(linkedList.Find(3),20);//在从头开始查找第一个节点值3后添加元素20
            linkedList.AddBefore(linkedList.Find(10),1);//在从头开始查找第一个节点值10后添加元素1
            linkedList.AddLast(3);//在链表尾部添加元素
            Console.WriteLine("-------初始值------");
            LinkedListNode<int> node = linkedList.First;
            while (node != null) 
            {
            	Console.WriteLine(node.Value);
            	node = node.Next;
            }
            Console.WriteLine("-------------------");
            //删
            Console.WriteLine("---移除头尾和一个20--");
            linkedList.RemoveFirst();//移除头结点
            linkedList.RemoveLast();//移除尾结点
            linkedList.Remove(20);//移除从头开始第一个等于该值节点
            node = linkedList.First;
            while (node != null) 
            {
            	Console.WriteLine(node.Value);
            	node = node.Next;
            }
            Console.WriteLine("-------------------");
            linkedList.Clear();//清空链表
            //
            linkedList.AddLast(1);//在链表尾部添加元素
            linkedList.AddLast(2);//在链表尾部添加元素
            linkedList.AddLast(3);//在链表尾部添加元素
			linkedList.AddLast(4);//在链表尾部添加元素
			linkedList.AddLast(5);//在链表尾部添加元素
			Console.WriteLine("-------新值------");
            node = linkedList.First;
            while (node != null) 
            {
            	Console.WriteLine(node.Value);
            	node = node.Next;
            }
            Console.WriteLine("-------------------");
            //查
            LinkedListNode<int> first = linkedList.First;
            LinkedListNode<int> last = linkedList.Last;
            Console.WriteLine("first:{0} , last:{1}",first.Value,last.Value);
            Console.WriteLine("链表中存在2:{0}",linkedList.Contains(2));
            node = linkedList.Find(2);//存在后可以返回该节点
			Console.WriteLine("链表中存在6:{0}",linkedList.Contains(6));
			//node = linkedList.Find(6);//若不存在则会报错
            //改
            linkedList.Find(2).Value = 4;//先得到节点,再修改值
            //遍历
            Console.WriteLine("-----foreach遍历---");
            foreach (var item in linkedList) //通过迭代器处理可以直接得到里面的值
            {
            	Console.WriteLine(item);
            }
            Console.WriteLine("-------------------");
            Console.WriteLine("---从头节点遍历-----");
            LinkedListNode<int> head = linkedList.First;
            while (head != null) 
            {
            	Console.WriteLine(head.Value);
            	head = head.Next;
            }
            Console.WriteLine("-------------------");
            Console.WriteLine("---从尾节点遍历-----");
            LinkedListNode<int> tail = linkedList.Last;
            while (tail != null) 
            {
            	Console.WriteLine(tail.Value);
            	tail = tail.Previous;
            }
            Console.WriteLine("-------------------");
        }
    }
}

(5)泛型栈和队列

using System.Collections.Generic;//需要引用命名空间
using System;
namespace Test
{
	class Program
	{
		public static void Main(string[] args)
		{
            //声明 命名空间using System.Collections.Generic;
            //使用上和Stack与Queue相同
            Stack<int> stack = new Stack<int>;
            Queue<int> queue = new Queue<int>;
		}
	}
}

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

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

相关文章

高完整性系统:Fault Tolerant Design

目录 1. INTRODUCTION TO FAULT TOLERANCE 1.2 Definitions 1.3 Two Kinds of Faults 1.4 Hardware vs Software Faults 1.4.1 Failure Curve for Hardware 1.4.2 Hardware and Software Failures 1.5 Causes of Failures 1.6 3 Ways to Class Failures 1.6.1 Tempora…

Java 岗史上最全八股文面试真题汇总,堪称 2023 年面试天花板

前言 现如今&#xff0c;Java 面试的本质就是八股文&#xff0c;把八股文面试题背好&#xff0c;面试才有可能表现好。金九银十招聘黄金季已经来临&#xff01;大家在考研和找工作中纠结的时候&#xff0c;不妨先看一下面试题&#xff0c;毕竟我们的最终目标就是为了找一份心仪…

机器视觉怎么对陶瓷板外观尺寸进行自动检测?

随着陶瓷行业的发展&#xff0c;陶瓷板的生产和质量控制面临越来越高的要求。而机器视觉技术作为一种高精度、高效率、无损、可靠性高的自动化检测手段&#xff0c;已经成为陶瓷板外观尺寸自动化检测的首选方案。本文就如何利用机器视觉对陶瓷板外观尺寸进行自动检测进行分析和…

配电室的管理制度及综合监控系统的介绍

安科瑞虞佳豪 1、配电室全部机电设备&#xff0c;由配电室人员负责管理和值班&#xff0c;停送电由值班电工操作&#xff0c;非值班电工禁止操作&#xff0c;无关人员禁止进入配电室&#xff1b;公司内有关上级部门因检查工作&#xff0c;必须要进入这些场所时&#xff0c;应由…

【温故而知新】阶段总结!我在技术成长过程中的收获!

时间&#xff1a;2023年05月31日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 【20230531】【温故而知新】阶段总结&#xff01;我在技术成长过程中的收获&#xff01;_小蒋聊技术_免费在线阅读收听下载 - 喜马拉雅手机版欢迎…

第十八章行为性模式—观察者模式

文章目录 观察者模式解决的问题结构实例存在的问题使用场景 JDK 提供的实现 - Observable示例 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。行…

WMI系列--WMI订阅事件

前边对于WMI的基础内容进行简单的总结和整理&#xff0c;结下来的这篇内容主要针对WMI的永久订阅事件展开详细的阐述。 WMI事件订阅机制 WMI事件分为两类&#xff0c;分别是本地事件订阅和永久性事件订阅。 所谓本地事件是指运行在本地上下文环境当中的单个进程的事件&#x…

入门编程的方法和步骤

编程是信息时代必备的一项技能&#xff0c;无论是从事计算机行业的人员&#xff0c;还是从事其他行业的人员&#xff0c;学会编程对个人职业发展都有着重要的意义。但是&#xff0c;对于初学者来说&#xff0c;如何入门编程往往是一个比较棘手的问题。本文将介绍一些入门编程的…

训练YOLOv5对象检测模型的逐步指导

介绍 欢迎来到我们的 YOLOv5 教程系列的第 2 部分!如果您还没有查看本系列的第 1 部分,我建议您先阅读该部分;它涵盖了如何在 Windows 和 Google Colab 上安装用于真实对象检测的 YOLOv5 ,我们假设您已在本报告中完成了这些操作。 也就是说,一旦您设置了环境,您就可以开…

DuDuTalk语音工牌:语音数据分析在销售场景的应用价值

在现今这个数字时代&#xff0c;企业需要更高效、更有效地沟通和合作。语音数据的收集和分析能够增加销售团队和客户之间的联系&#xff0c;同时提高销售闭合率。因此&#xff0c;了解和利用销售沟通语音数据的价值&#xff0c;是现代企业所必须的。 销售沟通语音数据指的是在…

精益生产管理的优势特点以及工具步骤

一、何为精益生产 精益生产&#xff08;LeanProduction&#xff0c;简称LP&#xff09;是美国麻省理工学院数位国际汽车计划组织&#xff08;IMVP&#xff09;的专家对日本“丰田JIT&#xff08;JustInTime&#xff09;生产方式”的赞誉之称&#xff0c;精&#xff0c;即少而精…

不同股指期货交易平台的优缺点比较,让你一目了然!

股指期货交易平台是股指期货交易的重要场所&#xff0c;是期货市场的核心平台之一。在股指期货交易平台上&#xff0c;投资者可以进行股指期货的买卖&#xff0c;获得相应的投资收益。然而&#xff0c;对于大部分投资者来说&#xff0c;如何选择一个好的股指期货交易平台却是一…

locust压测脚本文档组织结构

以下为locust压测脚本文档组织结构模板&#xff0c;和TestDeploy对接丝滑&#xff0c;轻松实现分布式压测。 1、common common主要是存放改写了的请求方法&#xff0c;包括GET、POST等等&#xff0c;作为统一入口&#xff0c;以便各个API统一调用。 2、config config主要存…

读取PPT模板替换数据生成PDF报表

一、项目背景 因本人的公司是做短信通信服务的&#xff0c;所以客户需要将短信的发送量&#xff0c;按照他们给定的PPT样例模板&#xff0c;来生成PDF报表数据&#xff0c;即PPT的样式&#xff0c;数据如何展示都是规定好了的&#xff0c;而我需要做的就是将真实的数据&#xf…

B站参战618,直播带货成变现香饽饽,直播数据分析必看

五月已经见底&#xff0c;年中电商大考“618购物节”自26号拉开序幕。 各大主播、平台、品牌都紧锣密鼓地布起活动网。去年&#xff0c;B站因首次参战双十一冲上热门&#xff0c;平台为此上线直播购物分区。 来源-B站 经过去年各大品牌、UP主对双十一购物节直播带货的试水、观…

LCR测试仪夹具选型指南新鲜出炉

好马配好鞍&#xff0c;好仪器配好夹具。有不少朋友好奇&#xff0c;仪器选好了&#xff0c;那测试夹具如何挑选&#xff1f; 接下来安泰测试为大家简单介绍一下关于LCR测试仪中常用的测试夹具。 1/ 四端/四端对测试线 01 TH26011AS 频率范围&#xff1a;5Hz-100kHz 最大…

火山引擎DataLeap:如何构建一套完整、易用的数据标准体系

数据标准是数据治理体系中的核心要素之一。 一方面&#xff0c;统一的数据标准可以在复杂的业务场景下&#xff0c;帮助团队对齐数据口径&#xff0c;提升数据在分析、诊断等场景的质量与效率&#xff1b;另一方面&#xff0c;数仓团队与分析师团队也需要沉淀一套敏捷、可控的…

TimSort——最快的排序算法

TimSort——最快的排序算法 排序算法是每个程序员绕不开的课题&#xff0c;无论是大学课程还是日常工作&#xff0c;都离不开排序算法。常见的排序算法有&#xff1a;冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、基数排序等。下面是这些算法性能的概…

2022年天府杯全国大学生数学建模竞赛D题高等院校综合发展状况与学科质量评估解题全过程文档及程序

2022年天府杯全国大学生数学建模竞赛 D题 高等院校综合发展状况与学科质量评估 原题再现&#xff1a; 问题背景&#xff1a;   高等院校是我国经济社会发展中的重要参与者&#xff0c;一流大学与一流学科的建成是实现社会主义共同富裕的重要基础。随着国家第二轮“双一流”…

PMP课堂模拟题目及解析(第16期)

151. 一个全球多学科项目的项目经理如何才能确保在所有学科中使用变更控制过程&#xff1f; A. 执行影响分析以考虑所有项目学科 B. 确保变更控制委员会有来自所有学科的代表 C. 邀请所有学科参加变更控制系统委员会会议&#xff0c;但仅从所参加的学科收集意见 D. 代表其…