自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 5分钟教你了解技术博客的好处与注意事项

写博客好处:1.检验自己对知识是否真正理解2.累积知识,柔水终成雕刀3.三人行必有我师4.提升思维逻辑能力和文字组织能力5.增加面试竞争力

2023-09-22 11:40:36 202 2

原创 Linux进程控制(个人笔记)

环境变量被子进程继承下去是一种默认行为,不受程序替换的影响,其原因是通过地址空间可以让子进程继承父进程的环境变量数据,程序替换只替换新程序的代码和数据,环境变量不会被替换。如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退。如果子进程根本没有退出,父进程必须在wait上进行阻塞等待,直到子进程僵尸,wait自动回收,返回!父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。

2024-06-20 20:45:25 583

原创 Linux进程概念(个人笔记)

这里是fork后,子进程与父进程的代码共享,数据各自私有一份,子进程会拷贝父进程的task_struct,task_struct里的mm_struct所指向的进程地址空间也会拷贝一份,进程地址空间与物理地址所链接的页表也要拷贝一份,当子进程对其数据进行修改时,会进行写时拷贝,本拷贝下来父子进程代码和数据共享的,因为修改了数据,os会在内存中另开辟一块空间数据进行私有,让子进程页表中虚拟地址所对应的物理地址进行重新指向新的地址,但其虚拟地址并未进行修改,所以造成在语言层面,同一个地址出现两个不同值的情况。

2024-06-19 17:37:21 777 1

原创 Linux开发工具(个人使用)

系统把这些函数实现都被做到名为 libc.so.6 的库文件,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,也就是链接的作用。yum的相关文件会保存你所下载软件的下载路径,yum会去自己的服务器中寻找要下载的软件,而Linux服务器是由各种大厂来进行维护和报销费用,各种经过检测过合格的软件会挂在Linux的服务器上供人下载。最后一列, base 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “华为应用商店”

2024-05-31 15:02:48 1382

原创 Liunx基本指令以及权限(个人笔记)

这个场景如果发生在所创建的目录在公共的区间,也就是拥有者和所属组都是root,张三和李四是other,root开放了目录中other中的w权限,当张三在这个目录下创建的文件,而李四却可以删除张三所创建的文件,这明显是不合理的,但如果root关闭other中的w权限,那么张三和李四都文件都创建不了了,也就没有了意义。功能:less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前不会加载整个文件。i.读(r):r对文件而言,具有读取文件内容的权限;

2024-05-25 16:56:09 948

原创 C++的类型转换(个人笔记)

static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)主要分为两种:隐式类型转换和显式类型转换。

2024-05-18 19:52:31 425

原创 C++特殊类(个人笔记)

解决方案:将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可或者在拷贝构造和赋值运算符重载函数后面加delete。拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。单例模式:一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个。final关键字,final修饰类,表示该类不能被继承或者构造函数私有化。饿汉模式:就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。

2024-05-18 19:28:01 218

原创 C++智能指针(个人笔记)

解决办法就是讲ListNode里的next和prev换成weak_ptr来进行管理,weak_ptr内没有_pcount也就不在参与引用计数,另外需要支持shared_ptr能构造和赋值给weak_ptr。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。-》左边节点的next什么时候析构?-》右边节点的prev什么时候析构?

2024-05-18 15:05:02 819

原创 C++异常(个人笔记)

catch: 在想要处理问题的地方,通过异常处理程序捕获异常.catch 关键字用于捕获异常,可以有多个catch进行捕获。异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。C++提供了一系列标准的异常,可以在程序中使用这些标准的异常。try: try 块中的代码标识将被激活的特定异常,它后面通常跟着一个或多个 catch 块。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。但是大部分公司都有属于自己的异常继承体系。

2024-05-18 11:56:45 883

原创 C++11(个人笔记)

std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。在ljh::string中增加移动构造,移动构造本质是将参数右值的资源窃取过来,占位已有,那么就不用做深拷贝了,所以它叫做移动构造,就是窃取别人的资源来构造自己.C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和自定义类型,使用初始化列表时,可添加等号(=),也可不添加。

2024-05-17 16:55:37 775

原创 C++哈希(个人笔记)

C++哈希1.unordered_mapd1.1unordered_map的构造函数1.2unorder_map的容量1.3unordered_map的迭代器1.4unordered_map的元素访问1.5unorder_map的查找1.6unordered_map的修改操作1.7unordered_map的桶操作2.unordered_set3.unordered_set和unordered_set的笔试题4.哈希4.1哈希概念4.2哈希冲突4.3哈希函数4.4哈希冲突解决4.4.1闭散列4.4.1.1线

2024-05-13 16:29:22 821

原创 C++map和set(个人笔记)

int _bf;

2024-05-10 14:19:33 895 4

原创 C++二叉树进阶(个人笔记)

KV模型:每一个关键码key,都有与之对应的值Value,即的键值对。K模型:K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。

2024-04-28 18:21:38 450 1

原创 C++多态(个人笔记)

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。

2024-04-24 22:18:59 1245

原创 C++继承(个人笔记)

继承机制是面向对象程序设计使代码可以复用的最重要的手段,继承是类设计层次的复用。public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。优先使用对象组合,而不是类继承继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用,在继承方式中,基类的内部细节对子类可见,继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。

2024-04-24 11:57:13 928

原创 C++反向迭代器的封装和模板进阶(个人笔记)

下面是在vector和list实现的基础上再加入反向迭代器,也是分两个版本,自己实现的版本,和库里的版本。(也就是不要分离编译!解决办法:1.模板定义的位置显示实例化,这个方法极其麻烦,直接将模板的可以自动推演参数的优势给消灭了。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数。在a.cpp中,编译器没有看到对Add模板函数的实例化,因此不会生成具体的加法函数,这里是自己实现的反向迭代器版本,与STL标准库里的有点不太一样。先总结一句:模板尽量不要分离编译很坑!

2024-04-19 16:57:22 1055

原创 C++stack,queue,priority_queue容器(个人笔记)

缺点:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不。

2024-04-18 17:35:58 649

原创 C++list类(个人笔记)

迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

2024-04-17 11:45:52 913

原创 C++vector类(个人笔记)

(constructor)构造函数声明接口说明vector()(重点)无参构造构造并初始化n个val(重点)拷贝构造使用迭代器进行初始化构造//vector构造//无参的构造//构造一个vector,里有4个int值为100//迭代器区间初始化//拷贝构造it!

2024-04-15 22:44:03 987

原创 C++string类(个人笔记)

其次:还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量。注意:下面结构是在32位平台下进行验证,32位平台下指针占4个字节.最后:还有一个指针做一些其他事情。指向堆空间的指针,用来存储字符串。16+4+4+4=28字节。

2024-04-13 22:50:45 1089

原创 C++模板初阶(个人笔记)

类模板实例化需要在类模板名字后跟,然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定。用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例。泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。,是编译器用使用方式产生特定具体类型函数的模具。隐式实例化:让编译器根据实参推演模板参数的实际类型。

2024-04-10 11:08:05 557

原创 C++内存管理(个人笔记)

int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的free(p3);delete p4;free(p5);return 0;

2024-04-10 09:55:49 778

原创 C++类与对象下(个人笔记)

比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。非静态成员函数可以调用类的静态成员函数,因为静态成员函数在类的作用域内是可见的。声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在。概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。

2024-04-08 22:19:55 881

原创 C++类与对象中(个人笔记)

const 成员函数内可以调用其他的非 const 成员函数,因为 const 成员函数不会修改对象的状态,所以调用其他非 const 成员函数也不会改变对象的状态。非 const 成员函数内可以调用其他的 const 成员函数,因为在非 const 成员函数内调用 const 成员函数是安全的,不会导致对象状态的改变。非 const 对象可以调用 const 成员函数,因为 const 成员函数承诺不修改对象的状态,所以对于非 const 对象来说是安全的。

2024-04-08 09:39:14 1278

原创 C++类与对象上(个人笔记)

/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。

2024-04-07 10:08:38 693

原创 C语言八大排序(个人笔记)

基本思想:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

2024-03-31 22:31:16 1145 1

原创 C语言二叉树和堆(个人笔记)

现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费(如果说不是完全二叉树,但数组上要留空间给那些截断的地方)。二叉树遍历是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

2024-03-27 22:45:12 1040 1

原创 C语言栈和队列(个人笔记)

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。队列:数组和链表的结构都可以实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出(FIFO)栈的实现可用数组或者链表实现,数组的话会更好些,因为在数组尾插尾删代价小。入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。

2024-03-25 22:22:15 977

原创 C语言顺序表和链表

slow走的路程是:L+X(slow一圈之内,fast必然追上slow,因为每次距离减一,不会错过)此时slow和fast的距离变成C-1,如果说C-1是偶数,那就变成了第一种情况,在这一轮恰好追上。解释:fast会先进环,slow会后进环,假设slow进环时,slow和fast之间的距离为N。N N-2 N-4 N-6 …如果说C-1是奇数,那这一轮又是第二种情况而且永无止境的是第二种情况,也就永远也追不上了。fast走的路程是:L+nC+X(n为slow进环前,fast在环里面转的圈数)

2024-03-21 18:28:24 603 1

原创 C语言复杂度(个人笔记)

时间复杂度主要衡量一个算法的运行快慢.空间复杂度主要衡量一个算法运行所需要的额外空间.

2024-03-19 19:42:30 685 1

原创 C语言编译链接(个人笔记)

在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的。3. 每次使用宏的时候,一份宏定义的代码将插入到程序中。下面解释一下为什么会有预处理,编译,汇编,实际上就是计算机语言发展的逆过程。比如说:调试性的代码,删除可惜,保留又碍事,所以我们可以选择性的编译。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。6. 宏可能会带来运算符优先级的问题,导致程容易出现错。这样一个源文件被包含10次,那就实际被编译10次。预处理器先删除这条指令,并用包含文件的内容替换。

2024-03-16 15:00:10 770 1

原创 C语言文件操作(个人笔记)

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。//让文件指针的位置回到文件的起始位置。“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件。“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件。“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件。“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件。“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件。

2024-03-15 17:02:03 920 1

原创 C语言动态内存管理(个人笔记)

*//ptr指向要开辟空间的地址,size单位是字节。情况五:对同一块动态内存多次释放(一般是代码书写过长,导致忘记自己已经释放过内存,再释放)C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。情况四:使用free释放一块动态开辟内存的一部分(没有释放完全,导致内存泄漏)*//num要初始化的无符号整形数字,size单位是字节。情况三:对非动态开辟内存使用free释放(纯属没睡醒)情况二:对动态开辟空间的越界访问。情况六:动态开辟内存忘记释放。*//size单位是字节。

2024-03-15 15:25:23 1000 1

原创 C语言自定义类型(个人笔记)

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联。整个结构体的大小,必须是最大对齐数的整数倍,最大对齐数包含嵌套的结构体成员中的对齐数。4.如果嵌套了结构体,嵌套的结构体成员要对齐到自己成员的最大对齐数的整数倍处.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。gcc环境下 没有默认对齐数,没有默认对齐数时,对齐数就是成员自身的大小。结构体的总大小必须是,所有成员的对齐数中最大对齐数的整数倍.这个对齐数是:成员自身大小和默认对齐数的较小值。

2024-03-13 22:38:20 333 1

原创 C语言字符串函数和内存函数(个人笔记)

这道题的结果为>,无符号整形的负数意味着是个很大的正数。这里给一段具体代码实操,以便理解。strstr的模拟实现。

2024-03-13 21:43:11 899 1

原创 C语言指针进阶(个人笔记)

函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进。数组 - 能够存放一组相同类型的元素,数组的大小取决于数组的元素个数和元素类型。sizeof(数组名) - 数组名表示整个数组,计算的是整个数组的大小。数组名是数组首元素的地址,这个地址就可以存放在指针变量中。&数组名 - 数组名表示整个数组,取出的是数组的地址。大部分情况下数组名是数组首元素的地址。数组是数组,指针是指针,二者不等价。

2024-03-09 21:54:17 585

原创 C语言数据存储(个人笔记)

现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间。候,只保存01,等到读取的时候,再把第一位的1加上去。上三行为原反补,第四行是截断,第五行是整形提升(char为有符号整形,按最高位补),%u格式打印(按照提升后的直接打印)IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的。这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将。

2024-03-09 18:55:10 987

原创 C语言调试技巧(个人笔记)

虽然说m被const修饰,但可以拿到m的地址通过解引用来简接访问到m。2.栈区内存的使用习惯是先使用高地址处的空间,再使用低地址处的空间。1.i和arr是局部变量,局部变量是放在栈区上的。3.数组随着下标的增长,地址是由低到高变化的。i与数组之间的空间是又编译器内存分配决定的。vs 中间有2个整形空间。gcc 中间有1个整形空间。vc6.0 中间没有空间。

2024-03-09 17:02:29 365

原创 C语言操作符(个人笔记)

在进行 << , >> , & , ^ , | 操作符进行二进制运算时都应该用补码进行运算,而在打印在显示屏上的时候,应该将补码再转换成原码进行展示。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。|| 操作符左边为真,右边不再计算(不再运行代码,也就报废)1.>>算术右移:右边丢弃,左边用原来的符号位来填充。还是逻辑右移,是取决于编译器的!整数的二进制表示形式有3种:原码,反码,补码。负整数的原码,反码,补码是要计算的。正整数的原码,反码,补码是相同的。

2024-03-06 20:10:40 348 1

原创 C语言数组(个人笔记)

sizeof(数组名),数组名如果单独放在sizeof内部,这里的数组名表示整个数组,计算的是整个数组的大小。&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。除此之外,遇到的所有的数组名都是数组首元素的地址。数组名是数组首元素的地址。

2024-03-06 19:26:29 339 1

空空如也

空空如也

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

TA关注的人

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