- 博客(21)
- 收藏
- 关注
原创 C++:STL——vector
再对对象进行拷贝时,由于vector的每一个元素是自定义类型,就会导致拷贝的时候要调用string的拷贝构造函数,而这个函数在这个类中是没有的,只好调用默认拷贝构造函数进行浅拷贝,这就导致新空间和原空间中的对象指向同一块空间。这里的逻辑是插入300时发生扩容,内部pos会被新pos取代,但是因为是传值传参,外部的pos不发生改变(指向的是内部函数扩容前的空间),然后在外部对p进行+=10的操作实际上是对旧空间中的pos的位置进行操作的,这样的操作肯定是错误的。返回的是一个指针,需要接收。
2025-04-06 19:07:05
934
原创 双指针4:盛最多水的容器
我们先看[6,2,5,4]这个例子,我们先比较6和5,算出v1。如果我们改6为2,就是宽度下降,高度也下降,下一个体积肯定小于v1;每次用left与right算出v,去和前一个v比较,选择arr[ ]小的那个进行移动(left++,right--)定义left指向0,rignt指向n-1。套两层for循环,找出最大值,搞定。(1)法一:暴力枚举。
2025-03-29 21:43:20
132
原创 双指针3:快乐数
进入循环:实际上是通过题目中的各位平方和计算,得出了一个先前计算在出现的数,从而产生 循环。(像是判断链表是否有环一样)得1:实际上就是长度为1的循环。
2025-03-29 20:42:19
170
原创 双指针2:复写0
初始时,cur=0,dest=-1,当cur指向的数不是0,dest++,检查dest是否到达最后一个位置(以下称越界),cur++,;起始:先找到最后一个复写的数,dest指向n-1,cur指向最后一个要复写的数,当cur指向的数不是0,就cur--,dest--;2.cur从后往前遍历,dest从后往前覆盖,当cur指向的数不是0,a[dest]=a[cur],cur--,dest--;当cur指向的数是0,a[dest=0],a[dest-1]=0,dest-=2,cur--;
2025-03-29 20:33:11
286
原创 双指针1:移动0(数组分块)
若不为0,dest++,swap(cur,dest),cur++总体思想是将一些元素分为两部分,这和快排中把元素分为大于key和小于key的两部分一样。非0 0 待处理。cur:从前往后遍历数组元素(将数组分为已处理区域和未处理区域)dest:指向已处理区间内最后一个非0元素的位置。利用双指针(dest与cur)起始:dest指向-1,cur指向0。结束:当cur遍历到n处时结束。经过:cur从0到n-1遍历。
2025-03-27 21:06:48
125
原创 C++:STL——string
但实际情况下它开的空间会大于等于100,不会小于100,且与capacity一样在windows与Linux操作系统下二者的开辟的空间也是是不一样的。resize看既开空间又填值,会改变size。找到就返回第一次找到的位置的下标,找不到就返回npos(-1),计算方法是从字符串的最前方开始算,而不是从开始找的位置开始算。capacity返回的是已经开的空间大小(联系顺序表的capacity与size的关系)它提供了一种统一的方式访问和修改容器的数据(含有迭代器的容器迭代器的使用方法是一样的)
2025-03-26 20:20:39
929
原创 C++模板入门
2.对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数,那么将选择模板。可以看到,两个swap调用的不是同一个函数,我们使用函数时调用的不是模板,而是编译器用这个模板生成的函数。1.一个非模板函数可以和一一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。注意:typename是用来定义模板参数的关键字,也可以用class(不能用struct)(3)函数模板实例化。(4)模板参数匹配原则。
2025-02-12 17:18:25
232
原创 C/C++内存管理
如果申请的是内置类型的空间,new和malHoc, delete和free基本类似,不同的地方是: new/delete申请和释放的是单个元素的空间,newQ和delete申请的是连续空间, 而且new在申请空间失败时会抛异常,malloc会返回NULL.7.申请自定义类型对象时,malloc/free只会开辟空间, 不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。使用场景:定位new表达式应该配合内存池使用。
2025-02-12 13:44:35
776
原创 类和对象(C++)
所以,对于自定义类型的成员变量,在该成员变量所在的类中没有这个变量的拷贝构造函数时(Date这个类中没有拷贝构造函数),编译器默认生成的拷贝构造函数会调用这个类(Time)的拷贝构造函数(Ti2me中的拷贝构造函数)对d2._t进行拷贝。编译器对内置类型是不会进行处理的,而对自定义类型会按调用它的默认构造,我们不写,编译器默认生成构造函数,内置类型不做处理,自定义类型会去调用他的默认构造(写在自定义类中的这个类的不含参的构造函数),有些编译器也会处理但是那是个性化行为不是所有编译器都会处理。
2025-02-10 21:02:04
1002
原创 计数排序(C语言)
本人是C语言萌新一枚,希望能和大家多多交流,共同进步。如果对文章内容有什么指正、建议、疑问。第一次,遍历选出max与min,从而算出范围range=max-min,创造一个元素个数为range的数组并将其所有元素初始化成0。第二次,遍历统计各元素出现的次数,记录在tmp数组中。根据tmp数组填充arr,使之有序。1.适用于范围集中,极差不大的整形数组的排序。2.时间复杂度:O(N)3.空间复杂度:O(N)
2025-02-01 21:30:59
113
原创 归并排序(C语言)
当对原数组二分完毕准备合并时,采用:比较合并拷贝到tmp,再从tmp把排序好的数组的部分拷贝回原数组,然后继续进行下一组合并,最后可以使原数组有序。不需要考虑原数组的二分,直接套循环即可,先创建一个与arr等大的tmp数组,令gap等于1,让gap以2的指数倍增加。(要注意tmp中的随机值拷贝回到arr中)(即每次都要保证越界的部分要从arr拷贝到tmp中,以防止最后一次性拷贝时将tmp中未被arr对应元素覆盖的随机值拷贝到arr中)end2=i+2*gap-1;end1=i+gap-1--->会越界;
2025-02-01 20:33:11
424
原创 C++入门概念
注意观察红框圈住的后缀部分,不难看出C++在转换函数的汇编代码时,会把形参的类型也一并传递,而C语言不会 ,这就是C++实现重载的原因(这就是C++在linux系统下的函数修饰)这里打印b的值是不确定的:如果Count函数结束,栈帧销毁,没有清理栈帧,那么b的结果侥幸是正确的如果Count函数结束,栈帧销毁清理栈帧,那么b的结果是随机值。auto修饰变量,auto不再是存储类型的指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量的类型是经由编译器推到形成的。注意:这个写法有极大的危险。
2025-01-29 22:04:26
653
原创 快速排序(C语言)
整个区间入栈--->整个区间出栈--->第一次排序--->返回key值的位置--->[0,key-1]入栈,[key+1,n]入栈--->[0,key-1]出栈,排序--->[0,key-1]的子区间入栈出栈排序(直到[0,key-1]的子区间排完)--->[key+1,n]出栈,排序--->[key+1,n]的子区间入栈出栈排序(直到[0,key-1]的子区间排完)-->整体有序。分别检测left(左端点),right(右端点),mid(中间值)的大小,选出其中第二大的值所对应的位置作为key。
2025-01-13 21:02:30
1022
原创 堆排序(C语言)
2.交换堆顶元素和最后一个元素位置,让最大数排在最后一个,然后对堆顶元素进行向下调整(此时调整区间是前(n-1)个,不包括堆底的最大数),使既不破坏堆的结构,又让第二大的元素排在堆顶,接着重复进行这个过程,最后可使待排序数组有序。本人是C语言萌新一枚,希望能和大家多多交流,共同进步。如果对文章内容有什么指正、建议、疑问。1.对待排序数组进行建堆(升序建大堆,降序建小堆)1.时间复杂度O(n*logn)一、原理分析(以升序为例)2.空间复杂度O(1)
2025-01-11 11:09:47
125
原创 直接选择排序(C语言)
以排升序为例,对于长度为n的待排序数组,每次遍历从中选出最小值与下标为0的元素交换,再从下标为1的地方遍历选出最小值与下标为1的元素交换,以此类推,当遍历了(n-1)次后,可使整个数组有序。本人是C语言萌新一枚,希望能和大家多多交流,共同进步。如果对文章内容有什么指正、建议、疑问。1.时间复杂度O(N^2),效率不高,使用性差。2.空间复杂度O(1)
2025-01-10 13:28:08
120
原创 希尔排序(C语言)
建立在直接插入排序之上,以gap为基准对数组进行分组,对每组进行直接插入排序,逐步减小gap(通常以2倍或者3倍减小),循环进行,当gap等于1时,实际上就是在进行直接插入排序,从而使整个数组有序。本人是C语言萌新一枚,希望能和大家多多交流,共同进步。如果对文章内容有什么指正、建议、疑问。3.时间复杂度O(N*logN),这不是准确的值(作者学艺不精)据大佬研究,应该是n^1.25到1.6n^1.25之间。2.当gap>1时,对数组进行预排序,使数组接近有序。当gap=1时,对数组进行直接插入排序。
2025-01-09 10:56:02
171
原创 用C语言实现strlen函数的三种方法
然后通过一个 while 循环,只要当前指针所指向的字符不是 \0 (因为在C语言中,字符串是以 \0 作为结尾标志的),就将计数器 count 加1,并将指针 a 向后移动一位,指向下一个字符。当遇到 \0 时,循环结束,最后返回 count 的值,也就是字符串的长度。这里利用了指针相减的特性,在C语言中,两个指向同一数组(或同一内存区域连续存储的数据,这里就是字符串)内不同元素的指针相减,其结果是它们之间相隔的元素个数,正好就是字符串的长度(不包含 \0 )。- 首先通过 if (!
2024-11-18 21:52:50
492
原创 用C语言实现选择排序
i++) :控制排序的轮数,一共会进行 sz 轮排序,每一轮会将当前未排序部分的最小元素“浮”到已排序部分的末尾。:最后将暂存的 tmp (原来 arr[j] 的值)赋给 arr[i] ,完成两个元素的交换。- if (arr[i] > arr[j]) :如果当前位置 i 的元素大于后面位置 j 的元素。
2024-11-17 21:50:15
265
原创 利用c语言中的函数指针实现整数四则运算的转移表
数组大小为 5 ,并初始化为 { 0,&Add,&Min,&Mul,&Div } ,这里将 Add 、 Min 、 Mul 、 Div 这四个函数的地址依次存入数组(索引从 1 开始对应相应操作,索引 0 初始化为 0 ,便于后续对while循环的调整)。如果 z 为 0 ,则直接跳出循环结束程序。- Div 函数:接收两个整数 x 和 y ,返回 x 除以 y 的商(这里是整除,会舍去小数部分),实现除法操作。- Add 函数:接受两个整数参数 x 和 y ,返回它们的和,实现了简单的加法运算。
2024-11-14 20:53:34
296
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人