自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(90)
  • 收藏
  • 关注

原创 linux18:进程等待

1:子进程创建的目的是要完成父进程指派的某个任务,当子进程运行完毕退出时,父进程需要通过进程等待的方式,回收子进程资源,获取子进程退出信息(子进程有无异常?没有异常结果是否正确?检查退出码查看错误原因)2:父进程如果一直不回收,就可能造成子进程‘僵尸进程’的问题,子进程一直得不到父进程的回收,进而造成内存泄漏。3:子进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力杀死一个已经死去的进程。只能通过进程等待将他进行回收。

2024-04-20 19:08:26 1123

原创 linux下利用c++测试数据比对py代码的准确性

6: find . -type f | grep put| sort | xargs md5sum > alt.md5 将输入、输出文件整理成有序列表,制作std.md5。4:find . -type f | grep put| sort | xargs md5sum >std.md5 将输入、输出文件整理成有序列表,制作std.md5。3:/usr/bin/time ./r100-run.sh 用/usr/bin/time计时第二步封装的测试脚本。

2024-04-14 17:00:36 392 1

原创 Linux调试器-gdb使用

在Linux下使用GBD(GNU Build Debugger)进行调试时,release,debug是两种不同的编译选项,它们分别对应不同的编译配置。只有将release编译配置更改为debug,才能使用gdb调试通常用于生产环境的编译,它通常会启用一些优化选项以提高编译速度和程序性能,同时可能会关闭一些调试信息。则主要用于调试,它通常会包含更多的调试信息,以便于开发者在调试过程中查看和跟踪程序的运行状态。

2024-01-07 21:45:04 960

原创 将linux的代码上传至gitte,从创建到linux命令详解

选择语言根据自己的需求,gitignore点击同样语言即可,可以避免上传除目标代码外的其他过多文件输入红色区域命令行 ---》 git --help 如果出现蓝色区域则说明已安装如果没有安装则输入--》 yum install git 输入命令 --》 git clone 你的远端仓库路径进入本地仓库,如果出现蓝色的这仨个文件夹则说明成功:如果遇到问题: git上传提交的时出现:Please tell me who you are.问题分别输入一下两行命令git confi

2024-01-04 19:53:32 394

原创 Linux第一个小程序-进度条(c语言版)

在学习进度条小程序之前,我们要先了解行缓冲区概念:首先:在Linux中,行缓冲是一种缓冲方式,它指定了输出流何时刷新到文件或终端。根据行缓冲的概念,当输出到流的数据遇到换行符('\n')时, 缓冲区会被自动刷新,并将数据发送到文件或终端。总结 : 当遇到换行符('\n')时,缓冲区的输出会立即显示出来。其次:在另一方面,如果没有遇到换行符,那么数据将保留在缓冲区中,直到达到以下条件之一:是一个函数调用,它强制刷新stdout(标准输出)流的缓冲区。通过调用这个函数,你可以确保在遇到换行符之前,所有的输出都立

2023-12-26 22:32:19 1252

原创 map与set的封装

红黑树的结点 与 红黑树的迭代器红黑树的实现:迭代器:红黑树的查找:红黑树的插入:检查红色结点:红黑树的左旋红黑树的右旋红黑树的双旋Map的封装set的封装

2023-11-19 22:00:10 525

原创 红黑树的模拟实现

/2->父亲是红色结点,爷爷一定为黑色结点,将爷爷节点变成红色,父亲节点变成黑色,当叔叔结点存在且为黑色的时候,叔叔路线多了黑色结点,叔叔结点这一路线损失去一个黑节点,将parent红节点旋转变黑向上;void RotateL(Node*& parent) //左单旋 调整父子节点树中顺序,建立链接(parent与cur,parent的parent与cur),调整平衡因子。

2023-11-15 16:15:02 87

原创 AVL平衡树的插入

void RotateL(Node*& parent) //左单旋 调整父子节点树中顺序,建立链接(parent与cur,parent的parent与cur),调整平衡因子。else if (abs(parent->_bf) == 2)//4:平衡因子为2/-2时,表示parent的树高度已经需要旋转,降低树的高度。else if (abs(parent->_bf) == 1)//平衡因子为1 / -1时,表示parent的树高度有变化,会影响其祖先。//1:将cur的右节点放入parent的左结点。

2023-11-07 16:01:42 126

原创 map与set

lower_bound函数返回的是第一个大于或等于给定值的元素迭代器,而upper_bound函数返回的是第一个大于给定值的元素迭代器。这个函数的主要目的是复制链表的结构,同时保留随机指针的功能。整体思路是通过map来统计单词出现的次数,然后通过对map中的键值对进行排序得到频率最高的前k个单词,并返回这些单词的列表。首先,创建了一个名为set的set集合对象。,它接收一个链表的头节点作为输入,并返回复制后的链表的头节点。以下代码是一个测试函数,用于演示set集合中的find函数和count函数的使用。

2023-10-26 08:57:25 96

原创 隐式类型转换

什么是隐式类型转换,多参数的造函数隐式类型转换,和单参数的构造函数隐式类型转换有什么区别。2:调用Int的构造函数 //将int类型的5调用Int构造函数 进行类型转换。b:单参数的构造函数隐式类型转换是通过调用构造函数来转换数据类型。a:多参数的构造函数隐式类型转换是通过构造函数本身进行类型转换。d:多参数的构造函数隐式类型转换则涉及到对象的创建和初始化。c:单参数的构造函数隐式类型转换通常涉及到数据类型的特定值。1:多参数的构造函数隐式类型转换。2:单参数的构造函数隐式类型转换。

2023-10-20 23:04:19 724

原创 二叉树的遍历

2023-10-11 16:58:19 39

原创 根据二叉树创建字符串

2023-09-25 12:51:51 40

原创 BST搜索二叉树

首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情。将被删除的数替换成另外一个最符合二叉搜索树的树:右边的最小值,或者左边的最大值。情况c:父结点指向被删除结点的右孩子结点--直接删除。情况b:父结点指向被删除节点的左孩子结点。d. 要删除的结点有左、右孩子结点。b. 要删除的结点只有左孩子结点。c. 要删除的结点只有右孩子结点。a. 要删除的结点无孩子结点。3. 二叉搜索树中元素的删除。4. 二叉搜索树中元素的遍历。5 二叉搜索树中元素的查找。二叉搜索树中放入元素。

2023-09-23 16:29:17 84

原创 c++11 override 和 final 关键字

如果一个类不想被继承:下面分别提供了c++98 和 c++11的不同写法。c++ 11 的写法:final最终类。

2023-09-10 12:02:45 120

原创 多态语法,析构多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。继承中要构成多态两个条件1.必须通过基类的调用虚函数2.被调用的函数必须是虚函数,且。

2023-09-09 20:32:03 179

原创 继承和组合

组合has-a通常用于描述整体与部分的关系,比如一个汽车由引擎、轮胎等部件组成。C++中,继承和组合是面向对象编程中的两种重要的代码复用方式。继承is-a 通常用于描述父子的关系,比如植物-花。

2023-09-08 18:56:46 169

原创 继承的偏移量问题

下面是实际测试:p1 = p3!!

2023-09-08 16:16:59 110

原创 c++继承

在C++中,继承(inheritance)允许一个类(称为子类或派生类)从另一个类(称为基类或父类)继承属性和行为。这种关系被称为"is-a"关系,表示派生类是基类的一种特殊类型。通过继承,派生类可以获得基类的成员变量和成员函数,而无需重新编写相同代码。派生类可以添加自己的特定数据和成员函数,并重写基类中的方法以满足特定需求。

2023-08-08 15:26:55 104

原创 反向迭代器

typedef ReverseIterator<iterator, T&, T*> reverse_iterator;//反向迭代器 typedef ReverseIterator<iterator, const T&, const T*> const_reverse_iterator; reverse_iterator r_begin() {

2023-08-04 21:43:15 148

原创 优先级队列(堆)

优先级队列(Priority Queue)是一种特殊的队列,每个元素都有一个与之相关的优先级。在优先级队列中,元素按照优先级的高低排列,具有较高优先级的元素会被首先取出。优先级队列常见的操作包括插入和删除最大/最小元素。插入操作将元素按照其优先级插入到合适的位置,而删除操作则从队列中移除具有最高优先级的元素。对于最大优先级队列,最大元素永远处于队列的头部,可以快速访问并删除。void AdjustDown(int i) //向下调整 ,大根堆。//模拟实现优先级队列PriorityQueue。

2023-08-04 16:37:24 121

原创 数组中的第K个最大元 O(N)

被用作最小堆(较小的元素位于顶部)。想法是始终维护一个最小堆,其中包含目前为止遇到的k个最大元素。的剩余元素时,如果找到了更大的元素,则它将替换掉最小的元素。因此,该代码使用大根堆的性质在O(nlogn)的时间复杂度下找到了第k大的元素。中遇到的k个最大元素,并且其中最小的元素将位于顶部(来逐个排除前k-1个最大的元素,即每次都执行。,即堆中剩余的最大元素,也就是第k大的元素。这确保了第k大的元素也存在于最小堆中。大根堆会自动将较大的元素放在堆顶部。请注意,你需要找的是数组排序后的第。中包含第k大的元素。

2023-08-03 22:02:30 217

原创 queue的模拟实现

2023-08-03 16:13:43 36

原创 stack模拟实现-适配器

的接口转换成了一种先入后出(Last-In-First-Out,LIFO)的栈的接口。适配器模式的思想是使用包装类(即适配器)来封装已有类,提供新的接口以满足特定需求。在C++中,适配器模式常用于对容器类或者容器类的操作进行封装和拓展。的适配器实现,底层容器提供了基本的存储与访问操作,而。通过封装这些操作,提供了更高级别的栈操作,如。它将一个底层容器(默认为。

2023-08-03 14:51:20 74

原创 二叉树的层序遍历

给你二叉树的根节点root,返回其节点值的。(即逐层地,从左到右访问所有节点)。

2023-08-02 21:50:11 259

原创 逆波兰表达式求值

该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。返回一个表示表达式值的整数。

2023-08-02 18:25:10 123

原创 栈的压入,弹出序列

栈的压入弹出序列问题可以通过模拟栈的压入和弹出过程来解决。

2023-08-01 19:32:06 269

原创 155. 最小栈

由于每个操作都只需要对两个栈进行一次操作,所以其时间复杂度均为O(1)。要设计一个能在常数时间内检索到最小元素的栈,可以使用两个栈来实现。

2023-08-01 16:38:07 66

原创 list的模拟实现

2023-08-01 15:34:46 34

原创 list功能测试

2023-07-21 14:26:29 39

原创 vector模拟实现

void test_vector3() ////深拷贝与浅拷贝,这里默认的是浅拷贝 1:v与v1指向的是同一个地址 2:~空间会被释放两次。//赋值拷贝->深拷贝(拷贝构造)这句话的理解是,当调用begin()函数时,会返回一个_iterator类型的对象,它是_start的拷贝。由于拷贝的是_start的值,而不是_start本身,所以对返回的对象进行修改不会影响到原始的_start。由于拷贝的是_start的值,而不是_start本身,所以对返回的对象进行修改不会影响到原始的_start。

2023-07-20 13:32:28 31

原创 17.电话号码的字母组合问题

当我第一眼看到这题的时候,我直接举出来一个列子“258”,直接套用多重for循环遍历可以罗列出来,但是根据数字组合的长度不能确定for循环的多少(除非把所有for循环个数情况都罗列一遍)创建一个字母映射表,用于将数字映射到对应的字母。例如,可以使用一个数组,数组的索引表示数字,数组的值表示对应的字母字符串。在递归函数中,首先判断如果当前位置等于电话号码长度,说明已经生成了一个完整的组合,将其添加到结果集中,然后返回。我们可以将电话号码的每个数字映射到一个字母数组中,然后根据输入的电话号码找出可能的组合。

2023-07-10 22:23:47 227

原创 vector [] 赋值出现的报错问题

预留了容量为 10 的空间,但是这只是预留了内存空间,并没有实际添加元素。函数用于提前分配存储空间,以避免每次添加元素时重新分配内存的开销。后面添加元素,或者在初始化时直接使用带有初始值的构造函数。下面这段代码的作用是创建了一个整数类型的vector(总而言之,这段代码的作用是创建一个大小为。当代码运行时,出现assert错误。进行赋值,但是在此之前,并没有向。中的元素时,将会导致越界错误。内存访问越界:在循环中使用。的整数向量,并将数字。

2023-07-09 10:48:13 598

原创 C++ 库 vector初始化方式

初始化的一些示例,实际上还有其他方式来进行初始化。根据需求和具体情况,选择适合的初始化方式即可。可以使用范围初始化语法来从另一个容器或迭代器范围内初始化。可以使用带有两个参数的构造函数来指定。可以使用无参构造函数来创建一个空的。进行列表初始化来创建。创建一个空的整数向量。

2023-07-08 21:15:41 666

原创 string里的substr的返回值深拷贝

是指创建一个新对象,并将源对象的所有数据成员复制到新对象中,包括基本类型数据和指针所指向的内存内容。因此,在深拷贝中,新对象会拥有自己的内存空间,与源对象完全隔离,修改其中一个对象不会影响另一个对象。当对象包含指针时,深拷贝将会为目标对象分配新内存,并将源对象指针指向的内容复制到新内存中,从而避免了指针共享所带来的问题。然后,创建一个新的字符串对象。当我们return tmp时,返回的是tmp临时拷贝对象,当。对象所占用的内存将会被释放,该对象将被销毁。是一个自动变量,它的生命周期限定在函数的作用域内。

2023-07-07 14:17:16 150

原创 有参构造,无参构造,半缺省构造

如果未提供任何构造函数,编译器将生成一个默认的无参构造函数,但如果你定义了其他带参数的构造函数,编译器将不会自动生成无参构造函数。C++ 中的有参构造函数(Parameterized Constructor)是一个类中带有参数的特殊成员函数,用于创建对象并根据传入的参数对对象的成员进行初始化。在C++中,缺省构造函数(Default Constructor)是一种没有参数的构造函数,它会被自动调用来创建一个类的对象。在C++中,无参构造函数是一个没有任何参数的特殊构造函数。类有一个无参构造函数,当创建。

2023-07-06 08:07:25 287

原创 string函数的模拟实现

/所以发现默认拷贝构造函数 通过 值/浅拷贝 将s1的_str拷贝给了s2的_str 使得s1,s2指向了同一块空间。while (end >= (int)pos) //后移 //pos等于0时,end会变为-1 ,//所以end不能为size_t ,size_t pos 为防止和-1 的end比较,直接强转为int。if (n > _capacity) //开辟新空间,拷贝,删除旧空间。//当析构的时候,这种内置类型相同地址的值拷贝的地址会被析构两次,程序将出现异常。

2023-06-01 19:42:16 688

原创 c++类和对象 运算符重载

C++中的运算符重载是指在类中定义运算符(+、-、*、/、%、==、!=、、=)的行为。通过运算符重载,可以使得类对象可以像基本数据类型一样进行运算。

2023-05-06 22:36:03 102

原创 拷贝构造函数

拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(- -般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。若没有写拷贝函数,编译器会生成默认的拷贝构造函数,默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。2.拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。传参->拷贝构造->传参->拷贝构造->传参->拷贝构造->传参->拷贝构造。1.拷贝构造函数是构造函数的-一个重载形式。

2023-05-05 22:48:23 58

原创 c++的构造函数与析构函数

析构函数也是一种特殊的成员函数,用于在对象销毁时释放对象占用的资源。当对象被销毁时,析构函数会自动调用,以释放对象占用的资源。构造函数是一种特殊的成员函数,用于在对象创建时初始化对象的成员变量。当创建对象时,构造函数会自动调用,以初始化对象的成员变量。1. 构造函数和析构函数都是特殊的成员函数,不需要显式调用,会在对象创建和销毁时自动调用。5. 构造函数和析构函数都可以被继承,派生类可以调用基类的构造函数和析构函数。2. 构造函数用于初始化对象的成员变量,析构函数用于释放对象占用的资源。

2023-05-05 21:09:51 401

原创 c++内联函数inline

3. 编译时间增加:由于内联函数的代码需要在编译期间进行展开替换,因此,当内联函数非常大或在多个不同的源文件中多次使用时,会导致编译时间显著增加。当C++程序使用内联时,编译器会将内联函数的代码复制到每个调用该函数的地方,在编译时进行代码替换,从而消除函数调用的开销。其中,inline 指定这个函数是内联函数,在编译时会将该函数的内容嵌入到调用它的位置处,返回类型和参数列表与普通函数相同。4. 模板和类中的函数:在模板或者类中定义函数的时候,如果希望代码更高效、代码量更少,则可以使用内联函数。

2023-04-21 22:39:58 441 1

javaweb的gms代码

javaweb的gms代码

2024-01-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除