
C/C++
文章平均质量分 74
Bug.Remove()
海阔凭鱼跃,天高任鸟飞~
展开
-
自定义map的key类型---C++
从源码的角度剖析map的底层key的实现,并分别分析了基础类型key,复合类型key的使用方式。最后,分析了自定义key类型的实现,并且给出了两种实现自定义key类型的方法。原创 2022-09-29 17:30:31 · 3358 阅读 · 0 评论 -
unordered_map自定义key类型-C++
深入理解unordered_map自定义key类型,从源码的角度分析实现自定义key原创 2022-09-27 22:06:43 · 2536 阅读 · 0 评论 -
C++标准模板库之——sort函数
C++ sort函数,小白请进,有帮助的哦~原创 2022-01-12 23:11:45 · 1034 阅读 · 0 评论 -
基数排序-------C语言实现
基数排序核心思想:根据数字的位(个位、十位、百位…)来进行的排序算法,有点类似于哈希表,基数排序首先应该找到数字中最大的数,然后算出这个数有几位,其次依次根据个位、十位、百位、千位、…、最大位来进行排序平均时间复杂度:O( n*k)k:为最大的位数空间复杂度:O(m+n)空间复杂度我们也可以看出来,主要就是取决于链表的数量以及序列元素的数量,所以空间复杂度为O(n+k)稳定性:稳定适用场合:数组量大且较无序排序名称最好时间复杂度平均时间复杂度最坏时间复杂度空间复杂度稳定性适用原创 2021-06-29 11:39:53 · 1719 阅读 · 0 评论 -
堆排序---C语言实现
堆排序核心思想:利用了完全二叉树的思想(一个有n个结点的完全二叉树,其父结点 i 的范围为:0~n2\frac{n}{2}2n - 1 左孩子:2*i+1 右孩子:2*i+2),即有大堆:所有的父节点的值均大于孩子的值,最终建堆后堆顶则为最大值小堆:所有的父节点的值均小于孩子的值,最终建堆后堆顶则为最小值此例中基于大堆实现实现过程:我们将来的数组视为一颗完全二叉树,如下图所示:根据大堆的特点,我们首先应该建堆,而建堆的顺序则是由下往上,因此,我们先从最底层开始,由于父节点的范围是 0~n2\f原创 2021-06-22 11:06:17 · 206 阅读 · 0 评论 -
归并排序算法详解---C语言实现
归并排序前备知识:如果数组中只有一个数,那么这个数组一定是有序的!核心思想:将两个有序的数组合并为一个有序的数组(运用了分组的思想:递归)实现过程:对于如下数组进行归并排序,过程如下:如上所示,由于归并排序是将两个有序的数组合并为一个有序的数组,因此我们首先是对上述数组进行拆分,数组长度为nLen = 9,因此将数组均分为nLen/2 = 4,拆分后如下图所示:如上图所示,经过一次折半将数组拆分为了两个数组,由于归并排序的思想是将两个有序的数组进行合并,因此我们需要继续对数组进行拆分,拆分后如下原创 2021-06-21 21:47:09 · 1220 阅读 · 0 评论 -
插入排序与希尔排序---C语言实现
插入排序核心思想:设置一个变量来记录当前插入位置的值,如果前一个位置大于该值则将前一个位置的值移入该位置,然后继续与前面元素的值比较,直至该值大于前一个值或者移动到最开头位置,插入该值。实现方式例:对如上数组arr进行由小到大排序(注:一个元素肯定有序,插入元素之前一定是一个有序序列)注:这里橙色箭头仅表示此时要插入的位置,蓝色箭头表示与插入的值比较的位置首先,我们应该定义一个变量来标记一下即将要插入的值:nValue = arr[1];然后,数组从下标为1的位置开始与前面的元素进行比较,如果此原创 2021-06-20 20:21:08 · 328 阅读 · 0 评论 -
快速排序详解---C语言实现
5 快速排序核心思想:初始时选择一个标志位(一般是第一个),让其余各位的值与该标志位的值相比较,刚开始从数组尾部开始选择小于该标志位的值放于前面,然后再从前面选择大于该标志位的值放于后面,如此循环,最终可以将数组以该标志位分为两部分,而后在对前后两部分循环操作。实现过程(改进前):快速排序通俗点讲就是挖坑填补法,取一个值来将数组分成两部分,左侧都比所取标志的值小,右侧都比所取的标志值大,具体看下;初始时,取数组的第一个元素为坑(分组标志),设置一个变量标记它,有int nValue = arr[0];原创 2021-06-20 20:18:21 · 265 阅读 · 0 评论 -
冒泡、选择排序算法——C语言实现
八大排序算法------C语言目录1.冒泡排序例:对数arr[] = {3,7,6,8,0,4,56,78,45}这个数组进行从小到大排序,设数组的长度为nLen(这里nLen = 9)1.冒泡排序核心思想:相邻两个元素之间相比,如果前者比后者大,则交换两个值(基于交换)。排序过程:初始时:3与7相比—>3小于7—>不做交换,继续进行下一次比较—>7与6相比—>7大于6—>交换7与6的值···—>最终,第一次循环找到最大值78放到最后,此时第一次循环结束。原创 2021-06-06 22:18:18 · 346 阅读 · 0 评论 -
栈——C语言实现
栈的定义:栈是一种先进后出的数据结构,即先入栈的最后出栈。因此,对于一个顺序存储结构栈,只允许头添加,尾删除原创 2021-04-27 10:21:05 · 229 阅读 · 0 评论 -
链表——C语言实现
定义:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O原创 2021-04-27 10:06:29 · 176 阅读 · 0 评论 -
多线程————线程池
线程池:线程池通俗点来讲就是有多个线程组成的集合,线程池内的线程在不使用时不会销毁,而是出于等待状态,当来任务时被唤醒执行任务。为什么要使用线程池?使用线程池的目的就是提高代码的性能,因为频繁的创建和销毁线程会占用较多的时间,影响效率。因此,通过使用线程池,可以节省线程创建和销毁所需的时间,提高程序的执行效率。对于一个线程池而言,其需要一个创建线程池的函数:CreateThreadPool();需要一个销毁线程池的函数:DestroyThreadPool();需要一个线程函数,让每一个线程在线程函数原创 2021-04-06 17:38:22 · 135 阅读 · 0 评论 -
内核对象——互斥量、事件、信号量
互斥量(互斥锁):在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。互斥量:更安全和灵活关键段:效率更高(因为关键段在用户模式下)创建互斥量:m_hMutx = CreateMutex(0,0,0);CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);lpMutex原创 2021-04-04 21:23:54 · 345 阅读 · 0 评论 -
线程同步——多线程
线程同步:解决线程并发的问题原子访问:同一时刻只允许一个线程访问资源(变量),volatile防止编译优化,对特殊地址进行稳定的访问InterlockedDecrement();(递减操作)关键段(临界区):同一时刻只允许一个线程访问一个代码段创建一个关键段变量:CRITICAL_SECTION cs;//关键段构造函数中初始化:InitializeCriticalSection(&cs);退出时删除关键段变量:DeleteCriticalSection(&cs);线程创建、退出原创 2021-04-03 22:28:06 · 135 阅读 · 0 评论 -
进制转换和类型边界值
前言:首先我们应该知道,一个字节由八个二进制数组成规则:1.sizeof(short int)<=sizeof(int)2.sizeof(int)<=sizeof(long int)3.short int 至少应为16位(2个字节)4.long int 至少应为32位(4个字节)32位环境char : 1个字节 -128~127unsigned char : 1个字节 0~255char * :4个字节short int: 2个字节原创 2021-04-03 10:43:45 · 675 阅读 · 0 评论 -
计算机网络----------客户端代码实现(TCP/IP)
如果想了解服务器相关代码信息,请点击此连接客户端上一章我们讲了服务强相关代码实现,这次我们看一下客户端的代码实现,客户端代码和服务器差不多,这里我们把客户端比作是客人1.客人想去饭店吃饭,要选择吃什么(加载库:WSAStartUp())2.选择好吃什么后,饭店要知道是谁来的,(创建套接字:socket())3.客人进饭店后,坐下用餐(与服务器连接:connect())4.客人点餐(发送数据:send())5.客人等待餐厅回复(接收数据:recv())6.吃完饭去别处浪(关闭套接字:close原创 2021-03-28 09:46:26 · 317 阅读 · 0 评论 -
计算机网络-------------服务器代码实现(TCP/IP协议)
服务器我们把服务器比作是餐厅,那么我们要开一个餐厅,应该要做如下几步:1.选择要开什么店(火锅店、KFC、烧烤…),(加载库:WSAStartUp())2.地方找好了,那么我们就需要找个店长,帮我们看店(创建套接字:socket())3.店长找好了,接下来我们需要让这个店长在店里工作,(绑定:bind())4…一切准备工作完成之后,我们就需要接待客人了,观察是否来客人了(监听:listen())5.来客人时,我们需要接待客人(接收连接:accept())6.安排客人坐下后,我们就需要让客人点餐原创 2021-03-28 09:28:33 · 542 阅读 · 0 评论 -
指针与数组-----------指针类型定义
前言:对于指针:定义指针时,要明确指针的类型和指针指向的类型。指针的类型:直接去掉变量名,剩下的就是指针的类型。指针指向的类型:去掉变量名后,在去掉一个 ,对于数组:同理,定义一个指针指向一个数组时,首先应该明确数组类型及数组元素的类型。数组的类型:直接去掉数组名,剩下的就是数组的类型数组元素的类型:去掉数组名后,再去掉一个方括号[ ],剩下的就是数组元素的类型。*例:int arr[2][3][5];定义指针指向该数组,该如何定义对于多维数组而言,其本质就是数组的元素也是数组(俄罗斯套娃儿原创 2021-03-25 19:12:25 · 346 阅读 · 0 评论 -
C语言指针浅析(二)(指针与数组)
一、指针和数组指针提供一种以符号形式使用地址的方法。因为计算机的硬件指令非常依赖地址,指针在某种程度上把程序员想要传达的指令以更接近机器的方式表达。因此,使用指针会使程序更有效率。尤其是,指针能够有效地处理数组。(阅读本博客需要有一定的数组知识)我们知道,数组名代表数组首元素的地址,即如果我们定义一个数组:int arr[10];//定义一个有10个元素的整形数组由于数组名代表数组首元素的地址,那么就有:arr==&arr[0];注意:两者都是常量,在程序运行的过程中,值不会改变,常量只原创 2021-03-08 11:33:03 · 298 阅读 · 0 评论