- 博客(27)
- 收藏
- 关注
原创 AVL树(一)
_kv(kv), _bf(0){}//该节点的左孩子//该节点的右孩子//该节点的父节点int _bf;// 节点的平衡因子,为右子树高度-左子树高度。
2023-11-09 19:05:56
46
原创 错题整理5
构造完父类之后执行子类的构造函数,调用test()函数,再调用func()函数,由于父类已经构造完毕,生成了虚表,并且func()函数也满足多态的要求,构成多态,调用子类的func()函数,m_iVal加1,打印1。new B的时候先调用父类A的构造函数,执行test()很熟,再调用func()函数,由于这个时候还处于对象的构造阶段,没有形成虚表,没有构成多态,因此这个时候的func()函数是父类的func()函数,打印0。C:正确,二叉搜索树遍历一遍,就可以得到一个有序序列,因此,时间复杂度为O(N)
2023-11-01 20:41:58
122
原创 map和set的使用
3、在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除。便利的时候也是走中序遍历。4. map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
2023-11-01 20:37:40
51
原创 C++虚表解析
但是对象不一样,是一个对象的时候,父类对象=子类对象,是把子类对象内的父类部分内容拷贝过来,调用拷贝构造,拷贝的时候不会拷贝虚表指针,原因是拷贝过来,这个时候不能保证多态指向父类,还能调用父类的虚函数,如果拷贝虚表指针,父类对象不能保证一定是父类的虚表,如果被赋值就是子类的虚表了,这样就只能调用子类了,并且析构函数可能会调错。重写的悬殊会覆盖虚表中原来父类虚函数的位置,没有覆盖的虚函数依旧,因此使用父类指针调用子类对象的时候,会进行切片,查找到的虚函数地址是子类的,因此会调用子类重写的虚函数。
2023-10-27 10:15:43
129
原创 C++实现二叉搜索树
(1)树是空树,直接插入接口(2)如果不是空树需要找到插入位置,如果插入的值比当前节点的值要大,就去右子树找插入位置。如果插入的值比当前位置小,就去左子树找插入位置。如果和当前节点的值相等,就返回false,因为二叉搜索树不能存在两个相同的值。递归写法:由于根节点是私有成员,在外部不能访问,因此需要一个成员函数去调用,这也是C++常用的处理方法。这里使用的是节点的引用,就可以在递归途中直接修改节点。
2023-10-26 00:28:14
51
原创 错题整理4
A. 释放父类指针时能正确释放子类对象B. 释放子类指针时能正确释放父类对象C. 这样做是错误的D. 以上全错答案:A解析:当我们new一个子类对象时,将父类的析构函数设置为虚函数,这样释放父类指针时,满足多态场景。20、
2023-10-21 18:35:50
114
原创 错题整理3
C.不是在编译期,而应该在运行期间,编译期间,编译器主要检测代码是否违反语法规则,此时无法知道基类的指针或者引用到底引用那个类的对象,也就无法知道调用那个类的虚函数。C.静态成员函数与具体对象无关,属于整个类,核心关键是没有隐藏的this指针,可以通过类名::成员函数名直接调用,此时没有this无法拿到虚表,就无法实现多态,因此不能设置为虚函数。C1中继承的,一份是从C2中继承的,直接通过D的对象访问b会存在二义性问题,在访问时候,可。A.重写即覆盖,针对多态, 重定义即隐藏, 两者都发生在继承体系中。
2023-10-21 16:38:11
77
原创 错题整理1
第二个“%s”中的5.3可以看成格式“m.n”,其中m代表了打印所占屏幕像素(空格)个数,如果m小于字符串个数,就会把字符串全部打印出来,大于字符串个数的时候,就会补上空格位置,默认是向左对齐。解析:在小端环境下,高字节存放在高地址,低字节存放在低地址,lomglong类型占8个字节,但是printf中又是以%d整形输出的,只会取出4个字节,因此会打印出1 0 2,选B。本题进入第5行的if判断是,左边为真,右边是后置++,先判断后加加,因此也为真,在运行之后b的值为3。中,p[1][2]的值是()
2023-10-07 20:03:33
57
1
原创 模板特化 非类型模板参数 仿函数
通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理。(1)这个相当于是一个函数对象,不用参数也可以进行重载,并且模板的参数是可以根据传进来的实参推出形参的数据类型。C语言中对于数组的使用本质是一个指针的解引用,但是array是一个函数调用,因此可以检查出来越界。(1)类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
2023-09-27 19:30:12
44
1
原创 String模拟实现
为了更方便使用,我们直接写一个全缺省的构造函数。这里_str不能等于空指针,若是空指针,1对其解引用就会报错,也不能是空格,因为字符串初始时不一定是空格,这里可以是"\0"。
2023-09-27 19:02:48
51
1
原创 Linux进程控制
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合,这个集合被称之为PCB,在Linux系统下PCB是task_struct。(1)task_struct是用于描述进程的结构体,他会被装载到RAM(内存)中,并且包含着进程的信息。(2)进程=可执行程序+内核数据结构(PCB),PCB方便OS对进程进行管理。
2023-09-25 23:07:46
43
1
原创 Linux权限和管理
超级用户(root)、普通用户。(1)超级用户:可以再linux系统下做任何事情,不受限制。(2)普通用户:在linux下做有限的事情。(3)超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
2023-09-11 19:58:55
112
原创 vector模拟实现
当容量不够的时候,会发生扩容,这个时候_start等迭代器已经变换了位置,原来迭代器pos指向的位置已经失效,这个就是迭代器的内部失效,这个时候需要再扩容前记录下来pos和_start的相对位置,在扩容之后进行更新。不要使用memcpy函数拷贝数据,如果数据是内置类型或浅拷贝的自定义类型,使用memcpy是没有什么问题的,但如果数据是需要深拷贝的自定义类型(string),问题就出现了,会有浅拷贝的问题。由于不确定成员变量的类型,需要用匿名对象提供缺省值,并且因为匿名对象有常性,因此需要加上const。
2023-08-11 20:55:09
50
1
原创 C++类与对象
构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。当有多个参数,但是创建对象时后两个参数可以不传递,没有使用explicit修饰,也具有类型转换作用。
2023-07-30 11:57:14
119
1
原创 C++入门(二)
在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器 默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。原因:在链接的时候会用函数名修饰规则去链接函数,内联函数在使用的时候就展开了,没有生成指令和栈帧,就不会生成地址,符号表中没有地址,可以理解为内联函数在符号表中没有地址。以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
2023-07-23 08:35:31
27
原创 C++入门(一)
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效。是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表不同,常用来处理实现功能类似数据类型不同的问题,缺省参数是声明或定义函数时为函数的参数指定一个缺省值。)函数的地址可以理解为第一个指令的地址,因此函数只有声明没有定义的时候是不会有地址的,也不会有栈帧,在符号表中找的时候也找不到。
2023-07-18 14:09:20
49
1
原创 C语言实现排序算法
任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。1、基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排 序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。最好是O(n),最好的时候是顺序。(1)gap越大,大的数可以更快的到后面,小的数可以更快的到前面,数组越不接近有序。
2023-07-15 14:36:42
222
1
原创 一些排序算法,用C语言实现
1、基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排 序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。(2)gap和数组的大小有关,最常用的就是gap=n/3+1,这样对一次最大的数可以三次挪到最后,+1是保证最后一次一定是1。(1)gap越大,大的数可以更快的到后面,小的数可以更快的到前面,数组越不接近有序。gap越小,大的小的挪动越慢,但是越接近有序,gap==1的时候,就是直接插入排序。(2)时间复杂度:O(N^2)。
2023-07-08 11:14:36
30
原创 栈和队列的模拟实现
其中表尾又被成为栈顶,表头成为栈底。这也是一个限定,只能访问栈顶,任何元素必须从栈顶插入或移除,这又称为后进先出的线性表(last in first out)。队列是一种先进先出的线性表。在表的一段(表尾)插入,在标的另一端(表头)删除。(2)出栈:栈的删除操作叫做出栈。栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。限定尽在一端进项插入和删除操作的线性表。栈是一个特殊的线性表或者集合,是。
2023-07-06 19:58:30
90
1
原创 通讯录动态版
******新增代码******//******新增代码******/printf("请输入名字:>");printf("请输入年龄:>");printf("请输入性别:>");printf("请输入电话:>");printf("请输入地址:>");printf("增容成功\n");
2023-03-27 01:11:15
28
原创 C语言结构体和位段
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。(4)如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大的对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍。最大对齐数包含嵌套的结构体成员的对齐数。例如位段A,第一个是int,先开辟4个字节,32个比特位的大小,等到d的时候发现不够用了,于是开辟4个字节的大小,总大小就是8个字节。④当一个结构包含两个位段,第二个位段成员比较大,无法容纳与第一个位段剩余的位时,是舍弃剩余的位还是利用也是不确定的。
2023-03-26 09:54:36
123
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人