- 博客(60)
- 资源 (3)
- 收藏
- 关注
原创 对C++深浅拷贝认识
浅拷贝:就是简单的赋值拷贝操作。深拷贝:在堆区重新申请的空间,进行的拷贝操作。浅拷贝实例:class Person{public: Person() { cout << "Person的构造函数" << endl; } Person(int age, int height) { _age = age; _height = new int(height);//堆上开辟,程序员手动开辟,也需要程序员手动释放 cout << "Person
2021-04-07 15:42:27
313
3
原创 C++每日一题:合并两个有序数组
题目: 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 有足够的空间(空间大小等于 m + n)来保存 nums2 中的元素。OJ链接.法一:直接合并后排序解析:最直观的方法是先将数组nums2的元素放进数组nums1的尾部,然后直接对整个数组进行排序。class Solution {public: void merg
2021-01-18 17:59:56
1065
原创 一文带你搞定二分查找及其多个变种!
1 完全有序二分查找二分查找也称折半查找(Binary Search),是一种在有序数组中查找某一特定元素的搜索算法。我们可以从定义可知,运用二分搜索的前提是数组必须是有序的,这里需要注意的是,我们的输入不一定是数组,也可以是数组中某一区间的起始位置和终止位置。下面我们通过一个例子来帮助我们理解。我们需要在 nums 数组中,查询元素 8 的索引:int[ ] nums = {1,3,4,5,6,8,12,14,16}; target = 8 (1)我们需要定义两个指针分别指向数组的头部及.
2021-01-17 15:49:32
473
原创 C++每日一题:在排序数组中查找元素的第一个和最后一个位置
题目: 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1],OJ链接二分查找的三种写法二分查找通常有以下几种写法,区别主要在于 while 里面:形式结论与建议while (left <= right)简单问题用,在循环体里能找到答案以后退出。while (left < right)复杂问题用,把答案留到退出循环以后,再判断。是解决二分
2021-01-17 15:22:59
1253
原创 C++每日一题
题目:给定一个数组 nums 和一个值 val ,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成,OJ链接.法一:暴力法解析:我们来解析一下这个题目的做题思路,他的含义就是让我们删除掉数组中的元素,然后将数组后面的元素跟上来。最后返回删除掉元素的数组长度即可。比如数组长度为 10,里面有2个目标值,我们最后返回的长度为 8,但是返回的 8 个元素,需要排在数组的最前面。那么暴力解法的话则就需要
2021-01-16 09:36:46
1523
2
原创 Linux之多线程概念
Linux之多线程1. Linux线程概念2. Linux进程和线程线程和进程进程的多个线程共享3. Linux线程控制4. 分离线程5.Linux线程互斥6. 常见锁死概念7. Linux线程同步8. 生产者消费者模型9. 线程池10. 线程安全的单例模式三级目录1. Linux线程概念线程是进程内部的一个控制序列。线程就是创建出来的执行流,在内核当中创建了一个PCB,在内核当中创建了一个task_struct这样的结构体;fork在内核当中以父进程的PCB为模板拷贝父进程的PCB当中的内容创建了
2020-12-26 20:43:54
237
原创 TCP协议面试常问知识点,倾心总结
TCP协议TCP协议段格式确认应答(ACK)机制超时重传机制连接管理机制理解TIME_WAIT状态理解CLOSE_WAIT状态滑动窗口拥塞窗口延时应答捎带应答面向字节流粘包问题TCP协议段格式首先一点必须知道TCP协议三个特点:面向连接、可靠传输、面向字节流TCP全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制;源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;16位校验和: 发送端填充, CRC校验.
2020-12-26 18:52:19
369
原创 二叉树进阶面试题 : 二叉树的后序遍历
二叉树的后序遍历,非递归实现思路:后序遍历:左右根1 开始找以cur根的所有的左侧节点入栈,此时cur在3的左侧空的位置,因为3的右侧没有节点,因此最后遍历节点3:2 同理2,1节点。然后4,5节点一次入栈,此时cur在5的左侧开始遍历,没有节点,遍历5的右侧,也没有节点,因此直接遍历5,然后遍历4节点的右侧。3 遍历6节点同5节点一样,最后遍历4节点,于是所有的节点都遍历完,最后遍历根节点1。4 最后栈为空。class Solution {public: vector&l.
2020-12-22 20:05:48
192
原创 二叉树进阶面试题 : 二叉树中序遍历 ,非递归迭代实现。
二叉树中序遍历 ,非递归迭代实现。思路:因为中序遍历为左根右,所以先需要遍历以cur为根的二叉树最左侧的节点。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * Tre
2020-12-22 17:05:56
248
原创 二叉树进阶面试题 : 二叉树的前序遍历,非递归迭代实现
题目:二叉树的前序遍历,非递归迭代实现题目描述:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。思路:首先前序遍历遍历的次序是根左右。想要将遍历后的节点保存起来,还符合递归的特性,就需要栈来实现。顺着以cur为根的二叉树左侧路径去遍历,并保存每个遍历节点的右子树。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tr
2020-12-22 16:17:15
278
2
原创 二叉树进阶面试题:二叉树的层序遍历
题目:二叉树的层序遍历题目描述:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],返回其层序遍历结果:思路:先对二叉树的根节点从左向右进行遍历,然后将遍历后的结果放到队列中,然后将队列的首元素进行遍历,进行保存。第一次遍历1,2,4:第二次遍历2的左子树3:第三次遍历4的左右子树:第四次遍历:/** * Definition for a binary tree no
2020-12-22 15:22:44
223
原创 二叉树进阶面试题:二叉树搜索树转换成排序双向链表
题目:二叉树搜索树转换成排序双向链表题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。法一:对BST进行中序遍历,然后将每个节点的地址保存起来。对每个节点进行连接。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(N
2020-12-22 10:48:58
212
原创 C++中的继承(下)
C++中的继承(下)1 继承和友元2 继承与静态成员3 复杂的菱形继承即菱形虚拟继承3.1 单继承3.2 多继承3.3 菱形继承(钻石继承)1 继承和友元友元关系不能继承,因为友元不是类的成员,也就是说基类友元不能访问子类私有和保护成员。2 继承与静态成员基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例 。3 复杂的菱形继承即菱形虚拟继承3.1 单继承单继承中子类只有一个基类。单继承子类对象模型:3.2 多继
2020-12-18 10:06:22
116
原创 C++中的继承(上)
C++中的继承1 什么是继承?1.1为什么需要继承?1.2 继承的格式1.3共有继承1.4 私有继承1.5 保护继承2 基类和派生类对象赋值转换3 继承类的默认函数4 派生类的默认成员函数1 什么是继承?**继承:**继承机制是面向对象程序设计使代码可以复用的最重要的手段。它允许程序员在保持原有类特性的基础上进行扩展、增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。1.1为什么需要继承?
2020-12-17 15:19:32
168
原创 多态笔试题分析
代码:#define _CRT_SECURE_NO_WARNINGS #include <iostream>using namespace std;class A{public: virtual void func(int val = 1) { cout << "A->" << val << endl; } virtual void test() { func(); }};//A的虚表//A::func(int v
2020-12-15 11:14:24
203
1
原创 C++中const型数据小结
几种const类型数据的用法和区别,先总结如下:形式含义Time const t;t是常对象,其值在任何情况下都不能被改变void Time::fun()const;fun是Time类中的常成员函数,可以引用,但不能修改本类中的数据成员Time* const p;p是指向Time类对象的常指针变量,p的值(p的指向)不能改变const Time* p;p是指向Time类常对象的指针变量,p指向的类对象的指不能通过p来改变const Time &t
2020-12-06 10:46:31
386
原创 总结:系统什么时候调用构造和析构函数
1 如果在全局范围内定义对象(即在所有函数之外定义的对象),那么它的构造函数在本文件模块中的所有函数(包括main函数)执行之前调用。但是如果一个程序包含多个文件,而在不同文件都定义了全局变量,则这些对象的构造函数的指向顺序是不确定的。当main函数执行完毕或者调用exit函数时(程序终止),则调用析构函数。2 如果定义的是局部变量(在函数体内定义的对象),则在建立对象时调用其构造函数。如果对象所在的局部变量多次被调用,则在每次建立对象的时候都调用构造函数。在函数调用结束、对象释放时调调用析构函数。3
2020-12-03 09:44:14
5876
原创 C++之vector深度剖析
C++之vector深度剖析1.vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 空间增长问题1.2.3 vector 增删查改1.2.4 vector 迭代器失效问题2.vector深度剖析及模拟实现1.vector的介绍及使用1.1 vector的介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可
2020-11-03 08:35:39
2658
1
原创 Linux之进程信号
Linux之进程信号1. 信号概念2. 信号的种类2.1 信号个数2.2 信号是如何产生的3. 信号的注册3.1 信号注册示意图:3.2 非可靠信号的注册3.3 可靠信号的注册4. 信号的注销5. 信号的捕捉流程6. 自定义信号的处理方式1. 信号概念信号是进程之前事件异步通知的一种方式,属于软中断。2. 信号的种类2.1 信号个数在Linux操作系统中,用kill -l命令可以查看系统定义的信号列表,查看结果如下:在Linux操作系统中,总共有62个信号,其中1-31号信号有可能丢失,叫
2020-10-28 10:43:49
173
原创 Linux之共享内存和消息队列
共享内存共享内存示意图共享内存接口:1. 获取共享内存2. 附加到进程3. 分离当前共享内存和进程4. 操作共享内存的接口消息队列消息队列接口1.获取消息队列2.向消息队列当中发送数据3.从消息队列当中获取数据共享内存示意图共享内存中的虚拟地址空间示意图:总体示意图:说明:共享内存是在物理内存上开辟了一块空间。不同的进程可以通过页表映射将开辟的物理空间内存映射到自己的共享区。不同的进程在代码当中操作共享区的虚拟地址,达到操作物理内存的目的,从而实现不同进程之间的通信。共享内存知己传输数
2020-10-20 10:05:55
894
原创 理解Linux文件系统之 inode
一、inode是什么?理解inode,要从文件储存说起。 文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文
2020-10-19 16:13:35
485
原创 Static修饰类成员/输出运算符和类的成员函数/友元函数
Static修饰类成员C语言: 变量:static修饰全局变量,static修饰局部变量 函数:改变函数链接属性,表明,该函数只能在当前文件中使用C++:变量:static修饰全局变量,局部变量,成员变量是类的属性,布属于某个具体的对象,是所有类对象共享的成员变量静态成员变量不会影响sizeof的大小静态成员变量在类中只是声明,需要在类外进行定义静态成员变量访问:对象.静态成员变量 || 类名::静态成员变量名字静态成员变量不能再构造函数初始化列表的位置进行初始化(因为初始化列表中只能
2020-10-18 10:38:38
274
原创 C++中模板讲解
模板1. 泛型函数2. 函数模板函数模板概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则3. 类模板类模板的定义格式类模板的实例化1. 泛型函数如何实现一个通用的交换函数呢?void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}void Swap(double& left, double& right){ double temp = l
2020-10-16 17:46:08
341
原创 C++动态内存管理你知道吗?
1 operator new与operator delete函数new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。new和delete不是函数,是c++中的操作符或者关键字。new/new[]在从堆上申请空间期间,会调用构造函数来对空间进行初始化,也就是创建了对象。delete/
2020-10-15 16:48:08
227
原创 动态内存管理面试夺命六连问?
动态内存管理面试夺命五连问1 程序运行起来后,内存被分为几个区域?操作系统为什么要对内存分这些区域?2 什么是动态内存?3 为什么需要进行动态内存申请呢?4 动态内存申请时,需要注意什么问题?5 C语言中是如何进行内存申请的?5.1 malloc/calloc/realloc有什么区别?5.1.1 相同点5.1.2不同点void* malloc(size_t size) ;void* calloc(size_t num, size_t size);void* realloc(void* ptr, size
2020-10-14 16:44:58
157
原创 对类和对象、面向对象和面向过程、封装自己的理解
1 什么是类?类是对一个相同群体来进行描述的,描述对象都具有那些属性(成员变量),描述对象都具有那些功能(成员函数)。在C++中,定义一个类时,就相当于定义了一个类型,也定义了一个新的作用域。类相当于是一张图纸,在图纸上涉及房子的样式,(类是不占用空间的,而用类定义出来的对象是“占用空间”),即数据是不能放到类中,只能存储到用来类定义出来的对象中。2 什么对象?对象是实实在在存在的,是类的一种具体的表现,是用类类型定义出来的一个变量,数据最终都是放在对象当中的。也就是说对象相当于是用图纸建造出
2020-10-14 08:56:48
206
原创 静态库和动态库/文件描述符与文件指针/文件操作/重定向
c语言阶段学习文件操作复习1 打开文件FILE fopen(const char path, const char* mode)**path:需要打开的文件路径,可以是绝对路径,也可以是相对路径mode:以什么方式打开文件r:以读模式打开文件,如果文件不存在,则报错r+:以读写模式打开文件,如果文件不存在,则报错w:以写模式打开文件,如果文件不存在则创建文件。如果文件存在,则清空文件内容,文件流指针指向文件的头部。w+:以读写模式打开,如果文件不存在则创建文件。如果文件存在,则清空文件内容
2020-10-10 21:35:14
442
原创 minishell 程序的简单实现---bash
minishell 程序使用到的技术:创建子进程,进程替换,进程等待理解bash(命令行解释器)本身也是一个程序,在命令行解释器中输入ls,pwd,mv,cp等这些命令的时候,其实bash也是创建了一个子进程,让子进程去进程程序替换执行相应的命令程序。实现3.1 从标准输入当中获取用户输入的命令3.2 创建子进程,让子进程进行进程替换,执行刚刚从标准输入读进来的命令3.3 父进程需要子进程进行进程程序替换的时候,父进程进行进程等待,防止子进程变成僵尸进程图解: #include &
2020-10-08 10:49:11
235
原创 Linux中进程控制讲解--进程创建/进程等待/进程终止/进程程序替换
1. 进程创建在进程中fork函数创建子进程。返回值小于0,子进程创建失败;大于0,返回给父进程;等于0,返回给子进程。’原理:子进程拷贝父进程的PCB。int vfork函数—>创建子进程的函数2. 进程终止3. 进程等待4. 进程程序替换...
2020-10-08 10:48:35
269
原创 内存和磁盘的关系解读(读书笔记)
内存和磁盘的关系解读不读入内存就无法运行 在考虑内存和磁盘之间的关系之前,我们首先来看一个前提性的东西。 程序保存在存储设备中,通过有序的被读出来实现运行,这一点搭建都很清楚。在一机制被称为存储程序方式(程序内置方式),现在看来是理所当然的,但在当时他的提出可以说是一个里程碑式。因为在此之前的程序都是通过改变计算机的布线等改变程序的。 计算机中主要的存储部件是内存和磁盘。磁盘中存储程序,必须要加载到内存后才能运行。在磁盘中保存的原始程序是无法运行的,这是因为负责解析和运行内容的CPU需要通过内
2020-09-04 22:48:56
975
原创 c++构造函数/析构函数/拷贝构造函数/赋值运算符/const成员函数详述
接上篇类和对象的博客,如果读者想要阅读的,可以向前翻阅。1.类的6个默认成员函数当一个类中什么都没有写的时候,称之为空类,空类包含6个默认的成员函数。这6个默认的成员函数不是用户生成的,而是编译器自己生成2. 构造函数2.1 概念对于以下日期类:class Data{public: void SetData(int year, int month, int day) { _year = year; _month = month; _day = day; } void
2020-08-15 23:15:09
467
转载 一文读懂CPU缓存原理!
CPU总体概述 CPU 缓存「Cache」指的访问速度比一般内存快得多的高速存储器,主要是为了解决 CPU 运算速率与内存读写速率不匹配的问题。因为 CPU 的运算速率比内存读写速率快得多,当 CPU 需要向内存请求数据或者写入数据时,就需要一直等待内存缓慢的读写。在这个过程中,CPU 的高速运算能力就无法得到充分发挥。 所以缓存的作用就像是 CPU 和内存之间进行数据缓冲的桥梁。 缓存中的数据是内存中的一部分,这一部分数据被认为是 CPU 在短时间内会即将访问到的数据。当 CPU 在调用数据时
2020-08-14 14:25:23
2289
原创 Linux进程讲解--操作系统/task_struct/僵尸状态/孤儿状态/IO信息&记账信息/进程优先级(PR)/fork/虚拟地址空间/ 分页式...
1 进程冯诺依曼体系结构冯诺依曼:计算机之父,在物理、化学、数学、也具有很大贡献,开始是研究原子弹的。冯诺依曼体系结构图:关于冯诺依曼,必须强调几点:这里的存储器指的是内存,且所有数据在内存中存储的时候,采用2进制的方式进行存储不考虑缓存情况,这里的cpu能且只能对内存进行读写,不能访问外设(输入或者输出设备)外设要输入或者输出数据,也只能写入内存或者从内存中读取,且中央处理器的数据来源于存储器一句话,所有设备都只能直接和内存打交道。2 操作系统(Operator System)概
2020-08-08 21:06:40
381
原创 Linux中环境变量详解
1. 基本概念环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数;如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找;环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。2. 常见环境变量HOME:保存用户家目录的环境变量查看环境变量方法;SHELL:保存当前使用的命令行解释器;PATH:保存可执行程
2020-08-08 20:56:58
408
原创 Linux中僵尸状态和孤儿状态详细分析
僵尸状态&僵尸进程#include <stdio.h>#include <unistd.h>int main(){ printf("hello\n"); pid_t ret = fork(); if(ret < 0) { perror("fork"); return 0; } else if(ret == 0) { //child while
2020-08-08 20:55:30
709
原创 Linux中父进程和子进程关系讲解
先上代码:#include <stdio.h>#include <unistd.h>int main(){ printf("--------begin------\n"); pid_t ret = fork(); if(ret < 0) { perror("fork"); return 0; } else if(ret > 0) { //father
2020-08-06 11:02:50
3946
原创 linux环境基础开发工具详细使用(yum、vim、gcc/g++、gdb、make、git)
1 Linux 软件包管理器 yum什么是软件包在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.yum(Yellow dog Updater, Modified)是Linux下非常常用的一种
2020-08-03 23:19:58
1228
1
原创 c++类/类的作用域/类的访问限定符及封装/类的实体化/类对象模型/this指针详解
1.面向过程和面向对象初步认识面向过程:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。其中对小程序的解决还是可以的,但缺点是不适合开发大的应用程序,而且对于程序的维护较差,某一小步出错的话,维护起来比较麻烦。面向过程:C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。简单来说,C++中结构体(在C++中称为类)可以用来描述对象的属性信息 + 定义对象的所具有的功能 == 一个对象。2.类的引入C语言中,结构体中只能定义变量,
2020-07-31 22:57:24
855
原创 C++基础内容--命名空间/函数重载/引用/内联函数/auto关键字/for循环/指针空值nullptr
命名空间在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题。命名空间的定义定义的时候需要使用namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间:实际就是一个带有名字的作用域(::作用域运算符)命名空间的使用1 直接在成员前增加 N::2 using N::a ,相当
2020-07-30 15:23:18
372
原创 Linux基本操作指令--ls/rm/cp/mv/cat/hand/tile/less/more/压缩/解压缩/man/权限/等指令
1 ifconfig查看网卡信息2 Is(list)查看文件属性信息,查看文件夹的内容linux操作系统中 —> " . "代表当前路径(代表当前目录)—> " / "代表根目录(相当于win下的计算机)a 列出目录下的所有文件,包括以 . 开头的隐含文件。-d 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录-i 输出文件的 i 节点的索引信息。 如 ls –ai 指定文件-k 以 k 字节的形式表示文件的大小。ls –alk 指定文件-l 列出文
2020-07-25 08:34:36
740
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人