当前位置: 首页 > news >正文

【C语言】指针的进阶(三)—— 模拟实现qsort函数以及指针和数组的笔试题解析

目录

1、模拟实现qsort函数

1.1、qsort函数的回顾

1.2、模拟实现qsort函数 

2、指针和数组笔试题解析

2.1、一维数组

2.2、字符数组


1、模拟实现qsort函数

1.1、qsort函数的回顾

要模拟实现qsort函数,就要了解清楚qsort函数的参数以及使用方式。

我们先回顾一下qsort函数:

qsort是一个库函数,底层使用的是快速排序的方式对数据进行排序。头文件:<stdlib.h>

这个函数可以直接使用用来排序任意类型的数据。

qsort函数定义原型: 

void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));

  • void* base:待排序数组的第一个元素的地址
  • size_t num:待排序数组的元素个数
  • size_t size:以字节为单位,待排序数组中一个元素的大小。
  • int (*compar)(const void*,const void*):函数指针,指向一个比较函数,用来比较两个元素,由用户自行创建并封装。

形参中为什么用的是void*:

void* 是无具体类型的指针,不能进行解引用操作符,也不能进行+-整数的操作,它是用来存放任意类型数据的地址(可以理解为垃圾桶,什么都能装,当需要用时再强制类型转换为需要的类型)。只有void*被允许存放任意类型数据的地址,如果是其他类型的指针编译器会报错。正是因为定义qsort函数时用的是void*,qsort函数才可以排序任意类型的数据。

1.2、模拟实现qsort函数 

使用【冒泡排序】的算法,模拟实现一个排序函数 bsort ,可以用来排序任意类型的数据。

首先,先用冒泡排序实现排序整型数据:

void bsort(int arr[], int sz)
{int i = 0;for ( i = 0; i < sz - 1; i++){int j = 0;for ( j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}int main()
{int arr[] = { 10,9,8,7,6,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);bsort(arr, sz);int i = 0;for ( i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

        在这个冒泡排序排序整型数据的代码的基础上进行改造。

        首先改造的第一部分就是函数参数,这里的函数参数被写死了只能进行int类型的排序,因此为了让其他类型的数据也能够传入到bsort函数中进行排序,我们这里需要使用指针来接收传入参数。

        参数一:而指针的选择上又只有 void* 最为符合,因为它是用来存放任意类型数据的地址(可以理解为垃圾桶,什么都能装,当需要用时再强制类型转换为需要的类型)。

        参数二:对照库函数qsort的定义中,第二个参数为待排序数组的元素个数,因此我们也用个 size_t num 存放待排序数组的元素个数。

当前,我们可以通过参数一和参数二知道起始位置地址(void* base)和元素个数(num),但是仅仅知道起始地址和元素个数是不够的,因为不知道一个元素有多大的,一次需要跳过多少个字节,5个?10个?

        参数三:因此还需要一个参数记录一个元素的大小 size_t size。

到此,我们先把注意里放在函数内部,函数内部循环的趟数和一趟的次数是不需要改造的,只有红色框框内的交换区域需要改造,因为整数的大小可以用><=号比较,但是结构体数据是不能直接使用><=号来比较的。排序一个整型需要整型的方法,排序一个结构体需要结构体的方法,因此如果需要排序各种各样的类型时,不能固定写死交换区域的比较方式,这就需要用户自行创建比较函数来实现。

        参数四而我们这里只需要使用函数指针 int (*cmp)(const void* e1,const void* e2)  接收用户传递的比较函数即可。e1和 e2都是指针,分别存放着一个要比较的元素的地址。

 对红框区域进行修改:

注意,在cmp函数中传入base参数时,需要对base强制类型转换char*,因为只有char的步长最短,可以满足所有类型的交换。假设是int类型的话,+1直接跳过4个字节,那么如果要交换一个char类型或者short类型的数据,那就无法做到交换了。

 【交换int类型数据的完整代码】

swap(char* buf1, char* buf2, size_t size)
{一个字节一个字节地交换int i = 0;for ( i = 0; i < size; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}//模拟库函数qsort
void bsort(void* base, size_t num, size_t size, int (*cmp)(const void* e1, const void* e2))
{int i = 0;for ( i = 0; i < num - 1; i++){int j = 0;for ( j = 0; j < num - 1 - i; j++){//if(arr[j]>arr[j+1])if (cmp((char*)base + size * j, (char*)base + size * (j + 1)) > 0) //大于0时,证明j的元素大于j+1的元素,所以要交换位置{//交换swap((char*)base + size * j, (char*)base + size * (j + 1), size);}}}
}//用户自行创建
int cmp_in(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}int main()
{int arr[] = { 10,9,8,7,6,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);bsort(arr, sz,sizeof(arr[0]),cmp_in);int i = 0;for ( i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

【图解】

同理,结构体类型数据也能交换。 

 【交换结构体类型数据的完整代码】

swap(char* buf1, char* buf2, size_t size)
{//一个字节一个字节地交换int i = 0;for ( i = 0; i < size; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}void bsort(void* base, size_t num, size_t size, int (*cmp)(const void* e1, const void* e2))
{int i = 0;for ( i = 0; i < num - 1; i++){int j = 0;for ( j = 0; j < num - 1 - i; j++){//if(arr[j]>arr[j+1])if (cmp((char*)base + size * j, (char*)base + size * (j + 1)) > 0) //大于0时,证明j的元素大于j+1的元素,所以要交换位置{//交换swap((char*)base + size * j, (char*)base + size * (j + 1), size);}}}
}struct Stu
{char name[20];int age;
};int cmp_stu_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}int main()
{struct Stu arr[] = { {"zhangsan",22},{"lisi",26},{"wangwu",20} };int sz = sizeof(arr) / sizeof(arr[0]);bsort(arr, sz,sizeof(arr[0]),cmp_stu_age);printf("\n");return 0;
}

例子中是按照年龄排序。使用调试检查一下,确实完成了交换:

如果想要进行降序排序的话,只需要将用户自行创建并封装的 cmp函数 中return的e1和e2交换即可,下面以cmp_int为例:

swap(char* buf1, char* buf2, size_t size)
{//一个字节一个字节地交换int i = 0;for ( i = 0; i < size; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}void bsort(void* base, size_t num, size_t size, int (*cmp)(const void* e1, const void* e2))
{int i = 0;for ( i = 0; i < num - 1; i++){int j = 0;for ( j = 0; j < num - 1 - i; j++){//if(arr[j]>arr[j+1])if (cmp((char*)base + size * j, (char*)base + size * (j + 1)) > 0) //大于0时,证明j的元素大于j+1的元素,所以要交换位置{//交换swap((char*)base + size * j, (char*)base + size * (j + 1), size);}}}
}int cmp_in(const void* e1, const void* e2)
{return *(int*)e2 - *(int*)e1;  //进行【降序】排序
}int main()
{int arr[] = {1,2,3,4,5,6,7,8,9,10};int sz = sizeof(arr) / sizeof(arr[0]);bsort(arr, sz,sizeof(arr[0]),cmp_in);return 0;
}

2、指针和数组笔试题解析

计算下面运算输出的值

2.1、一维数组

int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a + 0));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a + 1));
printf("%d\n", sizeof(a[1]));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(*&a));
printf("%d\n", sizeof(&a + 1));
printf("%d\n", sizeof(&a[0]));
printf("%d\n", sizeof(&a[0] + 1));

【答案】32位环境下运行的结果

【解析】

printf("%d\n", sizeof(a));

sizeof(数组名),这里的数组名表示整个数组,所以计算的是整个数组的大小,4(int字节数)*4=16。

printf("%d\n", sizeof(a + 0));

a并非单独放在sizeof内部,也没有&,所以数组名a是数组首元素的地址,a+0还是首元素的地址,32位环境下,地址大小就是4。

printf("%d\n", sizeof(*a));

 a并非单独放在sizeof内部,也没有&,所以数组名a是数组首元素的地址。*a 就是 首元素,大小就是4 ,特别的:*a == *(a+0) == a[0]

printf("%d\n", sizeof(a + 1));

 a并非单独放在sizeof内部,也没有&,所以数组名a是数组首元素的地址,a+1就是第2个元素的地址,32位环境下,地址大小就是4。

printf("%d\n", sizeof(a[1]));

 a[1]就是数组的第二个元素,这里计算的就是第二个元素的大小,int就是4。

printf("%d\n", sizeof(&a));

 &a - 是取出数组的地址,但是数组的地址也是地址,32位环境下,是地址就是4。数组的地址数组首元素的地址 的本质区别是类型的区别,并非大小的区别。

printf("%d\n", sizeof(*&a));

 对数组指针解引用访问一个数组的大小,单位是字节,也可以理解成 *&相互抵消即sizeof(*&a) =  sizeof(a),sizeof(数组名),这里的数组名表示整个数组,所以计算的是整个数组的大小。

printf("%d\n", sizeof(&a + 1));

 &a数组的地址,&a+1还是地址,是地址就是4。

printf("%d\n", sizeof(&a[0]));

 &a[0]是首元素的地址,计算的是地址的大小4。

printf("%d\n", sizeof(&a[0] + 1));

 &a[0]是首元素的地址,&a[0]+1就是第二个元素的地址,大小4。

2.2、字符数组

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));

【答案】 32位环境下运行的结果

【解析】

printf("%d\n", sizeof(arr));

 数组名arr单独放在sizeof内部,计算的是整个数组的大小6。

printf("%d\n", sizeof(arr + 0));

arr是首元素的地址==&arr[0],是地址就是4。

  • 指针变量的大小和类型无关,不管什么类型的指针变量,大小都是4/8个字节
  • 指针变量是用来存放地址的,地址存放需要多大空间,指针变量的大小就是几个字节
  • 32位环境下,地址是32个二进制位,需要4个字节,所以指针变量的大小就是4个字节
  • 64位环境下,地址是64个二进制位,需要8个字节,所以指针变量的大小就是8个字节
printf("%d\n", sizeof(*arr));

 arr是首元素的地址,*arr就是首元素,大小就是1。

printf("%d\n", sizeof(arr[1]));

 arr[1]就是第2个元素,大小就是1。

printf("%d\n", sizeof(&arr));

 &arr是数组的地址,sizeof(&arr)就是4

printf("%d\n", sizeof(&arr + 1));

&arr+1 是跳过数组后的地址, 是地址就是4。

printf("%d\n", sizeof(&arr[0] + 1));

 第二个元素的地址,是地址就是4。

看完sizeof了,再来看一组strlen

printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

 【答案】32位环境下运行的结果

1、随机值

2、随机值

3、err

4、err

5、随机值

6、随机值-6

7、随机值-1

【解析】

注意:题目中使用的是char arr[] = {'a','b','c','d','e','f'};的创建方式,该方式不会自动在末尾添加\0,而strlen只有遇到\0才会停下

printf("%d\n", strlen(arr));

arr是首元素的地址,就是从arr第一个元素开始,找\0,由于不知道后面\0在哪个位置,因此是随机值。

printf("%d\n", strlen(arr + 0));

 arr是首元素的地址, arr+0还是首元素的地址,与上一题同理,是随机值。

printf("%d\n", strlen(*arr));

 arr是首元素的地址, *arr就是首元素,srtlen需要接收一个地址,而这里传递的是一个字符,站在strlen的角度,认为传参进去的'a'-97就是地址,97作为地址,直接进行访问,就是非法访问,因此程序会报错。

printf("%d\n", strlen(arr[1]));

 arr第二个元素地址'b',与上一题同理,非法访问程序报错。

printf("%d\n", strlen(&arr));

 &arr表示整个数组的地址,向后查找\0,因此是随机值。

printf("%d\n", strlen(&arr + 1));

  &arr表示整个数组的地址,&arr + 1表示跳过整个数组(6个字节)向后查找\0,因此是随机值-6。

printf("%d\n", strlen(&arr[0] + 1));

 &arr[0]表示首元素地址,&arr[0] + 1跳过一个元素,向后查找\0,因此是随机值-1。

下面换成char arr[] = "abcdef";再来看看

char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));

【答案】32位环境下运行的结果

 

【解析】

printf("%d\n", sizeof(arr));

 sizeof(数组名)表示整个数组,sizeof是会把\0也计入在内的,因此是7。

printf("%d\n", sizeof(arr + 0));

 arr+0表示首元素地址,是地址就是4。

printf("%d\n", sizeof(*arr));

 *arr表示首元素,首元素是char类型,所以就是1。

printf("%d\n", sizeof(arr[1]));

 第二个元素,所以就是1。

printf("%d\n", sizeof(&arr));

&arr表示整个数组的地址, 是地址就是4

printf("%d\n", sizeof(&arr + 1));

 &arr表示整个数组的地址, &arr + 1表示跳过整个数组,是地址就是4。

printf("%d\n", sizeof(&arr[0] + 1));

 第一个元素的地址,是地址就是4。

换成srtlen

printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

【答案】

1、6

2、6

3、err

4、err

5、6

6、随机值

7、5

【解析】

printf("%d\n", strlen(arr));

 统计\0前有多少个元素,就是6。

printf("%d\n", strlen(arr + 0));

 arr+0等于首元素地址,统计\0前有多少个元素,就是6。

printf("%d\n", strlen(*arr));

 *arr表示首元素,把元素作为地址直接进行访问,就是非法访问,因此程序会报错。

printf("%d\n", strlen(arr[1]));

 与上一题同理,非法访问程序报错。

printf("%d\n", strlen(&arr));

 &arr表示整个数组的地址,向后找\0所以是6。

printf("%d\n", strlen(&arr + 1));

  &arr表示整个数组的地址,&arr + 1表示跳过了一整个数组,跑到了\0之后,无法知道下一个\0在哪里,所以是随机值。

printf("%d\n", strlen(&arr[0] + 1));

 &arr[0] + 1 表示第二个元素的地址,向后找\0等于5。


如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

相关文章:

【C语言】指针的进阶(三)—— 模拟实现qsort函数以及指针和数组的笔试题解析

目录 1、模拟实现qsort函数 1.1、qsort函数的回顾 1.2、模拟实现qsort函数 2、指针和数组笔试题解析 2.1、一维数组 2.2、字符数组 1、模拟实现qsort函数 1.1、qsort函数的回顾 要模拟实现qsort函数&#xff0c;就要了解清楚qsort函数的参数以及使用方式。 我们先回顾一…...

Python 图像处理库PIL ImageOps笔记

# 返回一个指定大小的裁剪过的图像。该图像被裁剪到指定的宽高比和尺寸。 # 变量size是要求的输出尺寸&#xff0c;以像素为单位&#xff0c;是一个&#xff08;宽&#xff0c;高&#xff09;元组 # bleed&#xff1a;允许用户去掉图像的边界&#xff08;图像四个边界&#xff…...

全球南方《乡村振兴战略下传统村落文化旅游设计》许少辉八一新枝——2023学生开学季辉少许

全球南方《乡村振兴战略下传统村落文化旅游设计》许少辉八一新枝——2023学生开学季辉少许...

【C语言】指针的进阶(一)

目录 前言 1. 字符指针 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 4. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 5. 函数指针 前言 指针在C语言中可谓是有着举足轻重的…...

Spring学习(三):MVC

一、什么是MVC MVC&#xff08;Model-View-Controller&#xff09;是一种软件设计模式&#xff0c;用于组织和管理应用程序的代码结构。它将应用程序分为三个主要部分&#xff0c;即模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;…...

排查disabled问题之谷歌新版本特性

问题复现 最近我突然接手一个后台的bug&#xff0c;这个后台很久没有迭代更新了&#xff0c;我也不熟悉业务&#xff0c;所以只能看一下源码&#xff0c;问题很快就复现&#xff0c;测试的修复操作也很正确&#xff0c;就是因为渲染的input标签中存在disableddisabled’属性导…...

三、开发工具

开发工具 开发工具1.1.熟悉IDEA1.2.下载IDEA1.3.IDEA中文插件1.4.IDEA输出中文乱码1.5.使用IDEA —————————————————————————————————————————————————— —————————————————————————————————…...

代码解读:y.view(y.size(0), -1)---tensor张量第一维保持不变,其余维度展平

y.view(y.size(0), -1)代码解读&#xff1a; 用于改变PyTorch张量&#xff08;tensor&#xff09;y的形状的。 y.size(0)返回y的第一维的大小。 -1表示让PyTorch自动计算该维度的大小&#xff0c;以确保新的张量与原始张量有相同的元素数量。 功能&#xff1a;将y的第一维保持…...

必示科技赋能广发证券运维数字化实践案例,入选信通院《中国AIOps现状调查报告(2023)》

近期&#xff0c;“必示科技赋能广发证券运维数字化实践&#xff0c;打造智能运维数据中台”合作案例被中国信息通信研究院作为优秀金融案例项目&#xff0c;收录在最新的《中国AIOps现状调查报告&#xff08;2023&#xff09;》&#xff08;金融行业仅3家&#xff09;。 以必…...

特斯拉Dojo超算:AI训练平台的自动驾驶与通用人工智能之关键

特斯拉公开Dojo超算架构细节&#xff0c;AI训练算力平台成为其自动驾驶与通用人工智能布局的关键一环 在近日举行的Hot Chips 34会议上&#xff0c;特斯拉披露了其自主研发的AI超算Dojo的详细信息。Dojo是一个可定制的超级计算机&#xff0c;从芯片到系统全部由特斯拉自主设计…...

Linux中的一些常用命令

1.查看Linux系统中自带的GLIBC版本 ldd --version2.Linux中删除文件的命令 在Linux中&#xff0c;删除文件的命令是 rm。 使用 rm 命令时&#xff0c;请小心使用&#xff0c;因为它将直接删除文件&#xff0c;而不会将其移动到回收站。 以下是 rm 命令的一些常用选项&#…...

VRTK4⭐二.VRTK4的项目基础配置

文章目录 &#x1f7e5; 硬件基本配置&#x1f7e7; 设置XR Plug-in Management&#x1f7e8; 添加项目Tilia&#x1f7e9; 配置项目Hierarchy &#x1f7e5; 硬件基本配置 解决使用OpenXR,HTC头显正常追踪,但手柄无法使用的问题. 问题如下: 当我们按照官方的标准流程配置完Op…...

word-doc和docx区别

office从业者路过。 文件结构上doc文件数据是以二进制形式存放的。 docx是以xml文件形式存放的。 doc兼容较差&#xff0c;docx效果更好。...

深度学习-偏导数复习

文章目录 前言1.偏导数2.偏导数概念1.对x的偏导数2.对y的偏导数3.多元函数偏导数4.如何计算偏导数1.二元函数的偏导数2.复杂函数的偏导数3.分段函数1.分界点的偏导数 5.偏导数与连续之间的关系6.偏导数的几何意义7.高阶偏导数1.定义2.高阶偏导数例题&#xff08;二阶偏导数&…...

linux之jq命令

jq命令用于linux命令行对json进行处理 参数 option -r&#xff1a;去掉字符串的引号"例子 tt.json文件如下&#xff1a; [{"metric": "httpcode","tags": {"cluster": "tt","domain": "www.baidu.…...

nginx知识点详解:反向代理+负载均衡+动静分离+高可用集群

一、nginx基本概念 1. nginx是什么&#xff0c;做什么事情&#xff1f; Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强。Nginx转为性能优化而开发&#xff0c;能经受高负载考验。支持热部署&#xff0c;启动容易&#xff0c;运…...

powerDesigner 的基本使用

打开powerDesigner 新建 PDM(物理数据模型) 添加表字段 双击表&#xff0c;设置ID自增 选择导出数据库表SQL 导出成功 使用三方工具连接数据库&#xff0c;然后运行对应SQL文件即可 导入SQL文件数据到powerDesigner...

Java下打印一个等腰三角型

想达到这个结果&#xff0c;通常的做法是通过拼结两个三角型达到&#xff0c;但是实际上还有最右边的第三个三角型没有处理&#xff0c;这个拼结的方法总让人看起来有一点不完美的感觉&#xff0c;于是我自创了一个思路&#xff0c;一气合成&#xff0c;代码如下&#xff08;本…...

HR的职业规划

CHRO可以说是HR职业发展的天花板了。CHRO对一个企业来说至关重要&#xff0c;是CEO的左膀右臂。那从CEO的角度来看CHRO&#xff0c;应该具备什么样的素质和能力&#xff0c;又能为公司带来什么样的价值呢&#xff1f; 在公司的不同发展阶段&#xff0c;HR部门有着不同的战略和…...

avi怎么转换成视频?

avi怎么转换成视频&#xff1f;在我们日常使用的视频格式中&#xff0c;AVI是一种常见且经常被使用的音频视频交叉格式之一。它的优点之一是占用的存储空间相对较小&#xff0c;但也明显存在着画质损失的缺点。虽然AVI格式的视频在某种程度上也很常见&#xff0c;但与最常见的M…...

爬虫数据存储:技术、策略与实践(一)

文章目录 &#x1f34b;引言&#x1f34b;xlrd库和xlwt库&#x1f34b;创建Excel文件&#x1f34b;通过Python代码向Excel写入数据&#x1f34b;案例实战 &#x1f34b;引言 本节主要介绍一下在使用网络爬虫技术的时候&#xff0c;如何将数据存储到Excel中去 &#x1f34b;xl…...

【音视频】ffplay解析-音视频同步

音视频同步 主要解析&#xff1a;以音频为基准&#xff0c;让视频合成音频 思路 视频慢了则丢掉部分视频帧&#xff08;视觉->画⾯跳帧&#xff09; 视频快了则继续渲染上⼀帧 具体实现 一个国际标准&#xff1a;音频帧-视频帧时间戳的差值在-100ms~25ms内流畅 1.差值音频…...

虚拟列表 - Vue3实现一个可动态改变高度的虚拟滚动列表

虚拟列表 - Vue3实现一个可动态改变高度的虚拟滚动列表 前言 在开发中经常遇到大量的渲染列表数据问题&#xff0c;往往我们就只是简单地遍历渲染&#xff0c;没有过多地去关注是否会存在性能问题&#xff0c;这导致如果数据量较大的时候&#xff0c;比如上万条数据&#xff…...

PyTorch实战:实现Cifar10彩色图片分类

目录 前言 一、Cifar10数据集 class torch.utils.data.Dataset torch.utils.data.DataLoader 二、定义神经网络 普通神经网络: 定义损失函数和优化器 训练网络-Net CPU训练 模型准确率 ​编辑 GPU训练 训练网络-LeNet 模型准确率 点关注&#xff0c;防走丢&#x…...

Vue模板语法(下)

一.事件处理器 什么是事件处理器 建立一个HTML编写事件处理器 测试结果 二.表单的综合案例 什么是表单综合案例 建立一个HTML来编写表单案例 测试结果 三.局部组件 什么是组件通信 自定义组件 测试结果 组件通信-父传子 测试结果 组件通信-子传父 测试结果 一.事件…...

uniapp掉完接口后刷新当前页面方法

uniapp掉完接口后刷新当前页面方法 掉完接口&#xff0c;里面加下面这个方法uni.redirectTo({}) setTimeout(() > {uni.redirectTo({// 当前页面路由url: /pages/property/mutualrotation/mutualrotation);}, 500)实例 mutualRotationSubmit() {let self this;uni.showMod…...

linux安装redis超级详细教程

redis源码安装 安装gcc redis是C语言编写的&#xff0c;所以我们需要先在Linux上安装和升级&#xff0c;C语言的编译环境。 #安装gcc yum install -y gcc-c autoconf automake#centos7 默认的 gcc 默认是4.8.5,版本小于 5.3 无法编译,需要先安装gcc新版才能编译 gcc -v#升级…...

2023-09-20 事业-代号z-个人品牌-数据库内核专家-分析

摘要: 在个人品牌层面, 必然脱离不开技术本身, 而身为数据库内核专家, 让别人尽快感知到我的专家身份至关重要. 本文从过去的经历中分析和思考, 如何尽快以技术专家的身份被感知. 过去所见过的高管的技术特点: 不在一线处理具体的事情技术理论深厚, 广度非常厉害, 知道很多相…...

UVA-1343 旋转游戏 题解答案代码 算法竞赛入门经典第二版

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 题目其实不难&#xff0c;但是耗费了我较多时间。 这种题关键就是在于找到约束条件&#xff0c;我在DFS的基础上&#xff0c;试了很多种策略&#xff1a; 1. 对3种数字&#xff0c;每种数字…...

【运维篇】二、配置文件与多环境控制

文章目录 1、临时属性2、IDEA中的临时属性3、配置文件4级分类4、关于四级分类的思考5、自定义配置文件6、多环境开发&#xff08;yaml版&#xff09;7、配置文件按环境分类8、include与group再细粒度9、一点思考10、多环境开发兼容问题 1、临时属性 jar包或者镜像已经打完了&a…...

wordpress新闻视频站/站长工具中文

原标题&#xff1a;MYSQL数据损坏修复方法1、myisamchk使用 myisamchk 必须暂时停止 MySQL 服务器。例如&#xff0c;我们要检修 discuz 数据库。执行以下操作&#xff1a;# service mysql stop (停止 MySQL )&#xff1b;# myisamchk -r /数据库文件的绝对路径/*MYI# service …...

微网站 功能/上海百度推广方案

八周二次课&#xff08;1月30日&#xff09;10.28 rsync工具介绍rsync -av /etc/passwd /tmp/1.txt 把passwdcp到tmp下并命名为1.txtrsync -av /etc/passwd root192.168.133.130:/tmp/1.txt cp到130的root的tmp目录SRC 源目录 DEST 目标目录 [user]host: DEST user可以省略&a…...

通过做政府门户网站的实验获得什么/手机百度登录入口

1、首先进入mysql的安装目录下的bin目录&#xff0c;例如我的是【C:\WINDOWS\System32\cmd.exe】2、接着输入cmd&#xff0c;回车3、在命令行中输入命令【mysql -hlocalhost -uroot -p 按回车键&#xff0c;输入密码】&#xff0c;其中【-h主机名 -u用户 -p密码】 4、成功进入界…...

wordpress官网中文版下载/专业网页设计和网站制作公司

微服务的概念源于2014年3月Martin Fowler(马丁福勒)所写的一篇文章“Mieroservices”(微服务)。文中表达了一种观念&#xff0c;微服务架构是一种架构模式&#xff0c;它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间互相协调、互相配合&#xff0c;为用户提供最终…...

做商城网站需要什么条件/发广告平台有哪些

简介curl 是常用的命令行工具&#xff0c;用来请求 Web 服务器。它的名字就是客户端&#xff08;client&#xff09;的 URL 工具的意思。它的功能非常强大&#xff0c;命令行参数多达几十种。如果熟练的话&#xff0c;完全可以取代 Postman 这一类的图形界面工具。本文介绍它的…...

58同城网络营销/长春做网络优化的公司

1、安装python库&#xff0c;用到读取csv的库pandas&#xff0c;获取IP经度和纬度的库pygeoippip install pandaspip install pygeoip2、下载GeoIP库3、读取ip&#xff0c;转化为point.js文件&#xff0c;源码如下&#xff1a;#!/usr/bin/pythonimport pandas as pdimport pyge…...