- 博客(39)
- 收藏
- 关注
原创 【C++】stack和queue 适配器
1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作empty:判空操作back:获取尾部元素操作。
2024-05-12 21:09:12
904
1
原创 C的内存区域:栈区,堆区,代码区,静态区,常量区
其实不然,这里表示的char类型的数组会在栈区开辟5个字节的空间,然后把在常量区的字符串“abcd\0”拷贝到数组中。存放在哪里,看它定义的时候是局部变量还是全局变量,有没有static关键字,有没有malloc函数在堆区空间开辟空间,是不是常量。*pChar3指向的是常量区的字符串“abcd\0”,所以*pChar3表示字符串的首元素a,a是存放在常量 区的。选项:A、栈区 B、堆区 C、静态区 D、常量区。*ptr1,是对ptr1指针解引用,就是堆区的那一块空间。
2024-04-08 20:44:33
538
2
原创 初识C++(四)深入了解拷贝构造函数
在这个代码中,由于 Time 类中没有显式定义一个无参数的默认构造函数(只定义了一个拷贝构造函数),而 Date 类的实现依赖于 Time 类的这个默认构造函数来初始化其 _t 成员,所以编译器将尝试调用 Time 类的默认构造函数时会失败,因为找不到合适的构造函数来初始化 _t。这个默认的拷贝构造函数会逐个拷贝 Date 类中的所有成员变量,包括基本类型和自定义类型的成员。Date 对象的默认构造函数调用:当 Date 类的对象被创建时,它的默认构造函数(编译器自动生成的,因为没有显式定义)会被调用。
2024-03-30 21:42:14
1451
8
原创 初识C++(三)构造函数和析构函数
默认生成的构造函数:内置类型的成员不做处理 ---- C++这里没有处理好,就会导致有数据的随机值自定义类型的成员做处理。
2024-03-25 20:44:33
933
9
原创 初识C++(二)引用,内联函数,auto
接收的是引用的返回值的拷贝,从而避免直接持有悬空引用,但 func 函数的设计本身是有问题的,因为它返回了对局部变量的引用(局部变量已经被销毁)以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。在本例中,当TestFunc2被调用,并且以A&(结构体A的引用)作为参数时,它实际上是直接操作原有的对象a,而不是创建一个新的拷贝。
2024-03-24 18:24:47
1364
1
原创 初识C++(一)啥是C++,关键字,命名空间 ,输入输出,缺省函数
C++,一门充满可能性的经典编程语言。无论是游戏、系统还是嵌入式设备,它都扮演着重要角色。探索C++的历史和功能,挑战编程的奥秘,开启精彩的编程之旅!
2024-03-22 18:41:24
1200
12
原创 深入了解:二叉树(最详细,约10000字)
二叉树,是一种重要的数据结构,每个节点最多有两个子节点:左子节点和右子节点。这种简洁而灵活的结构,被广泛运用在算法和数据处理中。本篇文章将通过深入解释二叉树的概念和操作,你将掌握解决复杂问题的利器,拓展编程技能的边界。让我们一同探索二叉树的神秘世界,挑战数据结构的极致魅力,开启编程之旅的精彩探索!
2024-03-21 20:44:00
1271
4
原创 十大排序算法(冒泡排序、插入排序、选择排序、希尔排序、堆排序、快排、归并排序、桶排序、计数排序、基数排序)
十大排序算法(冒泡排序、插入排序、选择排序、希尔排序、堆排序、快排、归并排序、桶排序、计数排序、基数排序)十大排序的思想和代码的实现!!!
2024-03-10 19:50:01
9703
29
原创 循环队列的实现与优势
循环队列是一种常见的数据结构,通过在数组中实现循环移动的方式解决了普通队列的空间浪费问题。本文将探讨循环队列的实现原理、操作方法以及其在实际应用中的优势。
2024-03-06 18:31:29
652
原创 快速排序(左右指针法),在写代码的时候会有陷阱
左右指针法和挖坑法大同小异,都是从右边找比key小的数,在左边找key大的数。只是不需要挖坑。我为什么还要提左右指针法呢?因为我在写这个代码的时候遇到了两个坑。
2024-02-28 19:31:44
375
原创 排序算法之快速排序(挖坑法)
挖坑法的思想:记第一个数为key,要调整key的位置,使得左边的都要比key的小,右边的数都比key的大。再从左边begin找大于28(key)的数,把那个数放在hole中,然后让hole==begin。让end找到小于28(key)的数,把那个数放到hole坑中,然后让hole==end。记录下关键字key==begin,把28那个位置挖坑hole==begin。然后arr[hole]=key;用到分治递归,就要改变函数的参数,要有left和right。再分治思想,分成左边和右边。
2024-02-27 23:11:50
484
原创 排序算法--冒泡排序
(2)3,-1,9,10,20 ----9比 -1大,所以9跟 -1交换。(1)-1,3,9,10,20 ----3比 -1大,进行交换。(3)3,-1,9,10,20 ----9跟10比较,不交换。(1)-1,3,9,10,20 ----3和-1比较,不交换。(1)-1,3,9,10,20 ----3和-1比较,不交换。(1)3,9,-1,10,20 ----3跟9比较,不交换。(1)总计需要进行(n-1)轮排序,也就是(n-1)次大循环。
2024-02-27 12:53:52
613
原创 排序算法--堆排序
用到向下调整算法,比较两个孩子的大小,选出大的孩子,与父亲比较,如果孩子大于父亲,交换。把第一个最大的数与最后一个数交换,然后把最后一个数踢出堆,继续向下调整算法,再交换次大的数。用小堆的坏处:交换之后踢出第一个数,会导致堆的错位,要重新建堆,时间复杂度O(N^2)1.堆的概念:堆一般指的是二叉堆,顾名思义,二叉堆是完全二叉树或者近似完全二。4.建堆的时间复杂度是O(N)-->(粗略的了解原理,记住结论就行)堆排序的时间复杂度是O(N*logN),优于选择排序O(N^2)2.堆的性质:①完全二叉树。
2024-02-27 10:54:30
510
原创 深入理解--指针
前面学习函数学到,函数参数可以为 int、char、float 等,但是在操作时,这些参数只作为形参,所有操作都只在函数体内有效(除对指针的操作外),那么今天来学习一下指针作为函数参数。指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。如上面,p(p + 0)指向 nums[0]、p + 1 指向 nums[1]、、、类推可得,p+i 指向 nums[i],由此可以准确操作指定位置的元素。
2024-02-21 22:00:03
1152
原创 二叉树知识点
树的高度(深度):从1开始算(为了避免空树的时候表示比较尴尬)。节点的祖先:从它的父亲开始算(包括它父亲),都是它的祖先。叶节点(终端节点):子树为0的节点。B,H,I,P,Q,K,L,M,N都是叶节点。父节点(双亲节点):一个节点含有的子节点。分支节点(非终端节点):子树不为0的节点。A,D,E,F,G,J,都是分支节点。树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。子孙:从它开始的下面的所有分支都是它的子树。A的子孙,下面的都是它的子孙。节点的度:一个节点含有的子树。
2024-02-18 12:43:37
234
1
原创 qsort函数---用快速排序的原理
/函数指针--指针指向的函数是用来比较数组中的两个元素。sqort函数的头文件是#include ,需要自己写一个比较函数(比较的方式)通过指针的移动来实现排序,排序的结果放到原数组中。void qsort ( void * base,//任意类型的指针,指向了要排序的数组的第一个元素。size_t num,//数组中的元素个数。比较函数的传参,要加const,因为只读,不修改*p。比较函数的内部,需要强制类型转换p1和p2的类型。要把两个元素的比较,抽离出来,变成一个比较函数。
2024-01-31 20:56:49
296
1
原创 回调函数--代理员
回调函数的作用:功能比一个单一的函数更加强大。通过函数的参数不一样,实现的功能也不一样。回调函数的意思:创建一个函数1,函数1的内部需要调用函数2,就把函数2指针当中函数1的形参。相同的代码出现了多份,就显得冗余。回调函数是通过其他函数来实现的,不是他自己回调。calc(Add)函数名代表的是函数的地址。
2024-01-31 17:19:59
279
1
原创 Win32 API
/可以在之后用来改变光标位置在控制台上的显示屏是有坐标的。一个窄字符占一个格。从左向右为x轴,从上到下为y轴!!!y轴的数也都是正数。(坐标系的x轴的数是按照单字符来算的)储存坐标需要COORD结构体变量。
2024-01-30 22:54:04
777
1
原创 C语言--扫雷游戏
1.初始化棋盘:一个全是*的棋盘(给玩家看到的画面),另外一个埋雷的棋盘(0代表没有雷)对于9*9的棋盘,就需要11*11的二维数组。(因为我用了game.h头文件,game.c和test.c文件,所以在下述代码有些封装起来,在文章的最后我会把完整的代码发出来)ROW代表行,COL代表列 -->用在打印棋盘,埋雷,排雷的数组中(在传参的时候ROW,COL,用小写的row,col接收)ROWS,COLS代表实际要布置二维数组的大小(初始化棋盘)(在二维数组的[ ][ ]方括号中使用ROWS,COLS)
2024-01-26 11:01:56
1057
1
原创 一级指针与二级指针的适用场景
用二级指针接收一级指针的地址,也是临时拷贝内容(一级指针的地址)一样,二级指针地址不一样的临时变量。二级指针指向一级指针的地址。就是把一级指针的地址当作二级指针的内容。p只是pa的一份临时拷贝,p与pa的地址是不一样的。当p的内容改变的时候(就是p的。在test函数中*pp(得到一级指针的地址)就可以找到p那一块地址,间接操作p中的内容。改变的时候) ,退出函数会销毁里面的内容。在函数中,一级指针只能访问一级指针指向的内容,不能对一级指针的。假设main函数中一级指针p的地址为0x1543。
2024-01-25 00:13:38
566
原创 分支和循环语句
注意点:0为假,1为真else是与的if匹配,而不是看对齐程度第一种:只写if第二种:if...else结合第三种: if...else if...else if...else复合语句为什么要用if..else if的复合语句,而不直接多个if语句呢?就是在最后的时候可以不写条件。
2024-01-24 12:19:42
1029
1
原创 exit(1)和return 1 的区别
在除了main以外的函数中调用exit,也会结束整个程序。而return只是退出这个函数,执行下一个步骤。exit用于关闭所有的文件,结束正在运行的整个程序,他将参数返回给OS(操作系统)在main函数结束的时候,会隐性的把整个程序关闭,其实就是用到了exit。return是退出函数,返回值给这个函数。
2024-01-19 10:23:35
350
原创 流和标准流的概念
输出:显示器输出,文件输出,网络上输出等等。我们只要会打开流,操作流和关闭流就可以。好了,到现在我们已经搞清楚我们的scanf和printf为什么是键盘输入和显示器输出,流是一个什么东西。stderr 标准错误流-->输出到显示器界面(我也不太清楚这个是什么,那么可以再找找其他的CSDN)这3种都是有类型的,FILE* 类型,叫作文件指针,文件指针是来维护流的各种操作的。那就是流是一种媒介,是我们和设备之间的桥梁。我们有多种多样的输入和输出方式,输入:键盘输入,文件读取,网络上读取等等,
2024-01-16 20:04:53
374
1
原创 C语言编译链接的过程
(下划线的内容才叫作头文件,#include也是预处理指令)#include 或者 #include"__" 第一种是标准头文件,第二种是本地头文件。编译又包括:词法分析:把程序拆解,比如:array[index]=(index+4)*(2+6);语法分析:语义的静态分析,包括:声明和类型匹配,类型转换。第二步的链接:把多个目标文件(已经编译好的文件)和链接库 通过链接器 产生 可执行文件。第一步的编译又包括三步:1.预处理(也叫作 预编译):把头文件和预处理指令包含到程序中。
2024-01-16 13:40:15
491
1
原创 关于\加数字表示的意思
当\ x_ _ 的时候表示十六进制,如\x0d , 0d的十六进制表示 十进制的13 ,在把13的ASCII码的值找出来,然后就是\ '__'(我也不知道是什么,不知道有没有意义),如果有意义的话,就是转义字符。'\060' 转义字符,060八进制数据,十进制为48,表示ASCII码为48的'0',-->\0转义字符。当\ _ _ _ 表示八进制(八进制:会有3个数字,当第三位不够的时候补0,如\060)\后面可以跟着字符,八进制数字,十六进制数字。'\b' 转义字符,表示退格。会写成 \060。
2024-01-16 10:38:29
510
1
空空如也
C语言中内存区域变量名
2024-04-08
C语言中内存区域变量名和变量数据存储在哪里
2024-04-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人