- 博客(45)
- 收藏
- 关注
原创 C++模板初阶
class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_Data)
2024-12-10 17:32:17
362
原创 C++内存管理
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间//还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;
2024-12-05 17:23:22
665
原创 友元和内部类
友元提供了一种突破封装的方式,有时可以提供便利。但友元会增加耦合度,破坏封装,因此友元不宜多用。友元分为:友元函数和友元类运行错误: 当我们运行上述代码时,我们会发现代码运行崩溃。这是因为我们重载的“<<”,由于cout放在符号的左侧,因此cout本应该是隐含的this指针,但实际上隐含的this指针是Date类型,因此cout的输出流对象和隐含的this指针在抢占第一个参数的位置,即左操作数。但实际使用中cout需要是第一个形参的对象,如果将该重载函数放在类外的话,又无法访问成员变量,这时就要用到友
2024-12-04 17:27:10
367
原创 C++类(赋值运算符重载)
也具有其返回值类型,函数名即参数列表,其返回值类型与参数列表与普通的函数类似函数名:关键字该关键字不能通过连接其他C++中不存在的符号创建新的操作符:如operator@重载操作符必须有一个自定义类型参数用于内置类型(int、char、double等)的运算符,其含义不能改变。因此operator只能用于自定义类型作为类成员函数重载时,其形参看起来会比操作数数目少1,因为成员函数的第一个参数为隐藏的this指针: .”以上5个运算符不能重载。
2024-11-29 17:22:08
495
原创 C++类(1)
/成员函数或成员变量声明和定义全部放在类体中,如:class Aint a;int b;注:成员函数在类中定义,编译器可能会将其当成内联函数处理。声明放在在头文件中,定义放在源文件中。成员函数在定义时,需要在函数名前加。//头文件class namepublic:private:char* n;int a;//源文件。
2024-11-25 21:40:15
301
原创 内联函数(C++)
以的函数叫做内联函数,编译时C++编译器会,内联函数提升了程序运行的效率。通过上述图片,我们看出在运行上述代码时,调用Add函数是有建立栈帧的开销的。当我们用inline修饰函数后,可以观察到如下图所示:通过对上面两张图片的对比,我们可以看出加上inline后,没有了函数栈帧的开销,它会直接在调用内联函数的地方展开运行。
2024-11-21 16:15:11
299
原创 归并排序(C语言)
2.采用分治的思想对数组中的元素进行比较,将数组一份为二,midi = (left + right) / 2,分为[left,midi] [midi + 1,right]3.重复第二步采用递归算法往深处递归,直到数组中只包含一个元素(不包含数组不存在的情况),故递归的结束条件是left == right。4.然后函数返回到上一层,对两个数进行比较,然后按照顺序插入临时数组tmp。5.当tmp数组有序时,拷贝到原数组中结束。
2024-11-15 18:05:12
566
原创 快速排序(C语言)
1.首先,先确定一个元素作为关键值赋值到变量keyi中(keyi保存的是该元素的坐标,即数组的下标)2.其次,用变量left保存数组的左边左边,right保存数组的右边坐标3.然后right先向左边开始走,直到找到小于keyi的元素停止4.right停止后,left开始向右侧找,找到大于keyi的元素停止5.将left和right位置的元素互换,然后重复3、4步6.直到left和right相遇后,将left赋值给keyi。
2024-11-13 21:45:13
586
原创 选择排序(C语言)
1.首先,我们先建立一个乱序数组,如:2.其次,我们遍历数组选出最大或最小的元素,与数组的尾部或首部位置的元素位置互换。在这里,为了提高效率,我们可以遍历一遍把最大和最小的元素一起选出,然后放到该在的位置。3.重复上述步骤即可。
2024-11-13 20:52:09
271
原创 希尔排序(C语言)
希尔排序是在直接插入排序的基础上演变的1.先选定一个小于n的整数gap作为间隔(一般gap = n / 3 + 1),然后将所有距离为gap的元素分在同一组,并对每一组的元素进行直接插入排序。它将一组数组分为了gap组,一组中每个元素的间隔为gap。2.当gap的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。图片讲解将上述同一颜色相连的数分为一组,一共分了gap组,一组中每个元素的间隔为gap,对同一组中的元素进行插入排序。
2024-11-12 18:03:10
791
原创 插入排序(C语言)
2.然后取出下一个元素,在这里是第二个元素即5,将这个元素赋值变量tmp,然后进行插入。3.如果前一个元素大于tmp,则该元素向后移,重复上述步骤,直到找到小于tmp的位置。4.找到小于tmp元素的位置后,插入到该元素的后面,就完成了一次插入排序。从第一个元素开始排序,当只有第一个元素4时,我们可以认为它是有序的。重复上述步骤,直到排序结束。1.给定一个乱序的数组,如。
2024-11-12 17:28:00
350
原创 C语言模拟实现堆排序
开始向下调。由于在数组上有n个空间,因此最后一个结点的位置为n-1,故它的父结点的位置是(n-1-1)/2,故我们要从结点24的父结点8开始向下调。由于结点24大于结点8,因此8不需要向下调整。然后看结点4,结点4的孩子分别是4和68,由于两个孩子中,结点4要小于68,且与父结点相等,因此父结点4也不需要向下调整。依次向上遍历,直到结束。
2024-11-02 21:04:09
691
原创 二叉树及其概念
树是一种非线性的数据结构,它是由n个有限结点组成一个具有层次关系的集合。如图:树有一个特殊的结点,被称为根结点(上图R结点),根结点没有前驱结点。除了根结点外,每个子树的根结点有且仅有一个前驱,但可以有0个或多个后继结点,因此树是递归定义的。注:树形结构中,子树之间不能有任何交集,否则就不是树形结构。结点的度:一个结点含有子树的个数成为该节点的度。如:A的度为6,B的度为0叶结点:度为0的结点。如:B、C、H、I等分支结点:度不为0的结点。如A、D、E、F等父结点:若一个结点含有子结点,则这个结点称为其子结
2024-07-25 20:28:22
383
原创 C语言中的文件操作
在计算机操作系统中,文件是指存储在硬盘等外存储器上的信息集合。在程序设计中,我们说的文件有两种:程序文件、数据文件。(这是从文件功能的角度来分类的)上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流也是同理。根据上面我们可以得出fputc的功能是将一个字符写进流内。其中character是要写的字符,stream是流,返回值为int类型。如果返回失败,则返回EOF。fclose(pf);pf = NULL;
2024-02-03 13:37:41
935
1
原创 结构体的介绍
/变量的定义int x;int y;}p1;//声明类型的同时定义变量p1//初始化struct Stuint age;int main()//按照结构体成员的顺序进行初始化struct Stu s = { "张三",20,"男","20230815648" };//按照指定的顺序初始化struct Stu s2 = { .age = 18,.name = "李四",.id = "21015120",.sex = "男" };
2024-01-24 14:49:23
896
1
原创 数据在内存中的存储
整数在内存中以二进制的形式存在,主要以原码、反码和补码的形式存在。其中有符号整型的这三种表示方法均由符号位和数值位两部分组成,其中符号位是用0表示‘正’,用1表示‘负’,而数值位最高位的一位是被当做符号位,剩余的都是数值位。无符号整型中没有符号位,所有的0和1都是数值位。正整数的原码、反码和补码都是相同的,而负整数的原码、反码和补码都是不同的。
2024-01-22 20:16:00
957
1
原创 指针(4)
在指针中,有一种指针类型叫做字符指针:char*我们可以这样使用还有一种使用方法如下这里和数组一样,并不是把字符串hello world放入字符指针ph中,而是将字符串首字符的地址放进ph中,上述代码就是讲首字符h的地址放在指针变量ph中。代码的输出结果如图所示:上述代码中,str1、str2、str3和str4的内容是一样的,但为什么输出的结果却是上图所示呢?因为这里的str3和str4是一个常量字符串。
2023-12-03 20:17:12
682
1
原创 冒泡排序的代码及优化
我们设flag=1,意思就是假设这一趟是有序的不需要交换任何元素,那么代码就会跳过if(arr[j]>arr[j+1])语句,flag的值不会改变,那么flag==1就会进入if(flag == 1)这条语句,因此,会跳出这一趟循环,就会节省时间。我们要将其变成一个升序,因此先将10和9进行比较,由于10>9,因此要把10和9的位置互换,然后再比较10和8的大小,将10和8的位置互换,一直把10放到合适的位置,这一次循环就结束。而变量j表示某一趟中,需要交换的元素个数,再交换10时,交换了9个元素;
2023-11-30 17:13:26
582
1
原创 指针(3)
对于一位数组来说,数组名是数组首元素的地址。而对于二维数组来说,数组名是数组第一行的地址。但这种情况也不是绝对的,有两种例外:(1)sizeof(数组名):数组名单独存放在sizeof中,这里的数组名表示的是整个数组,计算的是整个数组的大小,单位是字节。(2)&数组名:这里的数组名表示的也是整个数组的大小,取出的是整个数组的地址(虽然打印出来与数组首元素的地址相同,但整个数组的地址与数组首元素的地址是有区别的)。除了这两种情况外,其他任何地方使用数组名,都代表数组首元素的地址。
2023-11-29 10:51:27
1430
1
原创 指针(2)
void*类型是一类特殊的指针类型,这一类型的指针可以接受任意类型的地址,但它不可以直接进行指针的+-整数和指针的解引用的运算。当运行以上代码是会报错,如图:我们可以看出void*可以接受任何类型的地址,但不能直接解引用,如果想要使用,可以强制类型转换后再解引用。
2023-11-27 20:43:17
1658
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人