- 博客(39)
- 问答 (1)
- 收藏
- 关注
原创 C++关于树的基础知识
完全二叉树是一种特殊类型的二叉树,其中树的所有级别都被完全填充,除了最低级别的节点从尽可能左侧填充之外。另外可以理解为:遍历一个完全二叉树的所有结点都能在满二叉树中找到一一对应的结点,满二叉树一定是完全二叉树,但是完全二叉树不一定是满二叉树。
2024-10-09 18:51:06
1342
原创 C++面试:进程、线程、协程
协程的本质是运行在用户态的一个线程,在堆区模拟出来一块空间,分配一个协程号,然后分配到寄存器,则成功创建一个协程。切换时完全在用户态进行操作,对操作系统来说是透明的,所有的调度由用户自己完成。从安全性角度:进程中的某个线程挂掉了,则整个进程全部挂掉;从相互切换角度: 进程间的相互切换比较重,需要切换页表,本身是一个开销,而线程相互切换只需要切换硬件上下文。从内存角度:线程没有自己独立的虚拟地址空间,但是每个进程都有独立的虚拟地址空间。是操作系统分配资源的基本单位,进程的三大状态:堵塞态、就绪态、运行态。
2024-10-08 21:32:54
349
原创 C++关于链表基础知识
/ 结点的定义T data;//指向下一个node 的类型与本node相同// 最后一个node指针指向Null生成结点: Node * p = new Node < T>;为结点赋值: p-> data = 'a';p- > next = (其他结点的地址);(尾结点)delete p;//释放结点// 单链表的类实现public : //此处是函数定义LinkList();T Get(int);//查找//定位//插入//删除。
2024-10-06 14:00:27
681
原创 C++容器类型内置函数随笔
添加数据 vector v;v.push_back(数据);访问数据的两个迭代器b.begin()和v.end()动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间vector称之为单端数组,如下图:无参构造:有参构造://直接赋值迭代器中间的数据n个elem方式://10个100拷贝构造:判断是否为空 v1.empty()
2024-10-03 22:32:37
1072
原创 STL基础知识及进阶!
提高代码复用性、可重复利用;为了建立数据结构与算法的一套标准,诞生了STLstandard template library 标准模板库广义上分为:容器、算法、迭代器核心思想:模板类、模板函数。
2024-10-03 17:17:17
275
原创 C++函数模板、选择排序实现(从大到小)
函数模板无法发生隐式类型转换,而普通函数可以发生隐式类型转换,除非函数模板显式指定了类型。允许普通函数与函数模板发生重载 ,调用时优先调用普通函数。(前提是两者都有声明和实现)若要调用函数模板,需要使用空参数。
2024-10-03 15:06:55
332
原创 C++文件操作
文件操作头文件文件类型分为两种1.文本文件——文件以文本的ASCII码形式存储在计算机中2.二进制文件——文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们操作文件的三大类:1. ofstream:写操作2. ifstream: 读操作3. fstream : 读写操作。
2024-10-02 22:42:41
318
原创 C++访问权限
保护权限 protect 成员类内可以访问 类外不可以访问 子类可以访问父类中的保护内容。私有权限private 成员类内可以访问 类外不可以访问 子类不可以访问负类私有内容。公共权限 public 成员类内可以访问 类外可以访问。
2024-10-02 22:16:19
160
原创 C++多态、抽象类、虚函数和虚析构
C++可以进行 父子之间的类型转换,一个全局函数形参是父类,可以生成一个子类对象直接传入作为实参,但是此时对于父类子类的同名函数,首先应该调用的是父类的成员函数,因为此情况属于地址早绑定(因为该全局函数的参数是父类地址,在编译阶段就确定)其内存占用为1,因为属于一个空类,其成员函数不属于类的内存空间(非静态成员函数、静态成员函数、静态成员变量都不属于)解决该情况就应该使用虚函数构建动态多态,在父类同名函数前加入virtual,使其在。(重写的概念:不同于重载,其函数返回值类型、函数名、参数列表都完全相同)
2024-10-02 20:59:36
421
原创 C++仿函数( 调用运算符重载)
void operator() (string text1 ) // 对“()”的运算符重载。// 比较像一个函数所以成为仿函数。
2024-10-02 16:13:40
351
原创 C++常函数
当使用const修饰了成员函数成为了常函数时,对象中的this变成了指向const的const指针,值也不可以改了(即在成员函数后面加cosnt,修饰的是this 指向,让指针指向的值也不可以修改了)//如果此时Person对象内还有一个函数并不是常函数,则p只能点出来showPerson:p.person,而不能点出来其他非常函数。//在新建对象的前面加上const,变为常对象。this指针的本质是const指针(指针的指向不可以修改,但是指向的值可以修改)//错误,同样不可以修改。
2024-10-02 11:14:49
218
原创 C++类中的内存占用
若类中再定义了一个静态成员函数,static void func(){};类的对象还是4字节内存大小,因为静态成员函数也不属于类的对象上。类的对象还是4字节内存大小,因为静态成员变量不属于类的对象上。若类中再定义了一个成员函数,void func(){};类的对象还是4字节内存大小,因为成员函数也不属于类的对象上。对于一个空对象,占用的内存空间是1字节,是为了区分空对象占内存的位置。此时再创建类的对象,就是4字节内存大小。
2024-10-01 15:48:22
342
原创 C++深拷贝与浅拷贝
如果利用编译器提供的拷贝构造函数,会做浅拷贝操作,有可能会带来堆区的内容重复释放的问题。解决问题的方法是用户覆写拷贝构造函数,重新开辟一个内存空间来存放数据。//编译器自动实现的是这行代码, 实现浅拷贝的操作。cout
2024-10-01 13:19:17
357
原创 C++构造函数和析构函数
注意:只有在对象执行完销毁时才执行析构函数,比如在main()中实例了一个对象,则会在整个程序运行最后才会调用析构函数。另外:调用无参的构造函数不能加括号:Person p2();(如果自己不写这两个函数,编译器会自动提供这两个函数,由编译器自动调用,由编译器提供的这两个函数是空实现)拷贝构造函数:把一个对象的所有成员属性拷贝到另一个类中。按照参数分类:有参构造和无参构造。3、不可以有参数,不可以发生重载。3、可以有参数,可以发生重载。4、自动调用且调用1次。4、自动调用且调用1次。
2024-10-01 11:37:56
321
原创 C++基础知识代码版本
动态获取数组长度:sizeof(arr)/sizeof(arr[0]).../ 九九乘法表while练习。/*函数返回类型可以是结构体。读取输入元素入数组大。
2024-09-30 15:02:19
331
原创 C++关于函数的进阶tip
/此处的a 作为一个变量调用的是第一个func()2、如果函数的声明有默认参数则函数的实现就不能有默认参数了,声明和函数只能有一个默认参数。//此处作为一个常量传入,调用的是第二个func()cout
2024-09-30 14:56:37
216
原创 C++ static关键字
/sum将一直存在直到程序结束。static可以将修饰的局部变量生命周期延长到整个程序执行。static可以修饰变量和函数。
2024-09-29 22:28:00
256
原创 C++函数返回指针
int * add (int a , int b ){ //在返回值类型后面加 * 表示返回一个指针。//必须使用动态内存地址,不然会返回个寂寞。return sum;delete out;
2024-09-29 22:23:54
351
原创 C++引用、引用传参 、常量引用、引用在函数参数和输出中
引用:变量的一种别名。是某个已经存在变量的另一个名字。但是不可以后期从一个变量的引用变成另一个变量的引用。相对于指针,指针可以修改指向,但是引用不行。对a 或者b进行赋值更改,另一方也会变。函数的形参的一种方式。
2024-09-28 22:08:31
221
原创 C++数组作为函数参数
上述代码中,在arrsize函数中传入的arr[]仅仅是一个指针,无论arr数组长度多长,在64位系统中一个指针的大小就是8字节(byte)void fun2 (int arr[10]) // 由于此处传入的数组参数当作一个指针,则有无10都没有意义。基本上作为参数传入的数组很难去统计其长度,则一般length作为参数传入进去。由于数组对象本身只是第一个元素的地址,所以数组传参不区分值传递还是地址传递。只要函数的参数传入的是一个数组,则本质就是传递的指针。
2024-09-28 21:31:42
398
原创 C++重要易混淆知识点:const关键字
表示指向区域的数据,是不变的,但是可以变换指向,如一个指针指向内容为int=10的区域,10是不可变的,但是指针可以变换指向为int=20的内存区域。其中,10和20都是不可以更改的//可以理解为只读指针*p = 20;//错误!,*p所指向区域的值是无法修改的,10是固定的p = &num2;//正确,可以修改指向为num2的地址。
2024-09-28 11:10:08
211
原创 C++指针悬挂问题
/把p1的值也指向p2,即p2也指向int =10的内存空间。指向一块int =10 的内存空间。此时 delete p1;把p1 回收,则p1指针和他所指向的内存空间将消失。则p2不可以在正常使用,因为其指向的区域已经被回收了,此时p2随机指向。如果再对P2进行操作,则会形成指针悬挂问题,可能造成严重崩溃。
2024-09-28 10:51:02
218
原创 C++动态内存分配
/=申请一个二十个字节的内存空间。new运算符用于申请并分配内存空间,提供指向该空间的指针(内存地址)delete运算符用于释放内存,仅仅可用于new运算符申请的内存区域。p [0] = 10;//等同于 *p =10;new double;//申请一个8字节的内存空间。等同于 *(p+1) =10;* (p+1)=2;delete #//是非法的。这种写法把指针看作数组变量,静态内存是程序自行删除。
2024-09-26 21:47:52
158
原创 默认网关配置计算(例题)
首先根据子网掩码的二进制表示:11111111 . 11111111. 11111111. 11111000。去掉一个网路地址和一个广播地址,则可以使用的主机IP地址数量是 :8-2=6个可用的主机地址。则可用的主机地址范围从网络地址的后一到广播地址的前一个。前面29位表示网络部分,剩下3位0表示主机部分。默认网关通常是子网中的第一个可用主机地址,即。将子网掩码按位取反,得到子网中主机部分全为。则该子网的主机数量是2的3次方 = 8。,与网络地址进行按位或(OR)运算,得到。
2024-09-23 22:01:23
440
原创 C++指针基础
注意:指针变量的类型取决于所存放的地址指向的数据类型,此处为int。使用时*p表示取出指针p执行内存区域的数据。* p = 20;//等同于num = 20;//输出的num 的值。指针:特定类型数据在内存中的存储地址,即内存地址。cout
2024-09-23 19:57:26
138
原创 计算机网络:用户输入网址访问浏览器的过程
二次握手:服务器收到SYN包之后,回应一个SYN+ACK(确认应答)包,确认收到请求,三次握手:客户端接收服务器的SYN+ACK后,再发送一个ACK确认应答包,确认数据正确。一次握手:客户端发送一个SYN (同步序列号)包给服务器,请求建立链接。5、TCP挥手关闭链接,浏览器接收到的服务器给到的HTML代码,开始解析。2、 建立TCP链接,发生TCP的三次握手,发生在 传输层。4、服务器处理相关的请求并返回处理后的相应结果。6、浏览器将解析后的各类资源渲染给用户。3、客户端发送一个HTTP请求。
2024-09-23 11:07:16
270
原创 C++内存管理
静态存储:静态存储是整个程序执行期间都存在的存储方式,让变量成为静态的方式有两种,一种是在函数外定义,另一种是声明变量时使用关键字static, static int num = 10;堆区: 一般由程序员分配, 也由程序员释放,也可程序结束时由系统回收,如new动态数组,应该由delete[] 来手动释放,不然可能内存泄漏。自动存储:函数内部定义的常规变量,在所属函数被调用时产生,函数结束时自动消亡,自动变量通常存储在栈中(先进后出)常量区:存放常量值,如字符串常量,不允许修改,程序结束后由系统释放。
2024-09-21 12:39:50
163
原创 new创建动态数组·
/正确,这是在程序运行阶段就传入new 中的确定的值,不会报错。// 错误,在编译阶段,编译器需要明确知道传入数组的长度,不能是变量。不要使用delete释放同一个内存两次,不要使用delete来释放不是new分配的内存。//对第一个元素赋值,因为指针p是指向的第一个元素。对于new创建的数组,使用delete[] 来释放。new运算符返回第一个元素的地址给指针parr。对空指针应用delete是安全的,无事发生。p[1] = 20;//对第二个元素赋值。
2024-09-21 12:02:52
273
原创 函数重载C++
函数的重载需要在同一个作用域下,例如不在同一个类中,则不构成重载。函数重载的关键是函数的参数列表,参数数目、类型、排列顺序也不同。overload,C语言中不支持,C++中新增。另外函数的返回值是不可以作为重载的条件。完成相似的功能,但使用不同的参数列表。
2024-09-21 11:46:27
138
原创 原码、反码和补码
计算机中的存储和计算都是以补码的形式进行的java中byte 占1字节 8bitshort 占2字节 16bitint 占4字节 32bitlong 占8字节。
2024-08-21 12:34:08
379
原创 JAVA数组结构与占用内存
markword 中一般包含三类信息,GC年龄、锁标识和对象 hashCode。4byte = 32bit ,所以决定了数组最大容量是2的32次方。java中所有的对象大小都是8字节的整数倍,不足的要用对齐字节补齐。如int数组,则类指针指向int数组的class。
2024-08-13 18:24:04
169
原创 最高位是符号位或无符号位JAVA
在java中,对于一个队列序号取中值,m = (i+j)/2,可能会有问题,若i+j数值超过了int的最大值(interger.MAX_VALUE),则当超过java中最大正整数能表示的范围则需要把首位看成符号位导致最终相加结果为负数。当最高位是符号位,1111_1111的首位表示负数,负数的二进制转十进制,先取反1000_0000再加1为1000_0001,即-1。为了解决这个问题,使用无符号右移运算符代替,(右移一位除以二,左移一位乘以二),当最高位是无符号位,1111_1111是表示255。
2024-08-06 10:57:07
239
原创 Linux内核and进程调度
概念:上下文切换(英语:context switch),又称环境切换,电脑术语,是一个存储和重建CPU的状态 (内文),因此令多个进程(process)可以分享单一CPU资源的计算过程。要切换CPU上的进程时,必需先行存储目前进程的状态,再将欲运行的进程之状态读回CPU中。人话:p1和p2两个进程,把p1中的一些信息、程序计数器、变量、程序运行到哪了,一些寄存器里存储的值保存下来 ,再去加载p2,运行p2。称为上下文切换,切换执行环境。
2024-08-02 11:33:20
883
空空如也
自建数据集一般怎么翻译啊
2024-09-10
学C#过程中遇到的for和while循环的问题(针对输出1-100中的所有素数的问题)
2022-08-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人