- 博客(68)
- 收藏
- 关注
原创 C++:模板
在这个例子中,multiply(3, 4) 直接使用了默认的模板参数 T = int,而 multiply<double> 明确指定了模板参数。因为p1的地址小于p2,但是我们想比较的是p1和p2指向的日期。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。类类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。函数可以接受任意类型的参数,只要这两个参数的类型相同。模板参数分 类类型参数与非类型参数。定义了一个模板,其中。
2025-04-17 01:18:58
372
原创 C++:模拟实现vector
Vector是一个封装了动态大小数组的顺序容器,具有以下特点:连续存储:元素存储在连续的内存空间中动态扩容:当插入元素超出当前容量时自动扩展随机访问:支持通过下标快速访问任意元素尾部高效:在末尾插入和删除元素效率高1、vector是表示可变大小数据的序列容器2、就像数组一样,vector也采用连续的存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但又不想数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
2025-04-14 02:11:47
940
原创 C++:模拟实现string
public://////将str中的内容拷贝给_str, _size(0)//创建一个临时对象swap(tmp);
2025-04-08 22:25:30
955
原创 C++:内存管理与模板初阶
new和delect是用户进行动态内存申请和释放的操作服,operator new和operator delect是系统提供的全局函数,new在底层调用operator new全局函数来申请空间, delect在底层通过operator delect全局函数来释放空间。operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。new 和 delete 都是操作符,并不是函数。
2025-03-29 09:17:42
849
原创 C++:类和对象(二)
友元函数(friend function)是一个被类声明为"朋友"的非成员函数,它可以访问该类的所有私有和保护成员,就像成员函数一样。友元函数不属于类的成员,但它被授予了访问类私有部分的特权。private:public:// 声明友元函数// 友元函数定义// 可以访问Box的私有成员width友元函数在类内部声明,使用friendprivate:int secret;public:// 声明普通函数为友元// 声明其他类的成员函数为友元。
2025-03-27 17:46:18
998
原创 C++:命名空间
命名空间是 C++ 中用于封装代码的机制。它可以将全局作用域中的标识符(如变量、函数、类等)分组,避免命名冲突。使用namespace。
2025-03-23 17:07:23
332
原创 数据结构与算法:计数排序
计数排序(Counting Sort)是一种非比较型的排序算法,适用于对整数或有限范围内的数据进行排序。它的核心思想是通过统计每个元素的出现次数,然后根据统计结果将元素放回正确的位置。计数排序的,其中 n 是待排序元素的数量,k 是数据的范围大小。空间复杂度O(n + k),需要额外的计数数组和结果数组。计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
2025-03-13 01:41:24
319
原创 数据结构与算法:归并排序
时间复杂度:空间复杂度:稳定性:稳定归并排序是一种稳定的排序算法,即相同元素的相对顺序在排序过程中不会改变。归并排序的时间复杂度为O(nlogn),其中n是待排序数据的数量。这意味着无论数据是已经部分排序还是完全无序,归并排序都能保持较高的效率。归并排序的空间复杂度为O(n),因为它需要额外的空间来合并两个已排序的子数组。这意味着在内存有限的情况下,使用归并排序可能需要额外的考虑。然而,在大多数情况下,这种空间消耗是可以接受的,因为归并排序的高效性和稳定性往往能够抵消其空间复杂度的不足。
2025-03-12 23:12:33
876
1
原创 数据结构与算法:快速排序
快速排序(Quick Sort)是一种高效的排序算法,采用分治法的策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。快速排序的基本思想是选择一个“基准”元素,将元素分为两部分:比基准小的元素和比基准大的元素,然后递归地对这两部分进行排序。小区间优化可以在一定程度上提高快速排序的性能。小区间优化是指在快速排序中,当待排序的子序列的长度小于一定阈值时,不再继续使用快速排序,而是转而使用直接插入排序。通过使用栈来模拟递归的过程,非递归实现避免了递归调用的开销,提高了快速排序的效率。
2025-03-11 13:38:46
688
原创 数据结构与算法:堆排序
堆排序使用堆来选数,效率高了很多时间复杂度:空间复杂度:稳定性:不稳定空间效率:堆排序是一种原地排序算法,这意味着它不需要额外的存储空间来辅助排序过程,除了原数组本身。这使得堆排序在处理大数据集时,相较于其他需要额外空间的排序算法,具有更高的空间效率。时间效率:堆排序的时间复杂度在最坏情况下为O(nlogn),其中n是待排序元素的数量。这意味着无论输入数据的初始状态如何,堆排序都能保持相对稳定的性能。
2025-03-05 17:45:41
427
原创 数据结构与算法:选择排序
选择排序是一种简单直观的排序算法,其基本思想是:从待排序的数据元素中,每次选择最小(或最大)的元素,将其与序列的起始位置交换,然后继续对剩余的元素进行排序,知道整个序列排序完成。
2025-03-04 22:20:01
316
原创 数据结构与算法:希尔排序
初始时,整个序列被分成多个子序列,每个子序列包含相隔一定增量的元素。随着增量的逐渐减小,子序列的元素逐渐合并,最终当增量减至1时,整个序列完成排序。这种方法是一组一组的走完,先走完红色的,让它成为有序,然后再走绿色的,最后走蓝色的。gap = gap / 3 + 1,不管gap为什么值,都可以保证gap最后都为1,当gap==1时相当于一次直接插入排序,结果为有序。希尔排序又称缩小增量排序,它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。
2025-03-03 20:59:50
358
原创 数据结构与算法:插入排序
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。在其实现过程中使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。
2025-03-02 10:17:59
463
原创 数据结构与算法:二叉树
这个while循环结束后吗,二叉树中的所有结点全部过了一遍,就算有 没有入队列的结点,也没有关系,因为这时只需要判断现在的队列中,是否还存在数据,如果存在,则说明不是完全二叉树,返回false。但是一定要记录这个节点,因为递归返回会销毁函数栈帧,你不返回给上层这个找到的节点的记录,上层不知道你找到没有,就认为没有找到。比如说,求第3层结点的个数,那么对这棵树的第一层来说,从它开始,求它向下的3层。2、在操作系统中,树是一种用于表示文件系统的结构,其中根目录位于树的顶部,子目录和文件位于根目录下 [3]。
2025-02-27 15:47:58
1073
原创 数据结构与算法:双向链表
newnode的next指针指向pos的next指针指向的节点,newnode的prev指针指向pos节点,pos的next指针指向的节点的prev指针指向newnode,pos的next指针指向newnode。先让newnode的next指针指向最后一个数据,newnode的prev指针指向哨兵卫,再让第一个有效数据的prev指针指向newnode,哨兵卫的next指针指向newnode就完成了头插。让pos节点的next指向的节点和prev指向的节点连接起来,然后释放pos节点,将pos节点置为空。
2025-01-08 21:57:07
961
原创 链表OJ题(一)
找中间节点采用一个快慢指针,然后将找到的中间节点传给revers函数,开始逆置后半部分的节点。创建一个指针new用来存储头节点的下一个节点,然后改变头节点的指向让它指向newnode。例如,共有4个数据,要返回倒数第2个节点的值,因为pcur指向头节点,所以只需要走2步就到了倒数第2个节点的位置上,然后返回该点的值。思路:在每个原节点的后面插入一个复制节点,将原节点和复制节点连接起来。然后快指针先走k步,然后快慢指针同时走,当快指针走为空的时候,慢指针刚好走到倒数第k个节点上,它们之间的距离为k。
2025-01-06 22:55:17
940
原创 相交链表和环形链表
思路:先分别计算出A列表和B列表的长度,判断它们的尾节点是否相等,如果不相等就不相交,直接返回空。然后让两个列表中的长的列表先走它们的差距步,然后再一起走,第一次相等的点就为交点。注意要用地址判断是否相交。所以,记录一个指针ptr指向链表头部,一个指针meet指向slow和fast相遇的位置,让prt和meet一起走,它们两个相遇就是入环点。链表的最后一个节点的下一个指针指向链表中的某个非空节点,形成一个闭环,叫环形链表。题目的意思是说:判断链表是否有环,有环则返回入环点,没有则返回NULL。
2024-11-28 19:14:11
500
原创 单链表的实现(C语言)
创建一个指针 ptail 让它指向链表的头节点,如果链表不为空,就找到链表的尾部,只需要 ptail 的下一个节点为空,那么此时ptail就是链表的尾部,然后让 ptail 的下一个节点指向新增节点newnode就完成了尾插操作。然后创建一个指向头节点的指针,遍历链表,通过while循环这个指针的下一个节点不指向pos,那么循环结束的时候它就是pos的前一个节点。从头开始销毁链表是最好的,创建一个指针指向头节点的下一个节点,然后销毁头节点,最后让头节点的下一个指针成为新的头节点,遍历销毁链表。
2024-09-25 22:24:42
1144
1
原创 python 集合与字典
可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数创建集合。字典值可以是任何的 python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。1、不允许同一个键出现两次。此外还有一个方法也是移除集合中的元素,且如果元素不存在,不会发生错误。集合中的元素不会重复,有自动去重性,并且可以进行交集、并集、差集等常见的集合操作。将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。值可以取任何数据类型,但键必须是不可变的,如字符串,数字。
2024-09-04 10:00:00
990
原创 python 元组
Python 的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号 ( ),列表使用方括号 [ ]。元组与字符串类似,下标索引从 0 开始,可以进行截取,组合等。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。元组可以使用下标索引来访问元组中的值。2、tuple.count(元素)1、tuple.index(元素)
2024-09-03 21:37:57
527
原创 python 列表
列表是最常用的 Python 数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型,创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。
2024-08-19 13:23:26
595
原创 找单身狗2、面试题之消失的数字
不过和单身狗1不一样的是,整个数组异或下来,会出现一个别的值,是由5^6得到的。这里我们找新得到的值的二进制位的1在哪里。注意,异或运算符是两个数的二进制位对应位相同结果为1,不同为0 ,可以用这点来将两个不同的数字分成两个不同的组,然后在分别异或每个组。如:1,2,3,4,5,1,2,3,4,6 5 和6都只出现了一次,找出5和6打印出来。在一个数组中,室友两个数字出现了一次,其他所有数字都出现了两次。3、将k位上为1的分为一组遍历异或,最后的值存储到p1或p2中。
2024-07-29 12:34:34
406
原创 [python]数字与字符串
Python 数字数据类型用于存储数值。数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间。- 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。布尔(bool)是整型的子类型。- 浮点型由整数部分与小数部分组成- 复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。
2024-07-25 11:22:36
822
原创 python 基本数据类型和数据类型转换
在显式类型转换中,用户将对象的数据类型转换为所需的数据类型。以下实例中,我们对两种不同类型的数据进行运算,较低数据类型(整数)就会转换为较高数据类型(浮点数)以避免数据丢失。有时候,我们需要对数据内置的类型进行转换,数据类型的转换,一般情况下你只需要将数据类型作为函数名即可。在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。这些函数返回一个新的对象,表示转换的值。以上实例,创建一个整型对象,值为 1,从后向前赋值,三个变量被赋予相同的数值。
2024-06-12 21:07:23
974
1
原创 文件输入/输出
文件通常是在磁盘或固态硬盘上的一段已命名的存储区。C把文件看作是一系列连续的字节,每个字节都能被单独读取。C提供两种文件模式:文本模式和二进制模式。
2024-05-22 12:00:00
1040
原创 C结构详解
编译器执行这行代码便创建了一个结构变量library。编译器使用book模板为该变量分配空间。在结构变量的声明中,struct book 所起的作用相当于一般声明中的 int 或 float。}library;声明结构的过程和定义结构变量的过程可以组合成一个步骤,组合后的结构声明和结构变量定义不需要使用结构标记。然而,如果打算多次使用结构模板,就要使用带标记的形式。
2024-05-22 02:55:35
1143
原创 其他标准I/O函数(fread、fwrite、feof、ferror)
当上一次输入调用检测到文件结尾时,feof()函数返回一个非零值,否则返回0.当读写出现错误时,ferror()函数返回一个非零值,否则返回0。假设要读取下一个冒号之前的所有字符,但是不包括冒号本身,可以使用getchar()或getc()函数读取字符到冒泡,然后用ungetc()函数把冒号放回输入流中。除此之外,它还包含错误和文件结尾的指示器、一个指向缓冲区开始出的指针、一个文件标识符和一个计数(统计实际拷贝进缓冲区的字节数)。当设置了与流关联的文件结束标识符时,该函数返回一个非零值,否则返回零。
2024-05-21 15:24:57
873
原创 通讯录项目(顺序表实现)
解释一下这里的con->arr[i].name,arr是一个结构体指针,更准确的来说是指向联系人数据的指针,arr[i].name是该一条联系人中的姓名信息 和 你要删除的联系人姓名用strcmp函数进行比较,两个姓名如果一样就返回0,就能得到该条联系人在通讯录中的下标。联系人的所有信息都存储在arr数组里面,如果联系人数据存在,Fund函数返回这个联系人的下标,最后将这个联系人的所有信息展示出来。通讯录的初始化实际上就是顺序表的初始化,通讯录的销毁实际上就是顺序表的销毁,因为通讯录就是顺序表。
2024-05-21 01:05:00
892
原创 编译和链接
编译是指将源代码(通常是人类可读的高级语言代码)转换成目标代码(通常是机器语言或汇编语言)的过程。编译器是完成这一转换的软件工具。预处理(预编译):在这个阶段,编译器会处理源代码中的预处理器指令,如包含头文件、宏展开等。词法分析:编译器将源代码分解成一系列的词法单元,如关键字、标识符、运算符、字面量等。语法分析:编译器检查词法单元序列是否符合编程语言的语法规则,构建抽象语法树(AST)。语义分析:编译器分析AST,确保代码的语义正确,比如变量是否已经定义、类型是否匹配等。中间代码生成。
2024-05-20 16:19:36
540
原创 动态顺序表的实现
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指 用一组地址连续的存储单元依次存储线性表中的各个元素、是的线性表中在逻辑结构上相邻的数据元素 存储在相邻的物理存储单元中,即通过数据元素物理存储的 相邻关系来反映数据元素之间 逻辑上的相邻关系,采用顺序存储结构的线性表通常被称为顺序表。由于数据在数组中的位置是以0,1,2,3,4这样存储的,因为是在指定位置之前插入数据,所以指定的位置不能大于有效数据个数,也不能小于或等于0。在插入数据之前,也要先检查空间够不够,空间不够就进行增容。
2024-05-20 13:53:23
706
原创 联合和枚举
1、先定义枚举类型,再定义枚举变量enum DAY2、定义枚举类型的同时定义枚举变量enum DAY} day;3、省略枚举名称,直接定义枚举变量enum} day;return 0;结果:3在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。不过在一些特殊的情况下,枚举类型必须连续是可以实现有条件的遍历。
2024-04-22 23:07:17
724
原创 初识linux
很多时候你会发现,怎么我输入命令之后显示的结果是乱码。Linux是支持多国语系的,屏幕的信息会以该支持的语系来输出。比如说,我们刚开始配置Linux的时候,选择的是汉语,那该语系就是中文。这个时候,我们就得将支持语系改为英文,才能够以英文显示出正确的信息。这样,我们就 进入到bc这个软件的工作环境当中 了,输入的数据要符合bc的要求。上面显示的是:星期五、四月十九日、16:54分、57秒,在2024年的CST时区,中国在CST时区中。某些命令有特殊的参数存在,若输入错误的参数,则该命令会有错误信息的提示。
2024-04-19 23:36:36
654
1
原创 结构体的内存对齐
原因在于,为了访问未对齐的内存,处理器需要做两次内存访问;如果我们能保证将所有的double类型的数据的地址都对齐成8的倍数,那么就可以用一个内存操作来读会泽写值了。4、如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中 最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。VS中默认的值为8 Linux中gcc没有默认的对齐数,对齐数就是成员自身的大小。3、结构体总大小为最大对齐数(结构体中 每个成员变量都有一个对齐数,所有对齐数种最大的)的整数倍。
2024-04-15 22:12:19
536
原创 大小端字节序、浮点数的存储
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit位,参数在C语言中除了8bit的char之外,还有16bit的short类型,32bit的long类型(还要看具体的编译器)。如果E为11位,它的取值范围为0~2047.但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存是E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。
2024-04-15 18:35:01
1088
1
原创 内存函数memcpy、mommove、memset、memcmp
但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零或设置为特定值。在清空内存区域或者为内存区域赋值时,memset() 是一个常用的工具函数。该函数返回一个指向目标存储区 str1 的指针。用于将一段内存区域设置为指定的值。
2024-04-12 22:24:20
1628
原创 字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数
这个头文件中说明的,C语言程序启动的时候就会使用一个全面的变量 errno 来记录程序的当前错误码,只不过程序启动的时候 errno 是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在 errno 中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。haystack和needle分别指向字符串的首字母,如果找到相同的字符,haystack和needle向后移一位,如果没有找到相同的,haystack向后移一位。
2024-04-10 20:26:17
812
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人