- 博客(44)
- 收藏
- 关注
原创 linux环境变量
本文介绍了环境变量是什么,见了见linux都有哪些环境变量,如何修改某个环境变量,如何查看一个环境变量的值,如何查看所有的环境变量,命令行参数是什么?如何新增环境变量?什么是本地变量?如何查看本地变量和环境变量,如何取消环境变量,什么是内建命令?什么是普通命令
2024-11-08 20:48:17 958
原创 linux进程状态&优先级
本文介绍了进程常见的状态,以及linux中进程的状态,又谈了谈进程的优先级,优先级是什么为什么又怎么修改优先级,以及操作系统是如何根据优先级展开调度的,介绍了优先级调度的大O(1)调度算法。
2024-11-04 19:24:44 609
原创 线程的互斥与同步
本文介绍了线程高并发情况下所带来的问题,由此引入了互斥和同步等机制。在互斥中介绍了锁以及锁的原理和死锁问题,在同步中,介绍了条件变量和CP问题以及信号量等
2024-10-26 07:51:13 969
原创 linux线程
当我们创建一个线程的时候,是将进程的一部分资源分配给线程,让线程去执行,因此,说线程是进程内部执行就是在进程地址空间执行。执行粒度更细的意思是,线程执行进程的一小部分代码,而进程执行所有代码,因此比进程更细。
2024-10-23 15:31:24 569
原创 链表相关OJ
203. 移除链表元素 - 力扣(LeetCode)解法一:尾插到新链表当我们看到这道题的时候,我相信大多数人脑海中的第一个想法就是直接尾插到一个新链表当中。因此,我们可以遍历这个链表,如果当前节点的val不是要删除的数,就将它尾插到新链表 ,最后返回新链表的头。代码:这个地方还是有细节需要注意的, 在最后需要把tail的next置为空。这里tail是有可能为空的,如果为空的话就会报错。因此需要特判一下。比如说题目给的示例3,链表里的数全是7,要删除的也全是7,此时就不会进入尾插的逻辑,tail就是空
2024-09-11 19:02:08 724
原创 数据结构——链表
学习了顺序表就知道,顺序表在大量的头插或者中间插入的时候效率是很低的,需要频繁挪动数据,那么有没有一种数据结构在处理大量头插和中间插入的时候效率非常高呢?是有的,今天我们就来学习一下链表。
2024-09-11 15:59:47 2249 3
原创 数据结构——堆
堆的本质是一个二叉树。与二叉树的区别在于:对于这颗二叉树而言,任何一个子树。根据这种关系堆又可以分为和。1、大根堆大根堆根节点上的数据左右两个孩子大的。看下面的图就很容易明白了。2、小根堆明白了大根堆后,小根堆大家一想便知道了吧,根节点上的数据左右两个孩子小的。这个时候肯定就要有人问了,如果这颗树的所有数据都一样呢?叫大根堆还是小根堆呢?理论上来说可以叫大根堆也可以叫等根堆。
2024-01-14 20:05:34 2070 1
原创 C++特殊类设计
只有拷贝构造和赋值运算符重载才能拷贝,因此只要把拷贝和赋值重载禁掉即可,有两种方式可以实现。将拷贝构造和赋值运算符重载设成私有成员函数。并且只声明不对其进行实现。C++11扩展了delete的使用方法,它不仅可以释放new出来的资源,而且在成员函数后面加上=delete表示让编译器默认函数删除该函数。
2023-10-23 15:35:02 48
原创 AVL平衡树
我们知道二叉搜索树是非常适合查找的,但是如果它的数据是有序的,或者接近有序,那么它其实就退化成了在顺序表中查找,效率是比较低的,因此就有大佬发明出了AVL树来解决这一问题。
2023-09-17 18:44:54 60
原创 C++map_set使用
要注意的是这段代码我们打印了这两个函数的返回值,我们发现是30和70,这是因为erase的时候是左闭右开的。它的返回值大有来头,它的返回值是pair,pair这个单词的意思是一对,一双。map的插入要插入一个pair,因为map插入要插入key和val,这两个类型可能不一样的,不好返回,所以把它们两个放在一个结构pair中。[]有插入的功能,如果key在树中,不插入,返回key对应的val,如果key不在树中,将key插入,返回对应的val。set是不支持[]的,并且set的元素不能修改。
2023-08-29 14:08:18 61
原创 数据结构——搜索二叉树
搜索二叉树是在二叉树的基础上增加了一些规则形成的,左边结点的值比根结点小,右边结点值比根结点大。(1)如果左子树不为空,那么它左子树上结点的所有值都小于根结点。(2)如果右子树不为空,那么它右子树上结点的所有值都大于根结点。(3)左右子树均满足上述条件。
2023-08-24 13:57:14 66
原创 C++多态
多态是不同继承关系的类对象去调用同一个函数产生不同结果的行为。比如Student继承了Person对象,Person是全价买票,Student是半价买票。构成多态还有两个必须的条件:(1)被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。(2)必须通过基类的指针或引用调用虚函数。public:virtual void BuyTick()//虚函数cout
2023-08-20 14:13:19 56
原创 C++继承
student这个类继承了Person这个类,student继承的类称为被称为派生类或子类Person被继承的类称为基类或父类。也就是说student继承之后Person的成员函数和成员变量是student的一部分,其实就是复用了Person这个类。2、继承关系和访问限定符1.很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。
2023-08-16 16:27:16 196
原创 C++栈和队列模拟实现
适配器模式是一种很牛的模式,我们可以根据我们想要的进行适配,但是不都是这么简单的,比如优先级队列,就不仅仅是适配,还要加一些东西。这个模式的本质我感觉就是复用。在栈和队列这里我们复用之后什么构造析构都不用管,因为vector、list有析构和构造函数,对应的功能我们调对应的函数即可,非常好用。
2023-08-12 16:34:26 169
原创 C++ list模拟实现
list的底层是带头双向循环的链表,它可以存放任意数据,因此需要用模板。它功能上的实现其实很简单,但是迭代器是一个比较重要的点,它不是单纯的一个指针,而是一个自定义类型。的成员有两个,第一个是,只不过它的类型是一个经过,这个结点类型有三个成员,指向下一个结点的指针和指向上一个结点的指针,和存放的值。第二个是一个,用来记录当前链表数据个数。
2023-07-20 08:58:33 77 1
原创 C++ vector模拟实现
在这个地方要注意 要先把size(),保存起来,不然扩容之后,_start指向的是新的空间,而_finish指向的还是旧空间,这样size()的结果就是不正确的。也可以自己手写,这里要把成员全部处理一下,处理为nullptr,然后这个地方要注意的是拷贝数据不能用memcpy,否则如果vector内的数据是自定义类型就会出事。内置类型也是可以用构造函数初始化的。这个地方注意pos是迭代器位置,先判断pos合法性,然后直接覆盖即可,这里要返回pos位置的下一个数据的迭代器,也就是pos。就会出现上面的情况。
2023-07-18 13:53:34 170 1
原创 Linux第一个小程序——进度条
我们先开一个数组,有101有效字符加上/0,所以我们大小开102,并且把它全部初始化为0,然后用一个循环,循环101次,每进去一次就打印一次数组,打印的时候要回车\r,让光标回到最左侧,不能\n,否则就不在一行上了,然后我们让cnt的位置填上字符,每一次数组里面的有效字符都会比上一次多一个,因此就会不断往后走,注意要打印百分号需要%%,转动的图标,可以用|/-\\,不断打印每一个字符就会有转动的效果。,通常对于我们来说好像回车和换行是一样的,都是走到下一行的最左边,其实它们是不一样的。
2023-07-17 21:12:12 99 1
原创 数据结构——顺序表
如果我们给的太大了会存在空间浪费,如果给小了空间又不够,会陷入这种尴尬的境地,所以我们最好用动态开辟的。如果数据个数和当前容量相等,说明顺序表需要扩容,至于扩多少,一般可以扩到当前容量的二倍。3、我们需要知道目前顺序表的容量是多少,如果数据个数等于当前容量,我们需要扩容,所以我们还需要一个整形。插入就可能出现空间不够的情况,所以我们需要检查扩容,之后就很简单了,将要插入的值赋值,再让size自增即可。1、顺序表是一种线性的数据结构,所以它的空间是连续的,我们可以用数组或者数据类型的指针来存储。
2023-06-22 09:21:16 187 1
原创 Linux中的权限
(1)权限和人的身份相关权限就是说我们能不能做一件事,比如说我作为一名大学生,我能不能随意进入我们校长的办公室呢?是不能的,因为我不具有这个权限。那校长能进入校长办公室是因为它这个人还是因为它是校长呢?因为它是校长它才能进去,因此权限是和人的身份有关的。(2)权限和事物属性相关我要把腾讯视频当面包吃了可以吗?不可以呀,因为腾讯视频是看视频的,你怎么能吃它呢?它不具有吃的属性呀,就好比我要去足球场上晚自习,可以吗?当然不可以,因为它不具备这个属性。
2023-05-26 13:40:34 751
原创 C++模板
类模板的实例化和函数模板实例化不同,类模板的实例化需要在类模板名字后面跟<>,将实例化的类型放在<>中即可,类模板的名字不是真正的类,之后实例化之后才是真正的类。我们不难发现,其实下面函数的逻辑基本完全一致,不同的只是参数类型而已,那么我们能不能写一个通用的函数类似于模板,可以让所有类型都可以使用呢?如果我们要写交换函数,我们一定会像下面一样写,写多个参数类型不同的函数,来满足我们不同类型的交换需求。用不同类型的参数使用模板称为模板的实例化。并且需要注意,普通类和模板类的类型和类名是不一样的。
2023-05-25 15:20:43 47
原创 C++内存管理
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间//还会调用构造和析构函数free(p1);delete p2;// 内置类型几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;new/delete对于自定义类型,不仅会开空间,并且会调用默认构造。
2023-05-16 21:00:03 392
原创 C++(类和对象下)
目录一、再谈构造函数1.函数体赋值2.初始化列表3.隐式类型转换二、static成员1.概念2.特性三、友元1.友元函数特性:2.友元类特性:四、内部类1.概念2.特性五、匿名对象1.概念2.特性六、对象的使用1.对象传参 2.对象返回值 3.结论七、再次理解类和对象在创建对象的时候,编译器调用构造函数,对对象中的成员进行赋值在调用上述构造函数之后,对象成员会得到一个初始值,但这不是初始化,而是赋值。真正的初始化工作是由初始化列表完成的,尽管我们没有写初始化列表。并且,函数体赋值不是对所以对象成员都可
2023-05-12 13:01:35 48
原创 C++日期类的实现
/是否为闰年//获取某年某月的天数//因为我们可能频繁调用,因此给它搞成静态的,提高效率,我们开13个空间,可以//更好的映射return 29;else//全缺省构造函数_day = day;//拷贝构造函数// {// }//赋值运算符重载 因为加减乘除之间本身就带有互斥性,因此我们完全可以先写> ==,然后//去复用代码return!return!if (this!= &d)
2023-04-30 16:30:40 144
原创 C++(类和对象)中
我们在用一些数据结构的时候,经常要初始化和销毁,有没有感觉到很烦呀,而且有的时候我们还会忘记,那能不能自动调用初始化和销毁呢?是可以的,C++中有6个默认函数,其中构造函数和析构函数就可以解决初始化和销毁的问题。
2023-04-29 19:15:32 143
原创 C++(类和对象)上
举个例子,比如故宫,如果不封装,不去管理,随便我们去看,那故宫墙上肯定到处刻着某某某到此一游,你想干嘛干嘛,那故宫早就惨不忍睹了。解决任何问题都一定是有过程的,过程是由对象完成的,C++关注的是完成过程的对象,过程交给对象就可以,并不需要管,相比C语言来说C++是一种更高级的语言,是从一种更宏观的角度来把握世界。d.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。C++是面向对象的,关注的是解决问题的对象。
2023-04-27 20:37:43 57
原创 C++入门(auto关键字and内联函数)
/编译器会报错在同一行定义多个变量的时候必须是相同类型,不能即推导Int又推导double,编译器只会根据第一个变量进行类型推导。int main()//该代码会报错,因为c和d初始化类型不同return 0;
2023-04-23 18:19:05 144
原创 C++入门(引用)
在上面的代码中m是k的别名,也就是说m就是k,改变了m,k也会改变,反之同理。:如果要返回的是个局部对象,引用做返回值是非常危险的。:引用只能是同类型的引用,就是说你不能用int类型的变量给double类型的变量起别名。就是它必须是另一个同类型变量的别名。既然m和k是一样的,那么m的地址应该和k的地址也是一样的。在语法概念上引用就是一个变量的别名,它是没有独立空间的。(3)引用一但引用了一个变量,就不能在引用其它变量。引用是已存在的一个变量起别名。但是在底层实现上,引用是按照指针的方式实现的。
2023-04-23 15:23:44 71
原创 C++入门(命名空间和std)
我们都知道C++是从C语言发展来的,在C语言中经常会出现命名冲突的问题(库冲突and人与人),我们的祖师爷受够了这种冲突,所以定义了一个命名空间。
2023-04-14 10:53:50 3048 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人