- 博客(57)
- 收藏
- 关注
原创 153. 寻找旋转排序数组中的最小值(leecode)
面对leecode 的这种题不行了,因为我们没有比较target ,就是无法判断break的情况,所以像上面的写法的作用最精妙的地方就在于。下面这个代码没有问题,但是他的场景就是返回我们找的到的数不?就是判断一个数是否在数组里面,因为这个代码最后的结局肯定是left =right;所以判断循环结束的条件。这道题对二分的代码编写有十分重要的影响(对于我来说)left<right 也可以退出啊;首先一般我们写的二分代码像下面这样。按道理说、left = right。但是有循环的可能,第一个测试用例。
2024-10-19 21:38:32 210
原创 C++ push_back和emplace_back的区别
但是再自定义类型的时候?emplace——back更高效,但是emplace_back 没有类型检查的安全;只有运行时候才会报错。直接再最后构造对象 ,然后push_back 先构造 ,再转移。基本类型情况西,两者几乎没什么区别。
2024-09-13 17:06:34 259
原创 非递归方式实现树的前序后序遍历
然后整体的结果不就是中右左了嘛 ,然后这时候对其进行反转,结果如何呢?左右中 卧槽 ,帧厉害。细节:前序遍历是中 左右 后续遍历时左 右 中。这里就是先把这两行代码替换一下。
2024-08-12 00:07:12 234
原创 C语言面试
/ 尽管在这里 打印出来的值 arr 和 & arr的值是一样的 ,但是arr的类型是 char * &arr的类型是char(*)[7] 这里同样解释了为什么&arr+1 会跳过7个元素了。// 运行注释的代码会报错。
2024-07-28 23:14:24 215
原创 腾讯云ip问题
我们跨主机想使用upd进行通信的时候,用的是下面这个ip。但是我们登录腾讯云的ip地址跟这个完全不一样。这里有一个ip地址,是内网IP。我们查看 ifconfig。
2024-05-17 21:49:46 323
原创 linux线程池
这个类的解析:1 我们先定义一个函数类型申明一个返回值是void* 参数是void*的一个函数2 构造函数这个构造函数和之前写的构造函数不一样,这里构造函数只是为了初始化_name属性。Thread()3 start函数,我们把对线程的初始化放到了start函数里面并且通过传递this指针的方式,将本个类的属性传过去。//编译debug的方式发布的时候存在,release方式发布,assert就不存在了,n就是一个定义了,但是没有被使用的变量。
2024-05-14 22:11:41 885
原创 C++类型转换
这里编译器的值变为3了,但是我们终端输出的还是2 .因为这个const ,cp已经把值存在了寄存器了,系统认为你不需要改了,这是编译器优化。所以这里的值会变成3。dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用。向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
2024-05-14 09:07:01 262
原创 linux线程
在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。多个task_struct 共享同一份虚拟内存。同时页表也没有这么简单,我们看看上面页表的属性。
2024-05-06 21:22:38 451
原创 linux信号
帮我在键盘中输入ctrl + c的时候。就会发现终止不了进程, 而是Ccatch a sig : 2 打印类似信息。我们的ctrl+c就是二号信号。
2024-04-23 20:29:01 167
原创 linux进程间通信
数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
2024-04-20 11:39:53 575
原创 C++智能指针
这里内存泄露的情况这里虽然能正常捕捉div的除0错误了,但是却不会执行后面的两个delete释放资源的操作。结果发现没有输出111,这里就造成了a1 和 a2的内存泄漏。
2024-04-16 23:10:24 523
原创 C++异常学习
因此,在 catch 块中,你应该捕获 const char* 类型的异常而不是 std::string。如果你想要用 std::string 来捕获这个异常,你应该在抛出异常时使用 std::string 类型,像这样:throw std::string(“被除数不能为0”);出异常的代码,try 块中的代码被称为保护代码。7. 没有匹配的catch则退出当前函数栈,继续在调用函数的栈中进行查找匹配的catch。异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的。
2024-04-16 00:34:08 810 1
原创 linux文件系统
在这里插入图片描述](https://img-blog.csdnimg.cn/direct/932e98d32d9e454cb75e6f091d478e98.pn。这个文件系统我们先从磁盘讲起,结构体。首先我们要理解,这个是怎么存储的。首先要理解柱面 ,扇区,磁道。
2024-04-15 16:35:38 93
原创 linux的io的知识大全
fopen函数,第一个参数是文件的路径,第二个参数是mode 有 r w r+ w+等等.返回值返回的是一个文件指针。r:只读,不存在文件则会报错。w:写文件,不存在文件则会创建一个文件r+:读写文件,不存在文件则会报错w+::读写文件,不存在文件则会创建一个文件fclose,参数是是一个文件指针fwrite参数的意义,第一个是写的消息,第二个是消息的大小,第三个是每一个字符的大小,最后一个是文件指针。结果读文件int main()\n");//{//}
2024-04-11 22:45:09 573
原创 llinux进程控制
在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork返回,开始调度器调度输出结果所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器决定。
2024-04-10 19:47:33 908
原创 浮点数在计算机中的存储
这一段代码的输出是什么?猜想9,9.0,9,9.0.这是猜想的结果实际的结果为什么呢?这我们就要讲讲浮点数额存储规则了。举个例子十进制的5.0,写成二进制是 101.0 ,相当于 1.01×2^2。那么,按照上面V的格式,可以得出S=0,M=1.01,E=2。
2024-04-09 01:22:22 262
原创 C语言面试题
这段代码中出现的死循环是由于使用了 unsigned char 类型的变量 i 作为循环变量,并将其循环条件设置为 i<=255。当 i 的值增加到 255 并再次执行 i++ 时,它会溢出并回绕到 0,而不是变成 256,因为 unsigned char 无法表示大于 255 的数值。当 i 增加到 255 并执行 i++ 时,由于 unsigned char 类型的最大值是 255,i 会溢出并回绕到 0。回到步骤 2,检查循环条件 i<=255,由于 i 又回到了 0,条件依然为真。
2024-04-09 00:48:51 181
原创 linux操作系统的进程状态
我们可以这样想,随着时间的变化,银行升级了,有些老婆婆和大爷无法同步操作,这时候有一个大堂经理,大堂经理就会负责这些人,说你把信息填好,我帮你去办理业务。常见的呢,bash窗口,窗户界面,C语言的库,我们只需要调用就好了,他会帮我们去做一些事,但是我们要自己做好准备,老婆婆和爷爷要去银行才能找大堂经理帮忙,那我们想使用c语言的库方便我们调用也要包含头文件。这里代表的就是软件也可以管理硬件,首先我们要明确一个事实 ,就是说我们的键盘和电脑是分开买的,电脑里面有操作系统,底层硬件相当于是键盘。
2024-04-02 21:23:42 1667
原创 linux进程fork函数的讲解。
结果,发现子进程的父节点为原始进程的pid。而父进程的父进程是什么呢 -》bash。这里的返回值的意思是,如果成功,孩子进程的pid会给父亲进程,然后0会给子进程。结果,发现同一个pid有两个不同的值,这是多线程的基础,具体原理后面解释。如果失败,-1 的返回值给父亲,然后孩子进程不会被创建。这里不能说明什么,看下面的代码。通过指令,查看接口的详细信息。makefile文件。
2024-04-01 22:32:03 168
原创 C++内存分布知识点复习
看看自己是否了解选择题:选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)globalVar在哪里?____ staticGlobalVar在哪里?____staticVar在哪里?____ localVar在哪里?____num1 在哪里?____char2在哪里?____ *char2在哪里?___pChar3在哪里?____ *pChar3在哪里?____ptr1在哪里?____ *ptr1在哪里?____
2024-03-25 22:07:10 707
原创 C++11特性
不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。C++11:C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自。定义的类型,使用初始化列表时,可添加等号(=),也可不添加。
2024-03-22 19:23:54 571
原创 C++面向对象知识大全
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。对于成员函数的内部来说,this指针就是一个指向当前对象的指针,允许函数访问对象的成员变量和其他成员函数。将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。1 确定函数地址:编译器根据对象的类型和调用的成员函数确定函数的具体地址。
2024-03-22 16:56:15 830
原创 C++搜索二叉树,平衡二叉树,红黑树原理
在这里我们是哪个节点的平衡因子被破坏了。我们是在根节点的左边的左边插入的一个节点导致了这个不平衡。就一直向上调整(同样的也是判断假如的节点事左边还是右边,左边–,右边++,一直到根节点)插入平衡因子的调节主要有以下几种情况(平衡因子的大小是右子树的高度-左子树的高度)我们知道搜索二叉树影响搜索次数的是树的高度,那么我们就要想办法把树变平衡。情况二: cur为红,p为红,g为黑,u不存在/u存在且为黑。一个树的根节点比左子树的大,比右子树的小。当节点的平衡因子更新为2或者-2 的时候,就需要考虑旋转了。
2024-03-18 16:58:50 342
原创 C++多态得知识点
多态是在不同继承关系得类对象,去调用同一个函数,产生了不同的行为。比如Student继承了Person.person买票的话是全票,但是student就是半价。1 . 必须通过基类的指针或者引用调用虚函数2 . 被调用的必须是虚函数,且派生类必须对基类的虚函数进行重写。下面是一个代码的实例public:cout << "买票全价" << endl;cout << "买票半价" << endl;Person p;Student s;Func(p);Func(s);
2024-03-10 15:58:11 1792
原创 C++继承方面的知识点
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。3 在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类 的引用。
2024-03-07 21:49:14 730
原创 C++的模板进阶的知识
就是我们在每个源文件进行编译的时候,是函数就会生成函数地址,然后函数的链接其实是函数的匹配问题。在func.cpp中,编译器没看到对F2模板函数的实例化,因此不会生成具体的函数。在test.cpp(运行mai函数的cpp)调用的时候才会链接地址,但是这个两个函数没有实例化生成具体的代码,因此链接时候报错。但是接下来我们使用的是两个字符串来比较,我们直接这样传参数是传的两个地址,两个地址肯定是不相等的啊。我们就写了一个模板的特化。这里要注意,传入的模板参数n是一个常量,不然是无法作为初始化数组的参数的。
2024-03-06 09:49:40 248
原创 C++List原理和坑点
list采用的是链表,没错就是数据结构中的链表。但是不是单链表是双向循环链表。接下来我们自己实现一个简化版的的list。紧接着我们就需要构建list类了。这就是list的实现了。
2024-03-01 15:14:13 176
原创 C++之vector原理解析以及坑点
resize()方法,resize的效果就是会有一个初始值,并且空间大小是自己定义的,若resize比你原来的空间大,剩下的空间会有一个初始值填补.vector的底层原理是数组,只不过是在数组的基础上多加了几个指针.请看详细的定义.数组的有点就是支持随机访问,但是增删都效率不高.首先vector需要一个泛型来表示容器装入的数据类型.然后迭代器(iterator)其实是(T*).这个泛型指针的别名.这是是我们扩容的时候采用的memcpy是浅拷贝,把它换成深拷贝就行啦.这是对于几个指针的直观表示。
2024-02-28 10:31:43 423
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人