自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c++之基础入门一

const只在编译期有用,在运行期无用(编译的时候只能替换数值,不能确定地址。关于const修饰限定的作用:c++const修饰限定的作用基本上与c++相同,C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。const可以进行能力的收缩,但是不能进行及能力的扩张。所以在c编译器上和c++编译器上面我们会发现值的不同。const修饰的变量是只读的,本质还是变量。const修饰的全局变量在只读存储区分配空间。const 修饰的局部变量在栈上分配空间。c语言中的const。

2023-02-03 16:57:36 1156

原创 Linux操作系统之c程序的编译与调试

一、程序的编译链接过程二、编译链接在Ubntu上的具体实现三、c程序在Linux上的调试四、makefile文件:实现自动化编译五、find 命令六、grep 命令七、关机 :showdown -h now 立刻关机八、重启:showdown -r now九、文件压缩和解压

2022-11-05 22:03:05 1926

原创 makefile编译

在涉及到C++和C语言代码需要混合编译的情况,首先要明确C代码和C++代码,在编译好C和CPP代码之后,在一起链接(在了解编译的时候,首先要了解程序运行的阶段预编译-编译-汇编-链接-生成可执行程序每一个阶段的过程)。1.什么是库:库相当于封装了函数与数据,提供给用户去调用,库是在编译时期形式,没有到链接这一步。$^: 在规则的命令中,表示所有依赖条件。gcc:编译C++代码时,不会自动链接C++标准库(libstdc++),需要手动链接选项。$@:在规则的命令中,表示规则中的目标。

2024-08-25 16:58:24 1056

原创 C++之函数传参方式

函数指针的定义:初始化函数指针函数指针做为函数参数进行传递的时候(回调函数)函数指针作为参数传递给其他函数的时候,提高了调用函数的灵活性。1.灵活性高:可以在运行时选择函数,实现更通用的代码设计2.可拓展性高:适用于回调机制和策略模式3.复杂度高:函数指针的使用容易增加代码的复杂性,尤其在涉及多个函数指针时,代码可读性降低4.安全性:若未正确使用函数指针,可能导致未定义的行为,导致程序崩溃函数指针作为函数的返回值返回值为函数指针的函数1.(*fun(int opt))是一个函数,函数名fu

2024-08-18 22:34:12 1265

原创 C++11多线程之条件变量

原因分析:并不是一运行就会出现这种情况,当出现图片中的这种情况的时候,原因是当两个互斥锁同时运行时,锁一被占用后,还没有释放锁的时候,锁二就继续占用锁一,出现了相互引用的情况,导致了死锁的出现。当wait状态执行到第二步时候,此时主线程获得锁,主线程向下执行,将tag的值变为true,此时再次到子线程,此时子线程向下执行,wait执行三、四步骤后,再次调用唤醒函数,主线程执行后续步骤。例题一:ABC三个线程分别打印出来ABC。例题三:A线程打印偶数,B线程打印奇数。甲向乙进行转账的同时,乙向甲进行转账。

2023-06-15 17:21:45 908 1

原创 C++11之多线程

可能的结果为:10,100,100,200 或者10,200,200,100或者10,10,100,200等。可能的结果为:10,100,100,200 或者10,200,200,100或者10,10,100,200等。主线程不会等待子线程结束,如果主线程运行结束,程序结束。检查当前线程是否处于活跃状态。

2023-06-11 02:20:24 237

原创 C++11之异常处理

注释:代码来自图论教育。

2023-06-04 20:31:25 852

原创 C++STL库之map

队列的底层实现可以为双端队列,或者list,但是不允许为vector,因为vector没有pop_front的方法。operator[]:通过关键码查询值,如果找不到,则在红黑树中构建一个元素,并且将value的值赋值0。在map中进行查找,找到则返回该关键码迭代器,未找到则返回simap.end()既可以在尾部插入,也可以在头部插入(栈没有迭代器,不能进行迭代)为什么打印出来的数据为:12,23,34,45,56,67?用map统计文件中单词的个数,并进行排序(状态机)set:底层也是红黑树实现的。

2023-06-04 20:26:34 887

原创 C++STL之vector与list

容量按照1.5倍增加,容量增容意味着要不断的创建空间,并且不断调用移动构造函数,和不断将对象析构,效率太低,可以直接调用reserve。(提前获取vector的大小,预留好空间)如果需要高效的随机存取,选择vector(深入理解计算机系统1,6,9章)在相同的空间中,vector的存储密度比List的存储密度大。场景题目二:刷视频,如何让视频刷的更快(生产者消费者模型)List的排序算法(当排序量较少是,一般采用快排)迭代器失效,指针指向的对象已经被释放掉。关于vector里面存放指针的情况。

2023-06-01 10:57:14 601

原创 C++四种类型转化

该运算符把expression转化为type_name类型,static_cast在编译时使用类型信息执行转换,在转换执行必要时的检测(如指针越界,类型检查),但没有运行时类型检查来保证转换的安全性。2.如果针对指针类型的dynamic_cast失败,则dynamic_cast的结果是nullptr。1.与C++支持其他强制转化的不同的是,dynamic_cast是在运行时执行的动态类型转换。4.在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。

2023-05-27 23:11:05 722

原创 LeetCode每日一题之209长度最小的子数组

那么for循环里面是起始位置还是终止位置呢?此时我们需要探讨,如果for循环里面是起始位置,那么又会陷入暴力求解,所以我们将终止位置j放入for循环里面,而在for循环的里面我们设置起始位置,从而形成了滑动窗口。暴力求解法的思想:每一次遍历数组,然后更新result的值,一个for循环作为起始位置,一个for循环作为终止位置,用两个for循环完成了不断搜索区间的过程。时间复杂度:O(n),空间复杂度O(1),为什么时间复杂度为O(n)呢?暴力求解法:时间复杂度O(n^2),空间复杂度O(1)。

2023-05-24 22:02:25 74

原创 Leecode之977.有序数组的平方

先给每一个数平方(包括负数),在排序,此方法的时间复杂度根据排序的时间复杂度确定,如果为冒泡则为O(n+n^2),如果为快排则为O(n+nlogn)指向最后一个元素,由于数组是有序的,所以,它的最大元素一定是在两边,此方法时间复杂度为O(n)指向第一个位置,指针。思路二:双指针的解法。

2023-05-19 02:36:49 125

原创 LeetCode每日一题之移除元素

定义快慢指针,快指针遇到要删除的元素跳过,但快指针始终加一,慢指针只有在满足条件的时候才需要加一。主要思路:跳过要删除的元素。

2023-05-19 02:01:57 134

原创 LeetCode每日一题之二分搜索

【代码】LeetCode每日一题之二分搜索。

2023-05-18 21:38:52 352

原创 C++之设计模式

一个小女孩过生日,问爸爸要生日礼物,爸爸没给,然后继续问妈妈要,妈妈也没给,继续问爷爷要,爷爷也没给,直到问奶奶要,奶奶把生日礼物给她了。例题:井底下有一只青蛙,一位小女孩和青蛙kiss之后,青蛙变为了王子,如果小女孩不情愿,则青蛙变为小狗。以空格为界限,求单词的个数。

2023-05-16 00:28:10 170

原创 C++之构造函数与虚析构函数

1.虚函数调用只需要“部分的信息”,即只需要知道函数的接口(函数返回类型,函数名,参数列表),而。根据赋值兼容性规则,可以用基类的指针指向派生类的对象,如果使用基类指针指向。派生类的对象,由该基类指针撤销派生类对象,则必须将析构函数设置为虚函数。如果你调用一个虚构造函数,编译器不知道你要构造的继承树上的那种类型。

2023-05-15 12:08:17 473

原创 STL容器之deque

deque是“double-ended queue”的缩写,和vector一样都是STL的容器deque是双端数组,而vector是单端的deque在接口上和vector非常相似,在许多操作的地方都可以直接替换deque可以随机存取元素(支持索引直接存取,用 []操作符或at()方法)deque头部添加或移除元素都非常快,但是在中部插入删除元素比较费时在实际应用中,如果频繁的对头部操作,才用到deque。

2023-05-14 19:31:45 516

原创 STL之迭代器

迭代器是一种检查容器内元素并且遍历容器内匀速的数据类型。

2023-05-14 19:11:08 534

原创 C++多态练习题

引发了异常,原因是将对象赋值给空间,系统只负责将数据赋值,不进行虚函数指针的赋值,也就是说虚表指针仍然是随机值,解决方法一:去掉虚函数。4.[edx+8],edx代表虚表里面的首地址add函数,+8就是指针偏移8字节,此时指向的print函数,并将print函数给eax。此时我们发现base并没有被析构掉,造成内存泄露,解决办法是将Object的析构函数设置为虚函数。3.op所指之物给ecx(test的this指针执向了vptr),并将vptr的地址给了ecx。解决办法二:定位new。

2023-05-14 01:10:56 1227

原创 C++之多态与虚函数

函数的重写,函数参数,函数名,函数返回类型必须相同(函数重写是同名覆盖的一种特殊情况)总结:运行时多态性,公有继承+虚函数+(指针或引用调用虚函数)函数的重写:(同名覆盖)

2023-05-08 23:26:33 513

原创 C++之初识STL—vector

尾部插入速度比较快vector是将元素置于一个动态数组中加以管理的容器vector可以随机存取元素(支持索引值直接存取)vector尾部添加或移除元素的速度非常快速,但是在头部插入或移除元素比较费时。

2023-05-07 19:54:48 701

原创 C++之单例模式

保证一个类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

2023-05-07 00:44:53 543

原创 多重继承与派生类成员标识

由多个基类共同派生出新的派生类,这样的继承结构称为多重继承。一个派生类只有一个直接基类的情况称为单一继承。菱形继承是多重继承一种特殊情况。

2023-05-06 18:10:19 116

原创 C++之继承与友元和静态成员

公有继承,父类细节子类可见,其代码属于白盒式的复用,意味着当设计学生这个对象时,学生这个对象也可以调用父类里面的成员方法。尽可能使用组合,必须是使用私有继承,有保护属性和虚函数介入时考虑私有继承。对象之间的内部细节不可见,其代码属于黑盒复用方式。多重继承:由多个基类共同派生出新的派生类,这样的继承结构被称为多重继承。单一继承:一个派生类只有一个直接基类的情况称为单一继承。公有继承和组合都是代码复用的方式。私有继承和组合如何选择?公有继承:是一个的概念。私有继承:有一个的概念。

2023-04-28 15:21:08 205

原创 Linux操作系统之mysql数据库简介

mysql数据库模型:关系型数据库:指采用了关系模型来组织数据的数据库,关系模型就是指二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。关系型数据库核心元素:数据行(一条记录),数据列(字段), 数据表(数据行的集合),数据库(数据表的集合)。非关系型数据库: 指非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。非关系型数据库以键值对存储,且结构不固定。(ACID,指 原子性,一致性,隔离性,持久性)

2023-04-26 13:29:08 838

原创 c++11智能指针之基础概念

1.内存泄漏:内存泄漏是指程序中已动态分配的堆内存由于某种原因因程序未释放或无法释放,导致程序运行速度减慢甚至系统崩溃等。由于c++语言没有垃圾回收机制,必须自己去释放动态分配的堆内存,否则就回内存泄漏,解决这个问题就是使用智能指针。,用于生存期的控制,能够确保智能指针对象离开所在作用域是,自动正确的销毁动态创建的对象。例如:文件的拷贝,即使是深拷贝,但是他们依然在同一个文件里面“a.txt”//对象语义指的是面向对象意义下的对象,对象拷贝是禁止的。8.auto_ptr的拷贝构造函数的问题。

2023-04-25 23:57:12 439

原创 数据结构与算法之赫夫曼树

不断地取最小的两个节点,构建成一棵树,然后将刚构建的树加入到数组中,不断的构建,最终构建出一棵树。首先给出路径和路径长度的概念,从树中的一个结点到另一个结点之间的分支构成这两个结点之间的路径,树的路径长度是从树根到每一结点的路径长度之和。完全二叉树路径长度最短的二叉树。赫夫曼树:又称最优树,是一类带权路径长度最短的树,有着广泛的应用。1.最优二叉树(赫夫曼树)

2023-04-25 21:21:01 126

原创 c++之继承与缺省函数

补充:切片现象,派生类对象赋值给基类对象时,会产生切片现象。设计一个不能不继承的类,但是可以在外部环境创建该类的对象。1.构造函数、拷贝构造、赋值重载、析构函数不能够被继承。设计一个能被继承的类,但是不能在外部环境创建该类的对象。设计一个类型,在外部环境中不能创建该类的对象。方法二:使用final关键字 C11新标准。主要目的:将对象创建出来。设计一个不能被继承的类。

2023-04-25 19:27:26 806

原创 C++柔性数组实现Mystring

写时拷贝技术是通过"引用计数"实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数减一(假装释放),直到引用计数减为0时才真的释放掉这块空间。当有的指针要改变这块空间的值时,再为这个指针分配自己的空间(注意这时引用计数的变化,旧的空间的引用计数减一,新分配的空间引用计数加一。柔性数组:柔性数组是一种数组大小待定的数组。在c语言中,可以使用结构体产生柔性数组,结构体的最后一个元素可以是大小未知的数组。

2023-04-25 01:02:02 110

原创 c++之常见函数

然后c语言名字修饰非常简单,__cdecl是C/C++的缺省调用方式,调用约定函数名字前面加了下划线前缀。thiscall:仅仅适用于“C++”类的成员函数,this指针存放在ECX寄存器中,参数从右到左压。__fastcall:快速调用约定,函数从右到左的压栈方式,速度快,通过寄存器传入参数。1.当进行函数的调用时,系统要建立栈空间,保护现场,传递参数等等,这些工作都需要系统。__stdcall:回调调用约定,函数从右到左的压栈方式,自己在退出时清空堆栈。函数重载的定义:函数名相同,参数类型和个数不同。

2023-04-23 20:43:28 1179

原创 二叉树的非递归遍历

【代码】二叉树的非递归遍历。

2023-04-23 19:46:15 55

原创 数据结构与算法之堆排序

堆是一颗二叉树,这样的二叉树是局部有序的,任何节点与其兄弟节点之间都没有必然的顺序联系,但是它与父子节点之间有大小顺序关系,按照关系的不同,分为最大值堆和最小值堆。堆排序的两种调整方法:向下调整、向上调整,实现堆排序就要理解物理到逻辑映射关系。最大值堆:子节点比父节点小的堆,根节点是树中最大的节点。最小值堆:子节点比父节点大的堆,根节点是树中最小的节点。

2023-04-23 14:27:55 120

原创 数据结构之快速排序算法

【代码】数据结构之快速排序算法。

2023-04-23 14:16:41 162

原创 数据结构与算法之归并排序

步骤四:进行合并操作,将两个有序的子序列合并为一个有序序列,如此下去,直到所有的元素都合并为一个有序序列。步骤三:如此下去,直到分解成一个元素停止,这时含有一个元素的子序列都是有序的。步骤一:首先将待排序的元素分成大小大致相同的两个序列。步骤二:再把子序列分成大小大致相同的两个子序列。

2023-04-23 14:05:00 168

原创 数据结构与算法值之排列数与子集数

【代码】数据结构与算法值之排列数与子集数。

2023-03-11 19:03:45 177

原创 Linux操作系统之tcp并发编程

因为在服务端与客户端都存在发送缓冲区与接收缓冲区。为什么会出现以上的现象呢?

2023-02-12 20:10:14 97

原创 c++基础入门二

对指针变量的操作,会使指针变量指向下一个实体(变量或对象)的地址,而不是改变所指实体(变量或对象)的内容。当函数执行调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作主要系统时间和空间的开销。指针变量的值可以发生改变,存储不同实例的地址,引用在定义的时候就被初始化,之后无法改变(不能是其他实例的引用)。对指针变量使用“sizeof”得到的是指针变量的大小,对引用变量使用“sizeof”得到的是变量的大小。指针变量存储某个实例(变量或对象)的地址,引用是某个实例的别名。

2023-02-09 17:42:47 499

原创 Linux操作系统之网络编程基本流程

数据链路层是两个相邻节点进行数据的传输(A-B),而网络层是两个不相邻的节点(A-D)选择哪一条路径(ip 路由,转发),传输层解决了两个进程(A-D)间数据的传输。MAC地址:48位 物理地址(虽然物理地址也可以唯一标识一台主机,但是物理地址不会随着位置的变化而变化,因此。端口号:应用程序的代号。归根结底网络间的通讯就是不同主机间进程的通讯。某一层并不需要知道它的下一层是如何实现的,而仅仅需要知道该层通过层间的接口所提供的服务。网络协议:一组网络规定的规则的集合。网络模型:实际使用的是tcp/ip模型。

2023-02-07 17:26:51 504

原创 数据结构与算法—二分查询

提问:为什么循环里面使用的是left

2023-02-05 17:31:29 106

原创 Linux操作系统之线程生产者消费者

此时子进程已经成为加锁状态,所以在一次上锁,程序变成阻塞状态。那么如何解决这个问题?我们需要保证fork之后,父子进程都有一个清楚的锁状态。计数信号量dfull用来表示有数据的缓冲区的数量,其初值为0。,如果使用的是通一个锁,此时等待5s后,子进程会输出加锁成功。答案先执行p操作,原因当我们先加锁的时候当缓冲区已满的时候,此时生产者p操作阻塞,消费者也上不了锁,程序变为。根据上图我们发现,子进程变为阻塞状态,所以验证了进行fork之后,判断父子线程fork之后,是否使用的同一个锁,首先我们看一段代码。

2023-02-04 10:17:06 566

空空如也

空空如也

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

TA关注的人

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