c++
小付同学ing
这个作者很懒,什么都没留下…
展开
-
编程语言的内存空间
首先需要说明的是c/c++堆上申请的空间需要自己释放,java和python不需要用户自己释放,不用担心内存泄露的问题,其中python中,万物皆对象,所以基本数据类型中占用的空间将大于数据本身所占用的空间,例如int型4个字节,python申请一个对象进行存放数据,所以占的空间比4字节的大。总的来说,以c++为例,程序运行时将所需的空间分为固定部分和可变部分:固定部分是代码区和数据区,可变部分是栈区和堆区,其中栈区的空间程序自己释放,堆区需要自己释放,在程序结束时可能会被系统回收。在数据类型方面,32原创 2022-04-07 19:22:30 · 991 阅读 · 0 评论 -
C++单例模式
什么是单例模式单例模式是一种常见的设计模式,核心结构是只包含一个称为单例的特殊类,它的目的是保证一个类只有一个实例,并提供一个全局的访问点,该实例被所有程序模块共享,避免了类频繁创建和销毁。它的用处也十分广泛,比如日志管理,操作系统的日志管理器。怎么实现为了保证这个类只实例化一次,所以设计思路需要把类的构造函数设置成private,类的内部在申请一个private该类的指针,然后对外需要提供一个public的接口,用来访问构造函数。需要注意的是需要把该类的指针和对外的接口设置成static,这样做的原创 2021-09-22 17:58:26 · 61 阅读 · 0 评论 -
力扣215:数组中第K大最大元素
一,题目描述题目链接给定一个数组,求这个数组中第K大的数字。示例如下:输入: [3,2,1,5,6,4] 和 k = 2输出: 5二, 思路可以使用快排的思想解决这个问题,因为每次快排之后都会有一个数字归位。而且快排采用分治的策略,查找速度很快。所以可以利用快排之后数字的下标和第几大K进行对比,如果等于就是找到了,如果小于,说明在快排的右半边,大于在左半边,从而找到正确的数字。这里需要转变一下的是需要将第几大转化成第几小,因为数组是从小到大排序的,所以需要转换一下。三,实现class原创 2021-09-13 10:52:14 · 89 阅读 · 0 评论 -
快排面面观(3)-单链表的快排
我在快排面面观(1),快排面面观(2)分别写了快速排序的基本概念和快排的优化,有兴趣的同学可以先看前两篇之后再来看这一篇。单链表是链式结构,元素和元素之间通过指针连接,所以链表的排序我们也可以参考数组的快速排序,可以参靠第二篇文章中的单向排序,代码如下,单链表是带头节点的单链表,设置两个变量指向头节点和头节点的下一个节点,头节点不存值。typedef struct LinkNode{ int val; LinkNode* next;}LinkNode, *LinkList;LinkList b原创 2021-09-03 11:24:40 · 110 阅读 · 0 评论 -
c++中NULL和nullptr的区别
一,C中NULL在C语言中,NULL的类型是((void*)0),相当于一个空指针,会根据不同的指针隐式转换为相应的类型,如char* p = NULL;就将NULL转换成char型。二,c++中的NULL和nullptrC++中的NULL实际上是0,因为在C++中,NULL无法通过隐式转换成其他类型,所以在用NULL代替空指针的时候可能会遇到问题。void func(int){ cout << "func(int)" << endl;}void func(void*原创 2021-09-02 22:22:08 · 327 阅读 · 0 评论 -
快排面面观(2)-优化快速排序
传统的快速排序是通过两个变量指向数组的首尾然后通过递归来实现的,具体可以看我的这一篇文章快排面面观(1),还会有一些基于快排的变化和优化,比如怎么单向进行快排,还有就是待排序数组是有序的或者是接近有序的,利用传统的快排效率就比较低,所以 就要对待排序数组进行处理。(1)单向快排:具体的算法就是设置一个一前一后的指针,一个变量i指向数组首元素,一个变量j指向它的前一个,保存首元素的值,然后移动i遇到比首元素小的值让j加一之后和i交换,遇到比它大的i继续前移,这样的作用就是j最终指向的就是分隔点,最后交换首原创 2021-09-02 21:47:52 · 231 阅读 · 0 评论 -
快排面面观(1)-递归和非递归
快排的思想(1)递归的版本快排体现的就是分治的思想,传统的快排思想首先将原数组分成两个部分,再通过递归分别对两个子数组进行快排。定义两个变量left,right指向首尾,递归结束的条件就是left > right。完整的代码如下,代码的重点是Position函数,即找到分隔数组的位置。注意函数中的边界判断。判断完位置pos之后,利用分治和递归的思想,将数组分成两个部分进行递归。#include <iostream>#include <vector>#include &原创 2021-09-02 20:51:09 · 195 阅读 · 0 评论 -
剑指offer刷题笔记03:62圆圈中最后的数字
题目描述:0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof思路:这道题是我在小米的笔原创 2021-09-02 14:53:46 · 75 阅读 · 0 评论 -
剑指offer刷题笔记02
这道题是offer03,数组中重复的数字。offer03 数组中重复的数字在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。从题中可以分析,数组中不止一个重复的只要找出一个就可以了。而且长度为n的数组里的数字也是0~n-1,是有对应关系的。本题有两种解法:解法一:哈希法:创建一个map存放数组的值和出现的次数,如果出现的值不为1,说明该数字重复。步骤:(1)原创 2021-08-09 09:04:16 · 71 阅读 · 0 评论 -
剑指offer刷题笔记01
剑指offer里的题很经典,我的顺序是从简单题开始刷,并写下我的思路和见解,今天写的是offer09和offer10-1。offer09 用两个栈实现队列队列是先进先出类型的结构,栈是后进先出的结构,两个栈实现队列的思路是使用一个栈作为输入栈,一个栈是输出栈,这样一来就把后进先出变成先进先出。具体步骤如下:(1)定义两个栈s1,s2。s1是输入栈,即把数据先存放在s1中;(2)s2是输出栈,需要进行判断:如果s2不为空,就先将其中的数据输出;如果为空就把s1的数据存进去(前提是s1中有数据)。(3原创 2021-08-07 22:51:57 · 68 阅读 · 0 评论 -
函数调用过程
我们知道程序是运行在虚拟地址空间中,函数的调用过程主要包含以下几部分:函数参数的带入、栈帧的开辟、返回值的带出以及栈帧的销毁。程序是从main函数开始执行的,因此首先main函数会有一个栈帧存放main函数中的参数,当调用到函数时,例如(sum求和)等,需要在main函数的上方进行栈帧开辟。其中函数有以下几部分组成:函数名、参数、返回值,调用函数时需要在虚拟地址空间中开辟一个空间,我们称之为栈帧,调用结束之后需要销毁栈帧。栈顶和栈底分别用esp和edp表示,如图所示。下面分别介绍以下流程。1,参数的带原创 2021-08-04 10:06:27 · 1927 阅读 · 0 评论 -
编译链接过程
一,主要分为预编译,编译,汇编,链接。其中前三个统称为编译,之后通过链接形成二进制可执行文件。(1)预编译主要是替换,生成行号和文件索引,用于后来编译遇到问题时产生错误提醒;(2)编译生成符号,符号的作用就是用来标记,链接的时候可以通过符号找到对应的值进行匹配,数据和函数名可以产生符号;(3)汇编形成二进制可重定位文件,用于链接时的定位不同的文件;(4)链接通过可重定位文件形成二进制可执行文件,最终形成执行文件。需要注意的是,二进制可重定位文件是针对单个文件的,链接时的二进制可执行文件是针对多个文件原创 2021-07-20 22:22:00 · 777 阅读 · 0 评论