结构体熟练掌握--实现通讯录

- 魔王的介绍:😶🌫️一名双非本科大一小白。
- 魔王的目标:🤯努力赶上周围卷王的脚步。
- 魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥
❤️🔥大魔王与你分享:无人问津也好,技不如人也罢,你都要是安静下来去做自己该做的事,而不是让内心烦躁、焦虑,毁掉你本就不多的热情和定力。
文章目录
- 一、前言
- 二、介绍
- 三、分布实现通讯录
- 1.在test.c文件中创建基本格式
- 2.创建结构体类型
- 3.初始化通讯录
- 4.实现AddContact函数
- 5.实现ShowContact函数
- 6.实现FindContact函数
- 7.实现DelContact函数
- 8.实现SearchContact函数
- 9.实现ModifyContact函数
- 10.实现SortContact函数
- 四、总代码
- contact.h
- contact.c
- test.c
- 五、总结
一、前言
学习完结构体,我们一定会好奇它的应用场景,想要熟练掌握一个知识点,就必须让其在现实生活中熟练结合,本篇将通过结构体的灵活运用去实现简单通讯录,可以实现增加删除搜索修改展示排序六大功能。
二、介绍
test.c:测试文件
contact.h:头文件(只进行声明)
contact.c:源文件,进行函数的定义
我们会在contact.h头文件中进行声明,在contact.c源文件中进行定义,然后在test.c源文件中进行测试(也就是直接运用这些函数)。
除了头文件外,另外两个文件都要包含头文件,因为是头文件进行的声明,可以理解为另外两个文件都要用的东西我们会在头文件进行声明,之后只需要在另外两个文件中包含头文件便都可以使用了。
三、分布实现通讯录
1.在test.c文件中创建基本格式
#include "contact.h"void menu()
{printf("**** 1.add 2.del ****\n");printf("**** 3.search 4.modify ****\n");printf("**** 5.show 6.sort ****\n");printf("**** 0.exit ****\n");
}int main()
{int input = 0;do{menu();printf("请选择:> ");scanf("%d", &input);switch (input){case 1://AddContact(&con);break;case 2://DelContact(&con);break;case 3://SearchContact(&con);break;case 4://ModifyContact(&con);break;case 5://ShowContact(&con);break;case 6://SortContact(&con);break;case 0:printf("退出");break;default:printf("输入错误,请重新输入");}} while (input);return 0;
}
我们这时候就可以运行了,虽然什么都没有,不过程序是正确的。
2.创建结构体类型
我们会创建两个结构体类型,一个是存放数据的结构体类型,里面放的是一个用户的基本信息,另一个是我们直接应用的结构体,里面会有两个成员,第一个成员为上个结构体数组,因为我们的通讯录肯定不是只有一个人的信息,第二个成员为结构体数组中的成员个数。
#define NameMax 10
#define SexMax 5
#define AddrMax 10
#define TeleMax 11//定义一个可以存放一个人数据的结构体类型
typedef struct PeoInfo
{char name[NameMax];int age;char sex[SexMax];char addr[AddrMax];char tele[TeleMax];
}PeoInfo;//定义一个我们可以存放多人数据并进行判断和修改的结构体类型
typedef struct Contact
{PeoInfo date[100];int sz;
}Contact;
- 解释:
- 我们进行define定义常量是为了以后方便修改,当我们发现某个不合适时,只需要在头文件中修改一下就可以了,也就是方便代码的维护。
- 两个结构体都进行重命名是为了在之后应用这个结构体时不再去写struct,比较方便。
- 因为不止一个文件要用到结构体,所以创建结构体在头文件进行。
3.初始化通讯录
void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->date, 0, sizeof(pc->date));
}
- 解释:
- 我们首先在测试文件的主函数内部用定义过的结构体创建
- 我们在测试时需要创建一个通讯录,创建的时候我们可以直接初始化为0,也可以像这样在创建完成后让通讯录中的值改为我们需要的(还是0,这种方法更好一些,因为可以改为别的值,而不是只能是0)。
- 我们这里用到了memset函数,对应的头文件是<string.h>,这个函数的作用就是让从给定地址开始前多少字节的内容都赋上一个特定的数值。
4.实现AddContact函数
void AddContact(Contact* pc)
{assert(pc);if (pc->sz == 100){printf("人数已满\n");return;}printf("请输入要添加联系人姓名:> ");scanf("%s", pc->date[pc->sz].name);printf("请输入要添加联系人年龄:> ");scanf("%d", &(pc->date[pc->sz].age));printf("请输入要添加联系人性别:> ");scanf("%s", pc->date[pc->sz].sex );printf("请输入要添加联系人地址:> ");scanf("%s", pc->date[pc->sz].addr);printf("请输入要添加联系人电话:> ");scanf("%s", pc->date[pc->sz].tele);pc->sz++;printf("添加成功\n");
}
- 解释:
- 首先判断是否满了(也就是我们规定的100人),如果没满,那么就执行后面的添加,如果满了,就退出函数。
- 为什么只有第二个加取地址呢,因为其他的都是结构体信息(PeoInfo)里不同类型的首元素地址(因为是数组,所以数组名表示首元素地址),而age的类型为int,表示的不是地址,所以需要取地址符。
- 每次添加一个人,结构体成员sz需要加1。
5.实现ShowContact函数
void ShowContact(const Contact* pc)
{assert(pc);printf("%-10s\t%-3s\t%-5s\t%-10s\t%-11s\n", "姓名", "年龄", "性别", "地址", "电话");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n", pc->date[i].name,pc->date[i].age,pc->date[i].sex,pc->date[i].addr,pc->date[i].tele);}
}
- 解释:
- \t为水平制表符,也就是会空出来一段距离。
- 展示函数会从结构体数组的零下标开始逐个打印出全部人的信息。
6.实现FindContact函数
int FindContact(Contact* pc, char* arr)
{int i = 0;for (i = 0; i < pc->sz; i++){int ret = strcmp(arr, pc->date[i].name);if (ret == 0)return i;//找到的话返回结构体的下标}return -1;
}
这个函数并不是六种功能的哪一个,我们之所以要专门分装出这么一个函数,是因为多个功能都需要用到这个函数,所以为了方便其他函数使用,我们把这个部分写成一个函数分离出来。
7.实现DelContact函数
void DelContact(Contact* pc)
{assert(pc);if (pc->sz==0){printf("通讯录中没有信息\n");return;}printf("输入要删除人的姓名:>");char arr[10] = "0";scanf("%s", arr);int ret = FindContact(pc,arr);if (ret== -1){printf("该姓名不存在\n");return;}int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->date[i] = pc->date[i + 1];}pc->sz--;printf("删除成功\n");
}
- 解释:
- 首先判断是否有成员,如果没有成员,就直接退出函数。
- 如果确实存在该成员,该成员的结构体下标会通过FindContact函数返回给ret,然后ret里存放的值就是该结构体数组中对应的下标。
- 如果确实存在该成员,我们删除的思路就是从被删除这个结构体下标开始,每个后面的覆盖前面的,最后个数sz再减1。
8.实现SearchContact函数
void SearchContact(const Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通讯录中没有信息\n");return;}printf("输入要查找人的姓名:>");char arr[10] = "0";scanf("%s", arr);int ret = FindContact(pc, arr);if (ret == -1){printf("该姓名不存在\n");return;}printf("%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n", pc->date[ret].name,pc->date[ret].age,pc->date[ret].sex,pc->date[ret].addr,pc->date[ret].tele);
}
首先判断是否含有信息,如果没有退出函数。
然后如果有这个人的信息,那个其对应的结构体下标已经通过FindContact函数返回给了ret,我们把该姓名的信息打印出来。
9.实现ModifyContact函数
如果不存在就退出,如果存在,我们将这个人的信息打印出来。
void ModifyContact(Contact* pc)
{assert(pc);if (pc->sz==0){printf("通讯录中没有信息\n");return;}char arr[10] = "0";printf("请输入要修改人的名字:> ");scanf("%s", arr);int ret = FindContact(pc,arr);if (ret == -1){printf("该联系人不存在\n");return;}printf("请输入要修改成的姓名:> ");scanf("%s", pc->date[ret].name);printf("请输入要修改成的年龄:> ");scanf("%d", &(pc->date[ret].age));printf("请输入要修改成的性别:> ");scanf("%s", pc->date[ret].sex);printf("请输入要修改成的地址:> ");scanf("%s", pc->date[ret].addr);printf("请输入要修改成的电话:> ");scanf("%s", pc->date[ret].tele);printf("修改成功\n");return;
}
这个的原理就是把找到的那个人对应的结构体下标返回给ret,然后让该下标的结构体成员重新赋一次值。
10.实现SortContact函数
int cmp(const void* e1, const void* e2)
{assert(e1 && e2);//return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}void SortContact(Contact* pc)
{assert(pc);qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp);}
- 注意:
qsort第二个参数不是传数组能放多少元素,而是放了多少元素,因为如果没使用的位置也算进去,它会将它们这些没放的元素也参加排序。
四、总代码
contact.h
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>#define NameMax 10
#define SexMax 5
#define AddrMax 10
#define TeleMax 11//定义一个可以存放一个人数据的结构体类型
typedef struct PeoInfo
{char name[NameMax];int age;char sex[SexMax];char addr[AddrMax];char tele[TeleMax];
}PeoInfo;//定义一个我们可以存放多人数据并进行判断和修改的结构体类型
typedef struct Contact
{PeoInfo date[100];int sz;
}Contact;//初始化通讯录
void InitContact(Contact* pc);//添加联系人
void AddContact(Contact* pc);//展示添加上的联系人
void ShowContact(const Contact* pc);//删除联系人
void DeleContact(Contact* pc);//查找联系人
void SearchContact(const Contact* pc);//修改联系人
void ModifyContact(Contact* pc);//按名字大小排序
void SortContact(Contact* pc);
contact.c
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->date, 0, sizeof(pc->date));
}void AddContact(Contact* pc)
{assert(pc);if (pc->sz == 100){printf("人数已满\n");return;}printf("请输入要添加联系人姓名:> ");scanf("%s", pc->date[pc->sz].name);printf("请输入要添加联系人年龄:> ");scanf("%d", &(pc->date[pc->sz].age));printf("请输入要添加联系人性别:> ");scanf("%s", pc->date[pc->sz].sex );printf("请输入要添加联系人地址:> ");scanf("%s", pc->date[pc->sz].addr);printf("请输入要添加联系人电话:> ");scanf("%s", pc->date[pc->sz].tele);pc->sz++;printf("添加成功\n");
}void ShowContact(const Contact* pc)
{assert(pc);printf("%-10s\t%-3s\t%-5s\t%-10s\t%-11s\n", "姓名", "年龄", "性别", "地址", "电话");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n", pc->date[i].name,pc->date[i].age,pc->date[i].sex,pc->date[i].addr,pc->date[i].tele);}
}
int FindContact(Contact* pc, char* arr)
{int i = 0;for (i = 0; i < pc->sz; i++){int ret = strcmp(arr, pc->date[i].name);if (ret == 0)return i;//找到的话返回结构体的下标}return -1;}void DelContact(Contact* pc)
{assert(pc);if (pc->sz==0){printf("通讯录中没有信息\n");return;}printf("输入要删除人的姓名:>");char arr[10] = "0";scanf("%s", arr);int ret = FindContact(pc,arr);if (ret== -1){printf("该姓名不存在\n");return;}int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->date[i] = pc->date[i + 1];}pc->sz--;printf("删除成功\n");
}void SearchContact(const Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通讯录中没有信息\n");return;}printf("输入要查找人的姓名:>");char arr[10] = "0";scanf("%s", arr);int ret = FindContact(pc, arr);if (ret == -1){printf("该姓名不存在\n");return;}printf("%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n", pc->date[ret].name,pc->date[ret].age,pc->date[ret].sex,pc->date[ret].addr,pc->date[ret].tele);
}void ModifyContact(Contact* pc)
{assert(pc);if (pc->sz==0){printf("通讯录中没有信息\n");return;}char arr[10] = "0";printf("请输入要修改人的名字:> ");scanf("%s", arr);int ret = FindContact(pc,arr);if (ret == -1){printf("该联系人不存在\n");return;}printf("请输入要修改成的姓名:> ");scanf("%s", pc->date[ret].name);printf("请输入要修改成的年龄:> ");scanf("%d", &(pc->date[ret].age));printf("请输入要修改成的性别:> ");scanf("%s", pc->date[ret].sex);printf("请输入要修改成的地址:> ");scanf("%s", pc->date[ret].addr);printf("请输入要修改成的电话:> ");scanf("%s", pc->date[ret].tele);printf("修改成功\n");return;
}int cmp(const void* e1, const void* e2)
{assert(e1 && e2);//return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}void SortContact(Contact* pc)
{assert(pc);qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp);//qsort第二个参数不是传数组能放多少元素,而是放了多少元素,因为如果没使用的位置也算进去,它会将它们这些没放的元素也参加排序
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void menu()
{printf("**** 1.add 2.del ****\n");printf("**** 3.search 4.modify ****\n");printf("**** 5.show 6.sort ****\n");printf("**** 0.exit ****\n");
}int main()
{//创建通讯录Contact con;//初始化通讯录InitContact(&con);int input = 0;do{menu();printf("请选择:> ");scanf("%d", &input);switch (input){case 1:AddContact(&con);break;case 2:DelContact(&con);break;case 3:SearchContact(&con);break;case 4:ModifyContact(&con);break;case 5:ShowContact(&con);break;case 6:SortContact(&con);break;case 0:printf("退出");break;default:printf("输入错误,请重新输入");}} while (input);return 0;
}
五、总结

💘原创不易,还希望各位佬佬支持一下\textcolor{colourful}{💘原创不易,还希望各位佬佬支持一下}💘原创不易,还希望各位佬佬支持一下
💓点赞,你的认可是我创作的动力!\textcolor{red}{💓点赞,你的认可是我创作的动力!}💓点赞,你的认可是我创作的动力!
💕收藏,你的青睐是我努力的方向!\textcolor{orange}{💕收藏,你的青睐是我努力的方向!}💕收藏,你的青睐是我努力的方向!
💞评论,你的意见是我进步的财富!\textcolor{aqua}{💞评论,你的意见是我进步的财富!}💞评论,你的意见是我进步的财富!
✨请点击下面进入主页关注大魔王
如果感觉对你有用的话,就点我进入主页关注我吧!
相关文章:
结构体熟练掌握--实现通讯录
魔王的介绍:😶🌫️一名双非本科大一小白。魔王的目标:🤯努力赶上周围卷王的脚步。魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥 ❤️…...
腾讯云CVM服务器购买流程手把手方法教程攻略
购买腾讯云服务器有两种方式。一种是在官方活动中,简单方便,但ECS配置相对固定;另一种是在ECS页面定制购买。配置选项丰富,但地理可用性区域、计费模式、CPU内存实例规格、映像系统、存储系统磁盘、网络带宽和安全组的选择更为复…...
九龙证券|“春季躁动”行情要来?1月新增投资者数大增
新增投资者数量在上一年12月触及多年新低后,2023年1月份开端呈现反弹。 在新增投资者数量之外,近段时刻以来,包含A股商场股票成交额、北向资金净买入额、两融资金规划及成交额在内多个商场目标也呈现回暖的特征,目前A股商场交投氛…...
C语言(按位运算符和位移运算符)
目录 编辑 一.按位运算符 1.二进制反码或按位取反:~ 2.按位与:& 3.按位或:| 4.按位异或:^ 二.位移运算符 1.左移: << 2.右移: >> 一.按位运算符 C有四个按位逻辑运算符都用于整…...
删掉的照片怎么恢复?
每一张照片都是生活,留住每一个人的回忆。而这些有意义的照片,我们都会把它保存在我们的手机或电脑上,始终伴随着我们。但无论是手机还是电脑,都是需要时不时清理一下的。如果是清理垃圾图片时,不小心删除了需要的图片…...
【java】40 个 SpringBoot 常用注解(建议收藏)
本文目录一、Spring Web MVC 注解Spring Web MVC 注解RequestMappingRequestBodyGetMappingPostMappingPutMappingDeleteMappingPatchMappingControllerAdviceResponseBodyExceptionHandlerResponseStatusPathVariableRequestParamControllerRestControllerModelAttributeCross…...
【JMC】SMILES‑based deep generative scafold decorator for de‑novo drug design
SMILES-based deep generative scaffold decorator for de-novo drug design 基于SMILES的利用Fragment的分子生成模型 https://github.com/undeadpixel/reinvent-scaffold-decorator 1.背景 深度生成模型因其可以从有限的数量中生成新数据,目前已成功应用于生成…...
全链路异步,让你的 SpringCloud 性能优化10倍+
背景 随着业务的发展,微服务应用的流量越来越大,使用到的资源也越来越多。 在微服务架构下,大量的应用都是 SpringCloud 分布式架构,这种架构,总体是全链路同步模式。 同步编程模式不仅造成了资源的极大浪费&#x…...
131.《router v 5 与 react-router v 6》
文章目录1.什么是路由2.路由分类3.react-router-dom的理解4. react-router-dom相关API5.其他6. react-router5 路由基本使用1.效果2.代码App.js一级路由home.js下的二级路由7.路由传参的三种方式8.react-router6 基本使用1.一级路由2.二级路由3.hooksuseRoutesuseParamsuseSear…...
2023第十届北京老年产业博览会/中国养老护理人才培育计划
CBIAIE北京老博会,打造2023年度唯具参展价值的老年行业盛会; 北京老博会:2011年,我国首场以“老年产业”为主题,一场专注于老年福祉、健康的国际型行业发展盛会,中国(北京)国际老年…...
STM32F407VET6 / BLACK_F407VE开发板间隔0.5秒不断重启
有一块 STM32F407VET6 的故障开发板, 之前的问题是经常无法烧录, 必须reset之后才能连接, 具体查看这篇 STM32F407VET6烧录出现flash download failed target dll has been cancelled. 并且程序运行一段时间后会halt. 这块开发板后来一直搁箱底吃灰了几年. 最近打算把这片 STM…...
什么是圈复杂度
圈复杂度是一种软件度量指标,用于度量程序中的控制流程的复杂性。它是通过计算程序中独立路径的数量来确定的。简单来说,圈复杂度是指在一个函数或模块中有多少个独立的路径,也就是说,有多少个不同的输入序列可以导致不同的执行路…...
Hbase 数据迁移
Hbase 数据迁移 可选方案对比 l 已验证方案操作说明: n Export&import u 导出命令及示例 hbase org.apache.hadoop.hbase.mapreduce.Export “表名” 文件路径 导出至本地文件系统: ./bin/hbase org.apache.hadoop.hbase.mapreduce.Export ‘defa…...
Docker consul的容器服务更新与发现
一、Consul概述(1)什么是服务注册与发现服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分…...
数据库关系模型
关系模型简述 形象地说,一个关系就是一个table。 关系模型就是处理table的,它由三个部分组成: 描述DB各种数据的基本结构形式;描述table与table之间所可能发生的各种操作;描述这些操作所应遵循的约束条件࿱…...
你是真的“C”——详解指针知识
你是真的“C”——详解指针知识😎前言🙌1、 指针是什么?🙌2、指针和指针类型🙌2 、1指针-整数2 、 2指针的解引用3、 野指针🙌3、 1野指针成因3、 2如何规避野指针4、指针运算🙌4、1 指针-整数4…...
React/ReactNative面试攻略(偏RN)
useMemo Vs useCallBackuseMemo第一个参数返回的是值,useCallBack返回的是函数useMemo和useCallBack第二个参数都是依赖项useMemo避免组件非依赖项更新时参数的计算useCallback避免父组件非依赖项更新时造成子组件的重复渲染React.memo 使用场景纯prue组件ÿ…...
Leetcode-每日一题1234. 替换子串得到平衡字符串(滑动窗口 + 哈希表)
题目链接:https://leetcode.cn/problems/replace-the-substring-for-balanced-string/description/ 思路 题目意思 这题意思是一个只含有[Q, W, E, R] 四个字符的字符串s且长度一定是 4的倍数, 需要你通过替换子串,使他变成一个「平衡字符…...
linux命令小结-查看日志命令
一、查看日志命令cat查看文件 vi编辑后可以用cat进行查看保存是否成功1)cat -n alert_monitor.log2)cat -n alert_monitor.log | tail -n 100 | head -n 20 //查询100行之后的日志,且在100行之后里再查前20条日志more 可以通过回撤键翻页mor…...
Java知识点细节简易汇总——(8)枚举和注解+Java面向对象高级作业
一、枚举 自定义枚举 当我们使用 enum 关键字开发一个枚举类时,默认会继承 Enum 类, 而且是一个 final 类[如何证明],老师使用 javap 工具来演示传统的 public static final Season2 SPRING new Season2(“春天”, “温暖”); 简化成 SPRING(“春天”, “温暖”)…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
C++11 constexpr和字面类型:从入门到精通
文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...

