蓝桥杯备赛:C++基础,顺序表和vector(STL)

news2025/1/7 14:53:15

目录

一.C++基础

1.第一个C++程序:

2.头文件:

3.cin和cout初识:

4.命名空间:

二.顺序表和vector(STL)

1.顺序表的基本操作:

2.封装静态顺序表:

3.动态顺序表--vector:

(1)创建vector:

(2)size和empty:

(3)begin和end:

(4)front和back:

(5)resize和clear:


一.C++基础

1.第一个C++程序:

可能有些同学跟我一样,一直以来学习的都是基础的C语言,而在接触蓝桥杯这类相比较正规的竞赛时会发现它所使用的程序规范与基础的C语言大相径庭,但没关系的,虽然他使用的规范隶属于C++范畴,但只要掌握以下几条差异,C++于我们也不会再陌生,光说不算,先直接来看一下我们的第一个C++程序:

​
#include <iostream> //头⽂件 
using namespace std; //使⽤std的名字空间 
int main() //main函数 
{
 cout << "hello world!" << endl; //输出:在屏幕打印"hello world!" 
 return 0;
}

2.头文件:

ok,接下来我就来详细说说这其中的一些区别,当然最先注意到的就是包含的头文件的差异了:

        前⾯的代码中,写的 #include ,就是在包含头⽂件,头⽂件的名字叫: iostream

使用 #include <> 的形式进行包含

        iostream 文件中的 io 指的是输⼊(进入程序的信息,简单理解就是可以给程序输⼊数据)和输出(从程序中输出的信息,简单理解就是程序 会打印数据在屏幕上)。

        在 C++ 程序中要完成输⼊和输出的操作会涉及到 iostream 文件中的多个定义,所以就要包含这个 头⽂件的

        比如:代码中的 cout 是输出流对象,就是⽤来完成数据输出的,就需要包含头文件。

简单些理解:iostream这个头文件就当于是一个我们之前学习C语言里无数头文件的一个集合,为的就是使我们对头文件的包含的使用更加方便和简洁

注:

        1. 在C语⾔中头文件的扩展名是 .h ,但是C++中的⽤法发生了⼀些变化,对⽼式C的头⽂件保留了扩展名 .h ,但是C++自己的⽂件没有扩展名了,如原来的C语⾔头⽂件: 

        2. 有些C的头⽂件被转换成C++头⽂件,这些⽂件名被重命名,去掉了.h扩展名,并在⽂件名的前⾯加 上了前缀c(表示来⾃C语⾔);例如:C语⾔中有关数学的头⽂件名字是 math.h ,在C++中就 是 cmath ,当然还得注意,有时头⽂件的C语⾔版本和C++版本相同,⽽有时候,新版本做了⼀些 修改:

3.cin和cout初识:

cout << "hello world!" << endl;这句代码在上⾯的程序中是最重要的代码,其他所有的 代码都是为了编写这句代码。

cout标准输出流对象(针对控制台,也就是屏幕),其实还有标准输⼊流对象cin(针对的是键 盘)

即cout 告诉程序把后⾯双引号中的内容打印到标准输出设备(屏幕)上,双引号中的内容可以替换

#include<iostream>
using namespace std;
int main()
{
	int num;
	cin >> num; //获取标准输⼊ 
	cout << num << endl; //对获取到的结果标准输出 

	return 0;
}

总结:

1.cin 和 cout 是全局的流对象, cin 负责输⼊数据(scanf)cout 负责输出数据(printf)

2. endl 是C++中⼀个特殊的操作符,效果是换行和刷新缓冲区,使⽤时必须包含在 iostream 头文件里

3. <<是流插⼊运算符,和 cout 配合使用, >> 是流提取运算符,和 cin 配合使⽤,两者容易混 淆,⼤家⼀定要仔细区分,不可混用

使⽤C++输⼊输出更⽅便,不需要像 printf / scanf 输⼊输出时那样,需要⼿动控制格式。 C++的输⼊输出可以⾃动识别变量类型。(后面会提到到,慢慢体会就好):

#include <iostream>
using namespace std;
int main() 
{
 float score = 0;
 cin >> score;//直接读取的就是浮点数 
 cout << score;//直接输出的就是浮点数 
 
 return 0;
}

4.命名空间:

using namespace std; 这句代码的意思是:使⽤名字空间 std (名字空间也叫命名空间), 为了理解什么是名字空间,名字空间要解决什么问题,先看⼀下下面的例子:

在C++中,变量、函数和类都是⼤量存在的,这些变量、函数和类的名称如果都存在于全局作⽤域中, 可能会导致很多冲突。使⽤ 名字空间 的⽬的是对标识符的名称进⾏隔离,以避免命名冲突或名字污染, namespace 关键字的出现就是针对这种问题的。 std 是C++标准库的名字空间名,C++将标准库的定义实现都放到这个命名空间中,当我们需要使用标准库中的内容时,就需要加上: using namespace std ;当有了这句代码的时候,表示命名空间 std 中信息都是可见和可⽤的,比如: cin 、 cout 、 endl 等:

当然使用using namespace std;是⼀种简单粗暴的做法,直接这样使⽤,就意味着后续在std这个名字空间中的各种定义都可以直接使⽤,但是我们往往只是使⽤部分。所以名字空间其实也可以这样使⽤

#incldue <iostream>
int main()
{   
    std::cout << "hello world" << std::endl;
    return 0;
}

代码中的 std::cout的意思就是使⽤std名字空间中的cout

欧克,到这里为止再看一下最初的C++程序,是不是就好理解多了:

#include <iostream> //头⽂件 
using namespace std; //使⽤std的名字空间 
int main() //main函数 
{
 cout << "hello world!" << endl; //输出:在屏幕打印"hello world!" 
 return 0;
}

二.顺序表和vector(STL)

说完了上面C++的基础格式,接下来就是正式的蓝桥杯知识点的干货分享了

1.顺序表的基本操作:

其实顺序表的基本操作无非就是我们老生常谈的那几种尾插尾删,头插头删,指定位置插入和删除和对某一个元素的查找,这些在C语言基础里我都有提及,详细可以看我附在下面的这篇文章:

https://blog.csdn.net/2403_87691282/article/details/144203616?spm=1001.2014.3001.5501

方便起见,我还是把简化的一些操作附在下面,以便阅览:

// 打印顺序表 
void print()
{
 for(int i = 1; i <= n; i++)
 {
 cout << a[i] << " ";
 }
 cout << endl << endl;
}

// 尾插 
void push_back(int a[], int& n, int x)
{
 a[++n] = x;
}


// 头插 
void push_front(int x)
{
 // 1. 先把 [1, n] 的元素统⼀向后移动⼀位 
 for(int i = n; i >= 1; i--)
 {
     a[i + 1] = a[i];
 }
 // 2. 把 x 放在表头 
     a[1] = x;
     n++; // 元素个数 +1 
}

// 在任意位置插⼊ 
void insert(int p, int x)
{
 //把 [p, n] 的元素统⼀向后移动⼀位 
 
   for(int i = n; i >= p; i--)
  {
      a[i + 1] = a[i];
  }
   a[p] = x;
   n++;
}

// 尾删 
void pop_back()
{
 n--;
}

// 头删 
void pop_front()
{
 // 1. 先把 [2, n] 区间内的所有元素,统⼀左移⼀位 
 for(int i = 2; i <= n; i++)
 {
     a[i - 1] = a[i];
 }
 n--;
}

// 任意位置删除 
void erase(int p)
{
 // 把 [p + 1, n] 的元素,统⼀左移⼀位 
 for(int i = p + 1; i <= n; i++)
 {
    a[i - 1] = a[i];
 }
 n--;
}

// 按值查找 
int find(int x)
{
 for(int i = 1; i <= n; i++)
 {
 if(a[i] == x) return i;
 }
 return 0;
}

// 按位查找 
int at(int p)
{
 return a[p];
}

// 按位修改 
int change(int p, int x)
{
 a[p] = x;
}

// 清空操作 
void clear()
{
 n = 0;
}

2.封装静态顺序表:

所谓封装静态顺序表就是当我们在面对需要创建好几个顺序表并且对它们进行操作及以下情况时而产生的简化操作的行为:

可见,当涉及到多个顺序表时,虽然上述的代码可以套用,但还是略显麻烦,这个时候就不由得发问了:博主博主,这些函数固然好用,但有没有什么其他更简便的套用方式,有的兄弟,有的,这么方便的用法当然是有的:

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
// 将顺序表的创建以及增删查改封装在⼀个类中 
class SqList
{
	int a[N];
	int n;
public:
	// 构造函数,初始化 
	 SqList()
	{
		n = 0;
	}
	// 尾插 
	void push_back(int x)
	{
		a[++n] = x;
	}
	// 尾删 
	void pop_back()
	{
		n--;
	}
	// 打印 
	void print()
	{
		for (int i = 1; i <= n; i++)
		{
			cout << a[i] << " ";
		}
		cout << endl;
	}
};
int main()
{
	SqList s1, s2; // 创建了两个顺序表 
	for (int i = 1; i <= 5; i++)
	{
		// 直接调⽤ s1 和 s2 ⾥⾯的 push_back 
		s1.push_back(i);
		s2.push_back(i * 2);
	}
	s1.print();
	s2.print();
	for (int i = 1; i <= 2; i++)
	{
		s1.pop_back();
		s2.pop_back();
	}
	s1.print();
	s2.print();
	return 0;
}

在上述代码里,博主使用了class(类的运用)对几个函数进行封装,这样在以后对顺序表的操作时,就可以直接使用”.“进行各种简洁的运用了

当然这里还需再提一下class和public的使用了(蓝桥杯作为一个应试考试,好些代码的具体原理就不再在这里进行深究了,未来我会具体介绍,但也仅供了解):

在C++中,‌class是定义类的关键字,而public是访问修饰符之一‌

以下是详细解释:

‌class(类)‌

类是C++中的基本构造块,用于定义对象的属性和行为‌
类使用class关键字声明,后面跟着类名和类体,类体中包含成员变量和成员函数‌2。
‌public(公有)‌

public是类的访问修饰符之一,表示该成员(变量或函数)是公有的,可以被类的外部访问‌
公有成员在类的内部和外部都可以被访问,相当于C语言中的struct结构体成员‌

ps

在C++中,类和结构体(struct)都是用于定义复合数据类型的构造,它们都可以包含成员变量和成员函数。然而,尽管它们在许多方面相似,但也有一个关键的区别:

即默认访问权限‌

‌类(class)‌:在类中,默认的访问权限是私有的(private),这意味着除非明确指定为public或protected,否则类的成员是不可从类外部访问的。
结构体(struct)‌:在结构体中,默认的访问权限是公有的(public),这意味着结构体的所有成员默认都是可以从外部访问的,除非它们被明确指定为private或protected

当然我这边讲封装肯定不仅仅是为了简洁,更多的还是为我接下来介绍SYL做一个铺垫

当然STL具体是啥我还是先说明一下:

提供高效的数据结构‌:
STL包含了多种高效的数据结构,如vector(动态数组)、list(双向链表)、map(映射/字典)、set(集合)等。这些数据结构都是经过精心设计和优化的,可以在不同的场景下提供高效的数据存储和访问。

‌实现常用的算法‌:
STL提供了一系列常用的算法,如排序、搜索、合并、拷贝等。这些算法都是以模板函数的形式提供的,可以适用于不同的数据类型和容器。通过使用STL的算法,可以避免重复编写常见的算法代码,提高开发效率。

3.动态顺序表--vector:

       在之前C语言的学习过程中,一提到动态顺序表就不由得会回忆起被malloc和free,new和deletae支配的恐惧,而这里需要强调一点的就是竞赛代码不同于我们之前学的工程代码,什么是工程代码,就是以malloc为首的一系列相比来说在竞赛中使用效率不高而且容易超时的一系列函数,因此当我们在竞赛过程中使用动态顺序表的时候就有了一种更好的方式:

       C++ 的STL 提供了⼀个已经封装好的容器vector , 有的地⽅也叫作变⻓数组, vector 的底层就是⼀个会⾃动扩容的顺序表,其中创建以及增删查 改等等的逻辑已经实现好了,并且也完成了封装, 接下来就重点了解以下vector 的使用:

(1)创建vector:
#include <vector> // 头⽂件 
using namespace std;
const int N = 20;
struct node
{
	int a, b, c;
};
// 创建 
void init()
{
	vector<int> a1; // 创建⼀个空的可变⻓数组 
	vector<int> a2(N); // 指定好了⼀个空间,⼤⼩为 N 
	vector<int> a3(N, 10); // 创建⼀个⼤⼩为 N 的 vector,并且⾥⾯的所有元素都是 10 
	vector<int> a4 = { 1, 2, 3, 4, 5 }; // 使⽤列表初始化,创建⼀个 vector 
	// <> ⾥⾯可以放任意的类型,这就是模板的作⽤,也是模板强⼤的地⽅ 
	// 这样,vector ⾥⾯就可以放我们接触过的任意数据类型,甚⾄是 STL 
	vector<string> a5; // 放字符串 
	vector<node> a6; // 放⼀个结构体 
	
	
	vector<vector<int>> a7(N); 
	vector<int> a8[N]; 
}

大家仔细看的话会发现我最后俩没写注释,为啥,因为我觉得这俩在理解上有些不太容易,所以我就单独把它们拎出来做解释:

就正如上图(字可能有些丑,凑合看看吧(捂脸))所示,可以理解为前者的主体时vector<int>类型的变长数组,而后者则是已顺序表为主体来存放变长数组

其实在C++中,vector<vector<int>> a7(N); 和 vector<int> a8[N]; 是两种不同的方式来创建数组或数组的数组(即二维数组),但它们依旧有着本质的区别

‌vector<vector<int>> a7(N);‌

这是一个使用vector容器创建的二维动态数组。vector是C++标准模板库(STL)中的一个序列容器,它可以动态地管理内存,根据需要自动调整大小。这里的a7是一个包含N个vector<int>的vector,即一个二维数组,其中每一行都是一个可以独立调整大小的vector<int>

‌优点‌:
动态调整大小:每一行都可以根据需要独立增加或减少元素。
内存管理自动化:vector会自动管理内存,减少内存泄漏的风险。
‌缺点‌:
可能的性能开销:由于动态调整大小和自动内存管理,可能会引入一些性能开销。
不是连续内存:vector的底层实现通常是一个指向动态分配内存的指针数组,因此二维vector的元素在内存中不是连续存储的。


‌vector<int> a8[N];‌

这是一个静态数组,其中每个元素都是一个vector<int>,不同于第一个例子,这里的数组大小N必须在编译时就已知,且整个数组的大小在创建后是固定的。

‌优点‌:
可能的性能优势:由于是静态数组,其大小在编译时确定,可能在某些情况下提供更好的性能,尤其是在访问连续内存时。
‌缺点‌:
固定大小:数组的大小在创建后不能改变,这限制了其灵活性。
非标准C++:使用静态数组的方式在某些情况下可能不符合现代C++的最佳实践,尤其是在需要动态调整大小或跨函数共享数据时。
总结来说,选择哪种方式取决于具体需求,如果需要一个大小可变的二维数组,或者希望自动管理内存,那么vector<vector<int>>是一个好选择,如果知道数组的大小并且希望利用静态数组可能的性能优势,那么vector<int> a8[N];也可以考虑,不过,在现代C++编程中,推荐使用vector和智能指针等STL组件来管理动态数据结构,以减少内存管理错误和提高代码的可维护性

(2)size和empty:

1. size :返回实际元素的个数

2. empty :返回顺序表是否为空,因此是⼀个bool 类型的返回值

    a. 如果为空:返回true

    b. 否则,返回false

时间复杂度:O(1)

以下是具体使用方式,接下来我介绍的几个都是vector里常用的关键字,了解会用就行

void test_size()
{
 // 创建⼀个⼀维数组 
 vector<int> a1(6, 8);
 for(int i = 0; i < a1.size(); i++)
 {
 cout << a1[i] << " ";
 }
 cout << endl << endl;
 // 创建⼀个⼆维数组 
 vector<vector<int>> a2(3, vector<int>(4, 5));
 for(int i = 0; i < a2.size(); i++)
 {
 // 这⾥的 a2[i] 相当于⼀个 vector<int> a(4, 5) 
 for(int j = 0; j < a2[i].size(); j++)
 {
 cout << a2[i][j] << " ";
 }
 cout << endl;
 }
 cout << endl << endl;
}
(3)begin和end:

1. begin :返回起始位置的迭代器(左闭)

2. end :返回终点位置的下⼀个位置的迭代器(右开)

利⽤迭代器可以访问整个vector ,存在迭代器的容器就可以使⽤范围for 遍历

说到迭代器,还有一点不得不提一下我们的auto了:

在C++11及更高版本中,auto 关键字被引入以支持类型自动推导。这意味着编译器可以根据初始化表达式自动推断变量的类型,而无需指定,auto 的使用可以简化代码,尤其是在处理复杂类型或模板时:

int x = 10;
auto y = x; // y 的类型被推导为 int

当使用STL容器(如 vector, map, set 等)的迭代器时,auto 可以避免冗长的迭代器类型声明:

std::vector<int> vec = {1, 2, 3, 4};
for (auto it = vec.begin(); it != vec.end(); ++it)
 {
    // it 的类型被推导为 std::vector<int>::iterator
    std::cout << *it << std::endl;
 }

还可以与语法糖结合在一起使用:

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

当然这里的a是指一个vector<int>类型的变长数组

上面这两行代码都可以实现对a数组的遍历与打印

(4)front和back:

1. front :返回⾸元素

2. back :返回尾元素

时间复杂度:O(1)

//  ⾸元素和尾元素 
void test_fb()
{
 vector<int> a(5);
 for(int i = 0; i < 5; i++)
 {
 a[i] = i + 1;
 }
 cout << a.front() << " " << a.back() << endl;
}

这个使用并不难,看一下了解即可

(5)resize和clear:

1.resize:修改vector 的大小

• 如果⼤于原始的大小,多出来的位置会补上默认值,⼀般是0 

• 如果⼩于原始的大小,相当于把后⾯的元素全部删掉。 时间复杂度:O(N) 

2.clear:清空vector

底层实现的时候,会遍历整个元素,⼀个⼀个删除,因此时间复杂度:O(N) 

// resize
void test_resize()
{
 vector<int> a(5, 1);
 a.resize(10); // 扩⼤ 
 print(a);
 a.resize(3); // 缩⼩ 
 print(a);
}

// clear
void test_clear()
{
 vector<int> a(5, 1);
 print(a);
 a.clear();
 cout << a.size() << endl;
 print(a);
}

尾言:

欧克,全文终

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

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

相关文章

node.js之---事件循环机制

事件循环机制 Node.js 事件循环机制&#xff08;Event Loop&#xff09;是其核心特性之一&#xff0c;它使得 Node.js 能够高效地处理大量并发的 I/O 操作。Node.js 基于 非阻塞 I/O&#xff0c;使用事件驱动的模型来实现异步编程。事件循环是 Node.js 实现异步编程的基础&…

如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程

简介 本教程将教你如何优化 Nginx&#xff0c;使其能够高效地处理高流量网站。 Nginx 是一个强大且高性能的 Web 服务器&#xff0c;以其高效处理大量并发连接的能力而闻名&#xff0c;这使得它成为高流量网站的流行选择。 正确优化 Nginx 可以显著提高服务器的性能&#xff0…

AIRemoveBackground:用 AI 技术轻松去除背景图的前端程序

在当今数字化时代&#xff0c;图像处理技术不断发展&#xff0c;其中 AI 去除背景图的功能备受关注。本文将介绍一款名为 AIRemoveBackground 的前端程序&#xff0c;它利用人工智能技术&#xff0c;为用户提供便捷、高效的背景去除解决方案。 一、简介 随着互联网的普及和多媒…

【踩坑指南2.0 2025最新】Scala中如何在命令行传入参数以运行主函数

这个地方基本没有任何文档记录&#xff0c;在学习的过程中屡屡碰壁&#xff0c;因此记录一下这部分的内容&#xff0c;懒得看可以直接跳到总结看结论。 踩坑步骤 首先来看看书上让我们怎么写&#xff1a; //main.scala object Start {def main(args:Array[String]) {try {v…

Excel VBA 自动填充空白并合并相同值的解决方案

文章目录 Excel VBA: 自动填充空白并合并相同值的解决方案问题背景解决方案1. VBA代码实现2. 代码说明3. 使用方法4. 注意事项 扩展优化总结 Excel VBA: 自动填充空白并合并相同值的解决方案 问题背景 在Excel中经常会遇到这样的数据处理需求&#xff1a;一列数据中存在多个空…

SpringSecurity中的过滤器链与自定义过滤器

关于 Spring Security 框架中的过滤器的使用方法,系列文章: 《SpringSecurity中的过滤器链与自定义过滤器》 《SpringSecurity使用过滤器实现图形验证码》 1、Spring Security 中的过滤器链 Spring Security 中的过滤器链(Filter Chain)是一个核心的概念,它定义了一系列过…

【STC库函数】Compare比较器的使用

如果我们需要比较两个点的电压&#xff0c;当A点高于B点的时候我们做一个操作&#xff0c;当B点高于A点的时候做另一个操作。 我们除了加一个运放或者比较器&#xff0c;还可以直接使用STC内部的一个比较器。 正极输入端可以是P37、P50、P51&#xff0c;或者从ADC的十六个通道…

Postgresql 命令还原数据库

因为PgAdmin打不开&#xff0c;但是数据库已经安装成功了&#xff0c;这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…

Backend - C# 的日志 NLog日志

目录 一、注入依赖和使用 logger 二、配置记录文件 1.安装插件 NLog 2.创建 nlog.config 配置文件 3. Programs配置日志信息 4. 设置 appsettings.json 的 LogLevel 5. 日志设定文件和日志级别的优先级 &#xff08;1&#xff09;常见的日志级别优先级 &#xff08;2&…

急需升级,D-Link 路由器漏洞被僵尸网络广泛用于 DDoS 攻击

僵尸网络活动增加 &#xff1a;新的“FICORA”和“CAPSAICIN”僵尸网络&#xff08;Mirai 和 Kaiten 的变体&#xff09;的活动激增。 被利用的漏洞 &#xff1a;攻击者利用已知的 D-Link 路由器漏洞&#xff08;例如 CVE-2015-2051、CVE-2024-33112&#xff09;来执行恶意命…

[ubuntu-22.04]ubuntu不识别rtl8153 usb转网口

问题描述 ubuntu22.04插入rtl8153 usb转网口不识别 解决方案 安装依赖包 sudo apt-get install libelf-dev build-essential linux-headers-uname -r sudo apt-get install gcc-12 下载源码 Realtek USB FE / GBE / 2.5G / 5G Ethernet Family Controller Softwarehttps:/…

WinForm开发-自定义组件-1. 工具栏: UcompToolStrip

这里写自定义目录标题 1. 工具栏: UcompToolStrip1.1 展示效果1.2 代码UcompToolStrip.csUcompToolStrip.Designer.cs 1. 工具栏: UcompToolStrip 自定义一些Winform组件 1.1 展示效果 1&#xff09;使用效果 2&#xff09;控件事件 1.2 代码 设计 编码 UcompToolStrip.…

Hypium纯血鸿蒙系统 HarmonyOS NEXT自动化测试框架

1、什么是Hypium Hypium是华为官方为鸿蒙操作系统开发的一款以python为语言的自动化测试框架。 引用华为官网介绍如下&#xff1a; DevEco Testing Hypium(以下简称Hypium)是HarmonyOS平台的UI自动化测试框架&#xff0c;支持开发者使用python语言为应用编写UI自动化测试脚本…

基于Spring Boot微信小程序电影管理系统

一、系统背景与意义 随着移动互联网的普及和用户对个性化娱乐需求的不断增长&#xff0c;电影行业迎来了新的发展机遇。然而&#xff0c;传统的电影管理方式存在信息不对称、购票流程繁琐、用户体验不佳等问题。因此&#xff0c;开发一个基于Spring Boot微信小程序的电影管理系…

软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计

一、实验内容 1. 绘制工资支付系统的功能结构图和数据库 在系统设计阶段&#xff0c;要设计软件体系结构&#xff0c;即是确定软件系统中每个程序是由哪些模块组成的&#xff0c;以及这些模块相互间的关系。同时把模块组织成良好的层次系统&#xff1a;顶层模块通过调用它的下层…

深度学习blog- 数学基础(全是数学)

矩阵‌&#xff1a;矩阵是一个二维数组&#xff0c;通常由行和列组成&#xff0c;每个元素可以通过行索引和列索引进行访问。 张量‌&#xff1a;张量是一个多维数组的抽象概念&#xff0c;可以具有任意数量的维度。除了标量&#xff08;0D张量&#xff09;、向量&#xff08;…

JMH338-剑侠情缘2【开服端】-2017版【剑荡三界】+服务端+客户端+登录器+外网

资源介绍&#xff1a; 激情服&#xff1b;剑荡三界基本上可以直接开服玩&#xff0c;总之每个服都有他的特色&#xff1b;云中&#xff0c;红莲山&#xff0c;葬雪城三大地图三种世界BOSS每个小时刷一次 云中押镖劫镖&#xff0c;出城就是PK模式 剑荡烟云副本分为普通和难度…

QML自定义滑动条Slider的样式

代码展示 import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.1Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Slider {id: controlvalue: 0.5background: Rectangle {x: control.leftPaddingy: control.topPadding …

什么是.net framework,什么是.net core,什么是.net5~8,版本对应关系

我不知道有多少人和我一样&#xff0c;没学习过.netCore&#xff0c;想要学习&#xff0c;但是版本号太多就蒙了&#xff0c;不知道学什么了&#xff0c;这里解释下各个版本的关系 我们一般开始学习微软的时候&#xff0c;都是开始学习的.netframework&#xff0c;常用的就是4…

【2025最新计算机毕业设计】基于Spring Boot+Vue影院购票系统(高质量源码,提供文档,免费部署到本地)

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…