- 博客(28)
- 收藏
- 关注
原创 Linux : 进程概念
回答这个问题前,要先引出一个概念:分时操作系统。分时操作系统是现代主流操作系统,给每个进程都分配了时间片,以相对公平公正的方式调度进程,较为均衡的保证每个进程在一定时间内,都能够使用到CPU资源。一个进程执行一点再切换另一个进程,由于CPU运行速度很快,就好像许多进程都在一起执行。从而达到同时做很多任务的效果。(类似视觉残留)这也是我们所希望计算机拥有的功能。如果计算机每次只能做一件事,做完一件事才能做下一件,那样体验会很差。
2025-11-01 21:20:35
1259
1
原创 Linux 权限
什么是权限?关于某人做某事,能or不能的问题。这里讨论的是用户访问资源的能力。为什么要有权限?Linux作为多用户的操作系统,分为root和普通用户,权限有助于用户管理,从而利于维护和稳定系统的秩序、保证系统和谐使用、保护资源。理解Linux中的权限:权限 = 人 + 文件属性用户用户就是使用操作系统的人,具体到每一个账号。用户分为root和普通用户,root就是管理员,而普通用户就是除管理员外的账号。root作为管理员,是操作系统中具有特权的人--不受权限的制约。
2025-08-05 16:50:59
668
原创 数据结构:位图
位图是一种基于直接定址的紧凑数据结构,通过将整数索引映射到二进制bit位上以存储状态信息。核心原理就是建立高效的直接定址的映射关系:传统数组的整数索引需至少占用1 byte(bool)来进行状态表示;位图将整数索引映射到int型(4byte = 32 bit)的每一bit位上,只需要一bit位就能进行状态表示。即一个int就能表示32个数的独立状态,实现了显著的空间压缩效果,提高了32倍的空间利用率。
2025-07-08 22:54:23
902
原创 常见位运算总结
位运算无非在0和1之间玩来玩去,只有00,01,11的组合当忘记某个运算符的含义或是不能马上反应时,建议画个真值表在一旁。注:&由0决定;| 由1决定获取最低位的1:利用相反数定位最右侧的1,按位与后置0左侧的位。(负数补码为正数原码的取反加1)消除最低位的1:利用n-1定位最右侧的1拓展:位图(有兴趣自行了解)
2025-07-08 10:55:25
311
原创 C++11 智能指针
为了解决此类问题,于是可以采用Resource Acquisition Is Initialization(RAII)的一种管理资源的类的设计思想,本质是:将资源托管给对象,用对象的生命周期来管理资源。用资源初始化对象,之后资源就可以随着对象生命周期结束一起析构。由于析构是一定会调用的,这样就保证了资源托管给对象后,一定能够及时释放,从而避免资源泄漏。
2025-07-07 17:25:08
1075
原创 C++11 lambda
在Cpp11以前,为了把函数当作对象调用,可以使用C中的函数指针类型,也可以使用Cpp98的仿函数。但二者都不是很好用,函数指针 return_type (*name)(parameters)的长相就令人望而却步,仿函数将一个函数重载为一个类的operator()的方式又沉重麻烦。C++11中做出了(抄Python的)更灵活、轻便的lambda表达式。
2025-06-27 21:33:43
1069
原创 C++11 右值引用和移动语义
自定义类型的右值通常是临时对象(自定义类型没有字面量常量),而临时对象马上就要销毁,你的资源不要了,完全可以直接转移给需要的我啊,不能浪费了。push_back的T早在list<T>实例化时就确定了,并不由push_back的参数类型决定,没有推导的过程,所以这只是一个右值引用,用于直接插入右值。现代C++对lvalue的解释不是简单的left value,而是loactor value(意为存储在内存中,有明确的可取的内存地址的对象)”,右值数据在传的过程中变成左值了,走不到对应的函数去了?
2025-06-22 14:33:38
775
原创 C++11特性:可变参数模板
总结一下,emplace系列在接受到构造函数所需参数时,能够直接构造,中间不需要拷贝构造。如此情形下,效率较高;而其他情形的效率没差。(读者可以用list<pair<string, int>>自行感受)但毕竟emplace存在过人之处,哪怕只有一个,也是过人之处。所以以后还是推荐用emplace系列。上述涉及”移动语义“与”右值“的前置知识,建议学完再看emplace部分。。。
2025-05-27 21:32:22
910
原创 数据结构进阶:AVL树与红黑树
AVL树是一棵高度平衡的二叉树,要么是一棵空树,要么是具备以下性质的二叉搜索树:左右子树都是AVL树,左右子树高度差的绝对值<=1。为了方便计算高度差,我们在实现时引入了平衡因子(balance factor),用以记录左右子树的高度差。平衡因子 = 右子树高度 - 左子树高度。所以平衡因子的值就只能为0 / 1 / -1;分别表示平衡、右子树高一层、左子树高一层。当然平衡因子不是必须的,但有了它我们能够更好的观察AVL树。为什么不要求高度差为0呢?显然,假如只有两个结点,就不可能存在此情况。
2025-05-16 23:30:08
1328
原创 C++入门:多态
目前为止,我们已经初步了解了面向对象的三大特性之二的封装、继承。最后一个特性--多态,将在本文进行揭晓。当然正如前文所说,这三大特性我们只能说是初步认识,在没有足够的项目经历之前,感受并不深刻,但这不妨碍我们的学习,终于在未来的某一天,会顿悟的。我们要为此打好基础。多态是一个继承关系下的类对象,去调用同一函数,产生了不同行为。了解了多态的条件和原理后,建议读者将二者建立联系,想想是不是底层原理决定了多态的构成条件,并梳理一下虚函数表的知识。还有关于多继承虚表的知识会单开一张来讲,敬请期待。
2025-04-26 10:05:25
863
1
原创 初阶数据结构:二叉搜索树
二叉搜索树(又称:二叉排序树),是由一些具有特别性质的二叉树衍变而来。只要一棵二叉树具备以下性质,即可称作二叉搜索树。【1】若左子树不为空,左子树上所有结点的值都小于等于根结点的值【2】若右子树不为空,右子树上所有结点的值都大于等于根结点的值【3】根的左右子树也都为二叉搜索树⼆叉搜索树中可以⽀持插⼊相等的值,也可以不⽀持插⼊相等的值,具体问题具体分析。C++的STL中的map\set\mutimap\mutiset的底层就是二叉搜索树,muti-支持重复。
2025-04-24 00:08:29
967
原创 C++入门:继承
能看到Person是基类/父类,Student、Teacher都是Person的派生类/子类。以上就是继承的语法,在定义派生类时带上继承方式和基类即可。
2025-04-22 16:53:26
924
原创 算法入门:双指针 专题
简单说,就是把一个数组划分为两块区域,左区为非零区,右区为零区。只能在原数组进行操作,并且非零区的数字的相对位置不能改变。双指针不同的方向,有着不同的功能单向指针能划分区间,玩快慢指针以及后续的滑动窗口...双向指针能巧妙利用单调性、挪动数据而避免覆盖...还是很有趣的,许多题其实都是在暴力解法上的优化,所以可别把暴力解法看扁就不想了啊......希望这个双指针入门专题对你有帮助,
2025-04-15 20:56:21
1028
原创 Leetcode--1089.复写零(双指针)
简单来说,就是遍历一遍,遇到非零元素抄1次,遇到0抄两次,当抄了原数组元素个数时结束。如果本题可以创建一个新数组来写,就很简单了。遗憾的是,我们只能在原数组进行操作,怎么办?
2025-04-05 19:41:21
364
原创 STL:vector 的模拟实现
第一次失效与insert相关,倘若外面传入了pos,此时在扩容后pos指向的原空间被释放,pos此时就像野指针,需要将pos更新到新的空间,利用与_start的相对位置即可,具体实现见上述。void insert(iterator pos, const T& x) //迭代器失效版//注意!!!while (tmp >= pos) //迭代器失效,pos扩容后失灵tmp--;*pos = x;_finish++;
2025-04-03 00:43:20
610
原创 C++ 类和对象(下)
在类和对象(中)的文章中,我们介绍过构造函数,ta是用于初始化一个新对象的默认成员函数,但是前文中有个坑没填——初始化(成员)列表。当时提到,类类型成员初始化但无默认构造函数时,必须用初始化列表进行初始化,但其实还有一两情况,即给const成员和引用成员初始化也必须用初始化列表。以下是有问题的代码这两种情况就必须用初始化列表。但初始化列表到底怎么用呢?在参数列表后带上 : 然后写 成员(初始值)如果成员有多个,中间用 , 分割。大括号也别忘,因为你仍然可以选择将一些变量放到函数体内初始
2025-03-14 19:52:17
699
原创 C++:类和对象(中)
【1】函数名即是类型名,并且构造函数不要返回值,函数返回值的部分也不要写void,就是空着就行了,就像这样。【2】构造函数的参数怎么写?可以无参,也可以带参,还可以用缺省参数//带参//...;//缺省//...;【3】构造函数可重载析构函数的定义与构造函数类似,但析构函数不需要参数(不算this的隐式传参),最大的区别在于要在函数名前多加一个‘~’。
2025-03-09 19:11:55
593
原创 初阶数据结构:BinaryTree 二叉树
二叉树是结点度<=2的树,一般用链式结构表示。并且二叉树还是递归树,顾名思义,学二叉树会涉及到递归啦。}BtNode;
2025-03-08 21:56:40
1057
原创 C++:类与对象(上)
以下是一个简单的”haha类“,其成员都具有p,q的共同属性,都可以执行add的动作,甚至由于p,q已经是自身的固有属性了,在进行add动作时(调用函数时),可以直接使用。类中变量就是类的属性,类中函数也称类的方法。其格式与C语言中的struct差不多(结尾';'不要忘)。有个方便是不用再typedef了,haha就是类的名字。补充:定义在类⾯的成员函数默认为inline。int q = 10;
2025-03-06 13:36:09
1052
原创 LeetCode.138 随机链表的复制
给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。(深拷贝:创建一个一模一样的全新链表,不能仅是有相同指向的浅拷贝,即。返回新链表的头结点。示例。
2025-03-06 09:12:48
355
1
原创 C++入门基础02
缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。中译中:C++支持给函数的参数一个默认值。倘若函数接受到实参,参数就按照默认值处理。同名函数在C++可以定义了!但也有自己的规则。引用是给一个已存在的变量取"别名",但不会再申请一块空间,其与变量共用一块空间。有别于指针了吧。类型& 引用别名 = 引用对象;性质【1】引用定义时必须初始化。【2】一个变量可以有多个引用(别名)。【3】引用一旦指向一个实体,就不可修改。理解周树人的别名是鲁迅,那我抓周树人不就是抓鲁迅吗!int a = 0;
2025-03-02 21:58:24
535
原创 C++入门基础01
命名空间是C++为了避免C中命名冲突和名字污染所定义的一个新的域,在该域中可以定义与全局作用域中重复的变量、函数等,现在取名字可以重复了(当然不能和关键字重复)。定义的方法即-->namespace DomainName{ ... }int a;double a;int a = 7;在命名空间域中可以定义变量,函数,类型,甚至嵌套定义命名空间。你可能会注意到重复的变量a,add函数,不要担心,C++正是为此才创造命名空间的。那么在你自己定义的域中,你可以为所欲为了?
2025-03-02 20:40:05
432
原创 数据结构初阶:双向链表(基础)
而有了前驱,ta就能回到过去了...}ListNode;不论头尾插,插入是三个结点的事,在插入新增结点时,总是优先处理新结点,再处理原链表中的结点。删除的一般操作都需要新创建一个变量来存待删除的结点。
2025-02-25 16:46:18
312
原创 初入新世界
刚结束了高中生活,受到中学课程的启发,选择走入计算机世界的大门,启蒙是python,现在正式开始学习C。选择进入这个新世界,真正想学会,学懂,至少能作为人生的一项技能,受用终生。希望能先真正学会C这项工具,逐步开启计算机世界的大门。小白只懂得那几个大厂哈哈,作为未来目标吧。自主学习+网课+学校课程+动手实践。
2024-07-12 18:12:02
137
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅