数据结构(Day14)
一、学习内容
-
结构体
-
概念
-
引入:定义整数赋值为10 int a=10; 定义小数赋值为3.14 float b=3.14; 定义5个整数并赋值 int arr[5] = {1 , 2 , 3 , 4 ,5}; 定义一个学生并赋值学号姓名成绩 定义一个雪糕并赋值名称产地单价 问题:没有学生、雪糕 数据类型 解决:结构体——存储多个 类型相同或不同的数据 的容器 区别:数组 和 结构体的区别是什么?
-
-
定义结构体的语法
-
struct 结构体名{ 成员变量1; 成员变量2; 成员变量3; …… };
-
-
结构体变量的定义 初始化 赋值
-
结构体变量的定义
-
第一种
-
struct student{ int id; char name[20]; float score; }a; //学生变量a
-
-
第二种
-
struct student{ int id; char name[20]; float score; }; struct student a; //学生变量a
-
-
-
结构体变量的初始化和赋值
-
第一种
-
定义并初始化 struct student{ int id; char name[20]; float score; }a={1001,"孙文雅",90.5};
-
-
第二种
-
定义并初始化 struct student{ int id; char name[20]; float score; }; struct student a={1001,"孙文雅",90.5};
-
-
第三种
-
先定义、再赋值 struct studen a; //错误赋值 a={1001,"孙文雅",90}; //数组 和 结构体都是构造类型,能再分解,不能整体进行赋值、输入、输出。 //错误赋值 id = 1001; //原因:因为id在复合语句{}中,只能在{}中识别,不能在{}外直接识别 a.id = 1001; strcpy(a.name , "孙文雅"); a.score = 90.5;
-
-
第四种
-
先定义、再输入 struct student a; scanf("%d %s %f" , &a.id , a.name , &a.score);
-
-
-
-
结构体数组的定义 初始化 赋值
-
定义类型
-
struct student{ int id; char name[20]; float score; };
-
/struct student a , b , c , d , e; struct student a[3]; 分别是a[0] a[1] a[2] struct student a[3] = {{1001,"HQYJ",90.5},{1001,"HQYJ",90.5},{1001,"HQYJ",90.5}}
-
-
-
typedef和结构体的结合使用
-
typedef struct student{ int id; char name[20]; float score; }Stu , *Stu_Ptr , Stu_Arr[3]; Stu a = {1001,"HQYJ",90.5}; //定义学生变量a Stu_ptr p = &a; //定义学生指针变量p,指向学生变量a Stu_Arr arr = {{1001,"HQYJ",90.5},{1001,"HQYJ",90.5},{1001,"HQYJ",90.5}} printf("%d %s %.2f\n" , a.id , a.name , a.score); printf("%d %s %.2f\n" , p->id , p->name , p->score); for(int i=0; i<3; i++){ printf("%d %s %.2f\n" , arr[i].id , arr[i].name, arr[i].score); }
-
-
结构体的嵌套
-
结构体的嵌套
-
定义一个人的信息:姓名,性别,车(品牌,单价) struct CAR{ char brand[20]; float price; }; //定义 车 数据类型 struct people{ char name[20]; char sex; struct CAR car; }; struct people a = {"张三" , 'M' , {"奔驰",19.5}}; printf("姓名:%s 性别%c 车的品牌:%s 车的价格:%.2f万元" , a.name, a.sex, a.car.brand, a.car.price)
-
-
结构体嵌套结构体数组
-
定义一个人的信息:姓名,性别,2车(品牌,单价) struct CAR{ char brand[20]; float price; }; //定义 车 数据类型 struct people{ char name[20]; char sex; struct CAR car[2]; }; struct people a = {"张三" , 'M' , {{"奔驰",19.5},{"本田",23.75}}}; printf("姓名:%s 性别%c 车的品牌:%s 车的价格:%.2f万元" , a.name, a.sex, \ a.car[0].brand, a.car[0].price, a.car[1].brand, a.car[1].price)
-
-
结构体内部写动态函数
-
在c语言中,结构体中不可以有函数
-
在结构体中实现一个功能,则需要借助于函数指针
-
定义一个学生:姓名,年纪,分数,爱好(唱歌) void song(){ printf("苍茫的天涯是我的爱……\n"); } int fun(){ return 10086; } struct student{ char name[20]; int age; float score; void (*hobby)(); int (*p)(); }; struct student a={"张三",18,90.5,song}; printf("姓名:%s" , a.name); printf("年龄:%d" , a.age); printf("分数:%.2f" , a.score); a.hobby(); printf("积分:%d" , a.p());
-
-
结构体字节对齐
-
结构体各个成员的地址是连续的
-
结构体变量的地址是第一个成员的地址
-
64位操作系统,8字节对齐,32位操作系统,4字节对齐
-
计算步骤
-
先找最大步长【int/float 4字节 double/long/指针 8字节】
-
按照最大步长分布内存
-
在一个步长内就放进去
-
若跨步长了,就按照最大步长再开空间
-
最后计算总和即可
-
-
-
-
-
脑图

二、作业
-
求 sizeof(name1)?(晟安信息)
struct name1{
char str;
short x;
int num;
};
解析:
char str:占 1 字节,起始地址是 0。后面需要对齐到 2 字节(short x 的对齐要求),因此会插入 1 个填充字节。short x:起始地址是 2,占 2 字节。int num:按 4 字节对齐,x 结束的地址是 4,因此不需要额外的填充。num 占用 4 字节。str + 填充字节(1 字节) + x(2 字节)+ num(4 字节) = 8 字节。
解答:
8
-
(电工时代)
typedef struct _a
{
char c1;
long i;
char c2;
double f;
}a;
typedef struct _b
{
char c1;
char c2;
long i;
double f;
}b;
sizeof(a) = _______;
sizeof(b) = _______;
解析:
sizeof(a):
char c1:占 1 字节,起始地址为 0。long i:需要按 8 字节对齐,因此从地址 8 开始,占用 8 字节。char c2:占 1 字节,从 c1 开始的地址为 16。由于 double f 需要 8 字节对齐,所以在 c2 后面将有 7 个填充字节。double f:占 8 字节,从地址 24 开始。
总大小:1 byte (c1) + 7 bytes (填充) + 8 bytes (long i) + 1 byte (c2) + 7 bytes (填充) + 8 bytes (double f) = 32 字节。
sizeof(b):
char c1 和 char c2:各占 1 字节,共 2 字节。为了满足 long i 的 8 字节对齐需求,后面会有 6 个填充字节。
long i:占 8 字节,从地址 8 开始。
double f:占 8 字节,从地址 16 开始。
总大小:1 byte (c1) + 1 byte (c2) + 6 bytes (填充) + 8 bytes (long i) + 8 bytes (double f) = 24 字节。
解答:
32 24
-
给了一个结构体,求 sizeof(struct A) = ________。 (鲁科安全,软通动力)
struct A{
char a;
char b;
char c;
short d;
int e;
short f;
}
解析:
char a:占 1 字节,起始地址为 0。
char b:占 1 字节,起始地址为 1。
char c:占 1 字节,起始地址为 2。
short d:占 2 字节,short 类型通常需要 2 字节对齐,所以地址 3 需要对齐到 4,插入 1 个填充字节。d 从地址 4 开始,占用 2 字节。
int e:占 4 字节,int 需要 4 字节对齐。从 d 结束后的地址是 6,需要对齐到 8,插入 2 个填充字节。e 从地址 8 开始,占用 4 字节。
short f:占 2 字节,short 需要 2 字节对齐。e 结束的地址是 12,因此 f 可以直接从地址 12 开始,占用 2 字节。
由于结构体整体对齐规则通常以最大成员对齐(这里 int 是 4 字节对齐),因此为了满足对齐要求,总大小要是 4 字节的倍数。f 结束时的地址是 14,因此需要插入 2 个填充字节,使结构体大小为 16 字节
解答:
16
-
有一个如下的结构体,请问在64位编译器下用 sizeof(struct A) 计算出的大小是多少?( ) (鲁科安全)
struct A{
long a1;
short a2;
int a3;
int *a4;
}
A. 24 B. 28 C. 16 D. 18
解析:
long a1:占 8 字节,从地址 0 开始。short a2:占 2 字节,从地址 8 开始。short 类型通常要求 2 字节对齐,但是后面的 int a3 需要 4 字节对齐。填充字节:由于 int a3 需要 4 字节对齐,a2 结束后地址是 10,因此需要 2 个填充字节,使得 a3 从地址 12 开始。int a3:占 4 字节,从地址 12 开始。int *a4:占 8 字节,指针类型在 64 位系统中是 8 字节,要求 8 字节对齐。由于 a3 结束后的地址是 16,符合 8 字节对齐的要求,因此 a4 从地址 16 开始,占 8 字节。
总大小:long a1(8 字节) + short a2(2 字节) + 2 个填充字节 + int a3(4 字节)+ int *a4(8 字节)= 24 字节。
解答:
A
-
有以下说明语句,则下列错误的引用 是( )。(山大华天)
struct stu
{
int no;
char name[21];
};
stu w, *p = &w;
A. w.no B*p.no C. p->no D. (*p).no
解析:
A. w.no
w 是结构体变量,可以直接使用点运算符 . 访问结构体成员 no。这是正确的引用方式。
B. *p.no
这是错误的语法,*p 是指针解引用,表示指向 w 的结构体,但是这里缺少括号。p.no 会被理解为 p 是结构体,试图访问其成员 no,这是不正确的,因为 p 是指针,而不是结构体。因此这个表达式应该写成 (*p).no。
C. p->no
p 是指向结构体的指针,箭头运算符 -> 用于通过指针访问结构体的成员。这是正确的引用方式。
D. (*p).no
通过 *p 解引用指针 p,访问结构体 w,再使用点运算符 . 来访问成员 no。这是正确的引用方式。
解答:
B
-
写出下述程序结果: (中维世纪)
typedef struct test
{
char x1;
short x2;
float x3;
char x4;
}TEST_T;
printf("%d", sizeof(TEST_T));
解析:
char x1:占 1 字节,起始地址是 0。short x2:short 类型通常需要 2 字节对齐,因此在 x1 后面插入 1 个填充字节,使得 x2 从地址 2 开始,占 2 字节。float x3:float 类型需要 4 字节对齐,x2 结束后的地址是 4,符合 float 的对齐要求,因此 x3 从地址 4 开始,占 4 字节。char x4:占 1 字节,x3 结束的地址是 8。由于 char 不需要对齐,x4 可以直接从地址 8 开始,占 1 字节。
总大小:为了满足结构体整体对齐,编译器通常会以最大的成员(这里是 float,即 4 字节)的对齐方式对齐整个结构体。因此,结构体的大小必须是 4 的倍数。x4 结束时的地址是 9,需要插入 3 个填充字节 以保证整体大小是 4 的倍数。
解答:
12
-
下面的代码输出是什么,为什么?(64位环境) (信雅达)
struct {
char *a1;
long a2;
short a3;
}A;
int main(void)
{
printf("%d", sizeof(A));
}
解析:
char *a1:指针类型在 64 位系统中占用 8 字节,起始地址是 0。long a2:long 类型在 64 位系统中占 8 字节,需要 8 字节对齐,所以 a2 可以从地址 8 开始,占 8 字节。short a3:short 类型占 2 字节,需要 2 字节对齐,a2 结束后的地址是 16,a3 可以从地址 16 开始,占用 2 字节。
填充字节:为了满足结构体整体对齐的要求,编译器通常以结构体中 最大对齐要求的成员 进行对齐。在这个例子中,最大的成员是 char *a1 和 long a2,它们的对齐要求是 8 字节。因此,为了保持结构体整体对齐,a3 后面需要插入 6 个填充字节,使得结构体的总大小是 8 字节的倍数。
总大小:8 bytes (a1) + 8 bytes (a2) + 2 bytes (a3) + 6 bytes (填充) = 24 字节
解答:
24
-
设有如下结构定义: struct student { int num; char name[20]; char sex; int age; char addr[30];} stud; 若用printf("%s\n", .....)访问该结构中name值的正确方法是 ( ) (杭州快越科技)
A. stud -> name B. &stud.name
C. stud.&name D. stud.name
解析:
A. stud -> name
-> 运算符用于指针访问结构体成员,stud 是结构体变量,不是指针。因此,这个选项是错误的。
B. &stud.name
&stud.name 获取的是 name 数组的地址,虽然它和 stud.name 表示的内容类似,但 &stud.name 实际上是指向整个数组的地址,不适合直接用作字符串指针。这个选项虽然编译器可能接受,但语义不太合适。
C. stud.&name
这是语法错误,不能在结构体变量名后直接使用 &name,因此这个选项是错误的。
D. stud.name
这是正确的方式。stud.name 是字符数组名,在需要时会自动转换为指向数组第一个元素的指针,因此可以正确用于 printf("%s", stud.name) 语句。
解答:
D
则sizeof(cs)的值是( ) (苏州特点电子科技)
struct{
short a; char b; float c;
}cs;
A.4 B.5 C.7 D.8
解析:
short a:占 2 字节,起始地址为 0。short 类型需要 2 字节对齐,因此无需填充字节。char b:占 1 字节,从地址 2 开始。由于 float c 需要 4 字节对齐,因此需要插入 1 个填充字节,使得接下来的 float c 从 4 字节对齐的地址开始。float c:占 4 字节,从地址 4 开始,符合 4 字节对齐要求。总大小:2 bytes (a) + 1 byte (b) + 1 byte (填充) + 4 bytes (c) = 8 字节。
结论:
sizeof(cs) 的值是 8 字节。解答:
D
-
如下函数的输出结果是:【 】
struct node
{
char a; short b; char c; int d;
};
struct node s = { 3, 5, 6, 99 };
struct node *pt = &s;
printf("%X\n", *(int*)pt);
解析:
char a:1 字节short b:2 字节,起始地址在 a 后面,所以实际地址为 2填充字节:由于 int d 需要 4 字节对齐,在 short b 后面需要 1 个填充字节,使 d 从地址 4 开始char c:1 字节,实际地址为 4int d:4 字节,从地址 8 开始
假设结构体在内存中的布局如下(假设按小端字节序):
a = 0x03 (1 byte)
b = 0x05 (2 bytes)
c = 0x06 (1 byte)
d = 0x63 (4 bytes)
解引用指针
pt 是指向 struct node 的指针。(int*)pt 将指针转换为指向 int 的指针,实际上指向的是 d 成员,因为 d 是第一个 int 类型成员。*(int*)pt 读取 d 的值,即 99。
结果
d 的值是 99,按十六进制表示是 0x63。
解答:
63
-
编程题:定义学生结构体,存储学生的学号、姓名、分数,定义长度为5的结构体数组,实现:
①输入学生信息
②输出学生信息
③计算学生的成绩总分、平均分
④按照学生的分数进行排序
⑤输出排序后的数组
代码解答 :
#include <stdio.h>
#include <string.h>// 定义学生结构体
typedef struct {int id; // 学号char name[50]; // 姓名float score; // 分数
} Student;// 函数声明
void inputStudents(Student students[], int count);
void printStudents(const Student students[], int count);
float calculateTotalScore(const Student students[], int count);
float calculateAverageScore(const Student students[], int count);
void sortStudentsByScore(Student students[], int count);int main() {const int numStudents = 5; // 学生数量Student students[numStudents];// 输入学生信息printf("输入学生信息:\n");inputStudents(students, numStudents);// 输出学生信息printf("\n学生信息:\n");printStudents(students, numStudents);// 计算并输出成绩总分和平均分float totalScore = calculateTotalScore(students, numStudents);float averageScore = calculateAverageScore(students, numStudents);printf("\n成绩总分: %.2f\n", totalScore);printf("平均分: %.2f\n", averageScore);// 按分数排序sortStudentsByScore(students, numStudents);// 输出排序后的学生信息printf("\n按分数排序后的学生信息:\n");printStudents(students, numStudents);return 0;
}// 输入学生信息
void inputStudents(Student students[], int count) {for (int i = 0; i < count; i++) {printf("输入第 %d 位学生的信息:\n", i + 1);printf("学号: ");scanf("%d", &students[i].id);printf("姓名: ");scanf("%s", students[i].name);printf("分数: ");scanf("%f", &students[i].score);}
}// 输出学生信息
void printStudents(const Student students[], int count) {for (int i = 0; i < count; i++) {printf("学号: %d, 姓名: %s, 分数: %.2f\n", students[i].id, students[i].name, students[i].score);}
}// 计算总分
float calculateTotalScore(const Student students[], int count) {float total = 0;for (int i = 0; i < count; i++) {total += students[i].score;}return total;
}// 计算平均分
float calculateAverageScore(const Student students[], int count) {float total = calculateTotalScore(students, count);return total / count;
}// 按分数排序(升序)
void sortStudentsByScore(Student students[], int count) {for (int i = 0; i < count - 1; i++) {for (int j = i + 1; j < count; j++) {if (students[i].score > students[j].score) {// 交换Student temp = students[i];students[i] = students[j];students[j] = temp;}}}
}
三、总结
1. 学习内容概述
结构体定义与使用
了解了如何定义结构体,并通过实际例子学习了如何在结构体中使用各种数据类型。
学习了结构体变量的初始化方法,以及如何通过多种方式定义结构体数组。
学习了如何通过指针访问结构体成员,使用 `typedef` 简化结构体的声明和操作。
嵌套结构体
结构体内可以包含其他结构体,学习了如何定义一个嵌套结构体并初始化其成员变量。
结构体与函数结合
学习了如何将结构体与函数结合,通过函数传递结构体并返回结果。包括将结构体作为函数参数和返回值。
位字段的使用
位字段允许在结构体中节省内存空间,通过指定位数来定义变量的存储空间。
2. 学习难点
结构体指针的使用
结构体指针的使用较为复杂,尤其是在处理嵌套结构体时。理解如何通过指针访问和修改结构体成员是本次学习的难点。
结构体数组的初始化与访问
在结构体数组中,初始化每一个结构体成员以及使用指针遍历整个结构体数组需要较多练习,特别是对于较为复杂的结构体。
嵌套结构体的访问
嵌套结构体的成员访问更为复杂,需要通过多层次的点运算符和指针运算符。
3. 主要事项
结构体的内存对齐
结构体成员在内存中是按一定的对齐方式排列的,不同的机器和编译器可能会有不同的内存对齐策略,导致存储空间的浪费或性能下降。
结构体与动态内存分配
结构体中的数组成员如果长度不确定,可以通过动态内存分配来解决。在使用动态内存时,需要确保合理分配和释放内存。
结构体的拷贝与传递
结构体传递给函数时通常是按值传递的,可能会造成大量的内存拷贝,因此在函数中传递结构体指针更为高效。
位字段的限制
位字段可以节省空间,但由于其实现依赖于硬件和编译器,不同平台可能存在兼容性问题。
4. 未来学习的重点
深入理解结构体与内存的关系
未来应更加深入研究结构体的内存对齐方式,以及如何在不同平台下优化结构体的内存占用。
结构体与复杂数据结构结合
进一步学习如何使用结构体构建链表、树、图等复杂数据结构,并理解这些数据结构中的内存管理问题。
结构体与文件输入输出
研究如何将结构体与文件操作结合起来,例如将结构体数据写入文件或从文件读取结构体数据,确保文件读写的高效性和数据一致性。
提高结构体的性能优化
理解结构体优化对程序性能的影响,特别是在大型程序中如何通过优化结构体来减少内存占用和提高访问效率。
相关文章:
数据结构(Day14)
一、学习内容 结构体 概念 引入:定义整数赋值为10 int a10; 定义小数赋值为3.14 float b3.14; 定义5个整数并赋值 int arr[5] {1 , 2 , 3 , 4 ,5}; 定义一个学生并赋值学号姓名成绩 定义一个雪糕并赋值名称产地单价 问题:没有学生、雪糕 数据类型 解决&…...
Paragon NTFS for Mac和Tuxera NTFS for Mac,那么两种工具有什么区别呢?
我们在使用Mac系统读取U盘的过程中往往会遇到一个问题,那就是U盘插进电脑无法显示,或者只能读取不能编辑。出现这种情况的原因就一般是格式错误。 很多小伙伴在解决这种问题的时候会选择使用U盘读写工具,那么哪一种读写工具比较好呢…...
HashTable结构体数组实现
写了个哈希表,底层逻辑基于结构体数组,核心结构:HashNode,结构外壳:HashTable_R,冲突处理以后会加的(QwQ)~ 目前代码: #ifndef PYIC_X #define PYIC_Xunsigned int PYIC_Hash(unsigned int Val, unsigned int Mov) {unsigned int Ht[4] { …...
Python 管理 AWS ElastiCache 告警
在 AWS 环境中,监控和管理 ElastiCache 集群的性能是至关重要的。本文将介绍如何使用 Python 和 AWS SDK (boto3) 来自动创建和删除 ElastiCache 集群的 CloudWatch 告警。我们将分两部分来讨论:创建告警和删除告警。 第一部分:创建 ElastiCache 告警 首先,让我们看看如何…...
【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)
摘要 为了克服常规PID控制方法在无人机俯仰姿态控制中的不足,本研究设计了一种基于模糊自适应PID控制的控制律。通过引入模糊控制器,实现了对输入输出论域的优化选择,同时解决了模糊规则数量与控制精度之间的矛盾。仿真结果表明,…...
[数据集][目标检测]不同颜色的安全帽检测数据集VOC+YOLO格式7574张5类别
重要说明:数据集里面有2/3是增强数据集,请仔细查看图片预览,确认符合要求在下载,分辨率均为640x640 数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件…...
确保 App 跟踪透明度权限:Flutter 中的实践
确保 App 跟踪透明度权限:Flutter 中的实践 在数字广告领域,用户隐私保护已成为一个重要议题。随着 iOS 14 的发布,Apple 引入了 App Tracking Transparency (ATT) 框架,要求开发者在跟踪用户行为以提供个性化广告之前必须获得用…...
李沐 过拟合和欠拟合【动手学深度学习v2】
模型容量 模型容量的影响 估计模型容量 难以在不同的种类算法之间比较,例如树模型和神经网络 给定一个模型种类,将有两个主要因素: 参数的个数参数值的选择范围 VC维...
Go Testify学习与使用
文章目录 1. **安装 Testify**2. **Testify 的主要功能**3. **Testify 使用示例**3.1 断言 (Assertions)3.2 使用 require3.3 使用 Mock3.4 测试套件 (Test Suites) 4. **Testify 的其他功能**5. **总结**常用资源 Testify 是 Go 语言中一个常用的单元测试库,它为标…...
Word中引用参考文献和公式编号的方法
文章目录 应用参考文献对于单个文献引用多于多个文献同时引用 公式编号手动编号自动编号 参考: 应用参考文献 对于单个文献引用 word中的参考文献用交叉应用实现。 首先,将参考文献编号: 然后,在需要引用的地方用交叉引用插入…...
[数据集][目标检测]智慧养殖场肉鸡目标检测数据集VOC+YOLO格式3548张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3548 标注数量(xml文件个数):3548 标注数量(txt文件个数):3548 标注…...
Vision Transform—用于大规模图像分类的Transformers架构
VIT — 用于大规模图像识别的 Transformer 论文题目:AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE。 官方代码:https://github.com/google-research/vision_transformer 引言与概述 Vision Transformer(ViT&…...
内核驱动开发之系统移植
系统移植 系统移植:定制linux操作系统 系统移植是驱动开发的前导,驱动开发是系统运行起来之后,在内核中新增一些子功能而已 系统移植就四个部分: 交叉编译环境搭建好bootloader的选择和移植:BootLoader有一些很成熟…...
前端在网络安全攻击问题上能做什么?
前端在Web网络安全攻击问题上扮演着至关重要的角色,可以通过多种措施来增强Web应用的安全性。以下是前端在应对Web网络安全攻击时可以采取的具体行动: 1. 输入验证和过滤 严格验证用户输入:前端应对所有用户输入进行严格的验证,…...
IntelliJ IDEA 创建 HTML 项目教程
传送门 IntelliJ IDEA 是 JetBrains 提供的一款强大且多功能的集成开发环境(IDE),不仅可以用于 Java 开发,还支持多种其他编程语言和技术,包括 HTML、CSS 和 JavaScript 等前端开发工具。本文将带你逐步了解如何使用 IntelliJ IDEA 创建一个 HTML 项目,并配置适合前端开…...
YOLOv9改进系列,YOLOv9主干网络替换为RepViT (CVPR 2024,清华提出,独家首发),助力涨点
摘要 轻量级视觉变换器(ViTs)在资源受限的移动设备上表现出优越的性能和较低的延迟,相比之下轻量级卷积神经网络(CNNs)稍显逊色。研究人员发现了许多轻量级 ViTs 和轻量级 CNNs 之间的结构联系。然而,它们在块结构、宏观和微观设计上的显著架构差异尚未得到充分研究。在…...
VBS学习1 - 语法、内置函数、内置对象
文章目录 概述执行脚本语法转义字符文本弹框msgbx定义变量dim(普通类型)定义接收对象set字符拼接&用户自定义输入框inputbox以及输入判断ifelse数组(参数表最大索引,非数组容量)有容量无元素基于元素确定容量 循环…...
11 vue3之插槽全家桶
插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。 匿名插槽 1.在子组…...
Excel 基础知识-操作手册1
Excel基础操作知识 一、工作窗口的视图控制 1、创建新窗口:依次点击【视图】----【新建窗口】命令,即可为当前工作簿创建新的窗口。在原有的工作簿中更改标题或表格内容时,新建的工作簿也会相应的更改。 2、窗口切换:在【视图】…...
Python 类的继承
Python 的代码组织如下: moudle:模块,和实例名和函数都是小写加下划线的方法表示。 class:类,使用首字母大写驼峰的写法表示。 类里面包含类的属性,__init__ ()方法和类的方法。 __init__() 方法在类的创建…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
