自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 资源 (2)
  • 收藏
  • 关注

原创 c++————虚函数&虚函数表

C++虚函数原理C++中的虚函数的作用主要是实现了多态的机制。关于多态,就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。也就是试图使用不变的代码来实现可变的算法。虚函数的实现包括两部分,虚函数指针和虚函数表。虚函数指针虚函数指针 (virtual function pointer) 从本质上来说是一个指向函数的指针,与普通的指针并无区别。它指向用户所定义的虚函数,具体是在子类里的实现,当子类调用虚函数的时候,实

2022-01-22 20:14:41 817

原创 哈工大操作系统实验4---基于内核栈切换的进程切换

前置知识关于栈桢关于栈栈帧详解https://blog.csdn.net/ylyuanlu/article/details/18947951进程切换流程首先先了解一下进程切换的流程。开始的时候一个进程(or线程,在这里不加以区分,简单的认为二者的区别只是在是否产生内存映射表的切换,其他方面相同)A正在运行,CPU通过取指执行的方式一点点的去执行它的代码,突然遇到一个中断(系统调用、外部中断、异常),然后就要进入到A进程的内核态去执行相应的中断服务例程,在这期间突然不小心发生一个意外,程序的执行由于缺

2021-12-02 19:12:22 1256 3

原创 哈工大实验3lab-------进程运行轨迹的跟踪与控制

实验目的:掌握Linux下的多进程编程技术;通过对进程运行轨迹的跟踪来形象化进程的概念;在进程运行轨迹跟踪的基础上进行相应的数据统计,从而能对进程调度算法进行实际的量化评价,更进一步加深对调度和调度算法的理解,获得能在实际操作系统上对调度算法进行实验数据对比的直接经验。、pid 是进程的 ID;X 可以是 N、J、R、W 和 E 中的任意一个,分别表示进程新建(N)、进入就绪态(J)、进入运行态®、进入阻塞态(W) 和退出(E);time 表示 X 发生的时间。这个时间不是物理时间,而是系统的滴答时

2021-11-29 14:30:11 990

原创 哈工大操作系统实验lab2-增加系统调用

实验原理1、为什么需要系统调用才可以访问内核了保证系统的安全性以及稳定性, 当用户的程序直接访问OS内核, 就能够方便的修改内核数据, 造成系统的崩溃, 隐私泄露等等的问题, 因此我们的OS不允许用户程序直接访问内核空间和代码.2、如何实现内核空间和用户空间的隔离通过硬件实现, 在硬件上将内存空间分为内核态和用户态, 用户态的程序只能够自由的访问用户态的数据, 内核态下程序可以访问任意的空间.我们使用CPL来表示当前内存段的特权级, 用DPL来表示目标内存段的特权级, 特权级越高数字越小. 我门每

2021-11-24 12:00:55 962

原创 哈工大操作系统实验lab1

实验内容改写 bootsect.s 主要完成如下功能:bootsect.s 能在屏幕上打印一段提示信息“XXX is booting…”,其中 XXX 是你给自己的操作系统起的名字,例如 LZJos、Sunix 等(可以上论坛上秀秀谁的 OS 名字最帅,也可以显示一个特色 logo,以表示自己操作系统的与众不同。)改写 setup.s 主要完成如下功能:bootsect.s 能完成 setup.s 的载入,并跳转到 setup.s 开始地址执行。而 setup.s 向屏幕输出一行"Now we

2021-11-24 09:56:39 1717

原创 环形队列的实现

上代码(利用一个空元素来区分队列是空的还是满的)//用一个空元素来表示这样就可以区分队满以及队空; #include<stdio.h>#include<stdlib.h>#define OK 1 //返回的状态#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFFLOW -2 //溢出#define INIT_SIZE 10typedef int QElemtype;typedef int

2021-08-26 11:36:00 117

原创 c++----右值引用

最近看了侯捷老师的书籍,看到了右值引用,梳理一下右值引用的用法,以及特点:右值、左值既然是右值引用,我们首先要理解的是什么是右值什么是左值:1、位于赋值号(=)左侧的表达式就是左值;反之,只能位于赋值号右侧的表达式就是右值;2、有名称的、可以获取到存储地址的表达式即为左值;反之则是右值。左值在内存中有特定地址的量,在程序中存在的时间比较长;右值实在寄存器中的量,在程序中存在的时间比较短暂;简单的说我们区分一个左值和右值的办法就是看能不能对表达式取地址,如果能,则为左值,否则为右值。int a =

2021-07-09 15:32:01 399

原创 c++之 new expression

new 一个对象发生了什么?new对象发生的事情Complex *pc = new Complex(2,4);当编译器看到上边代码时会做出以下动作:Complex *pc;try{ void *mem = operator new(sizeof(Complex));//先分配内存空间 pc = static_cast<Complex*>(mem);//指针转型 pc->Complex::Complex(2,4)//在调用构造函数}//delete pc编译器转为

2021-07-05 11:48:28 304

原创 c++智能指针unique_ptr和weak_ptr

unique_ptrunique_ptr简介一个unique_ptr “拥有”它所指向的对象。与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定的对象。即两个 unique_ptr 不能指向一个对象,unique_ptr 之所以叫这个名字,是因为它只能指向一个对象,即当它指向其他对象时,之前所指向的对象会被摧毁。其次,当 unique_ptr 超出作用域时,指向的对象也会被自动摧毁。与shared_ptr不同,没有类似make_shared的标准库函数返回一个unique_p

2021-07-03 12:04:03 224 1

原创 c++ 智能指针shared_ptr详解

参考资料:: C++primer为什么需要智能指针在c++中,动态内存的管理的管理是通过一对运算符来完成的:new在内存中为对象分配空间并返回一个指向该对象的指针,delete接受一个动态对象的指针,销毁该对象,并且释放与之关联的内存。来看一个例子:int *process(int *a){ int *b =new int(200);}在函数 process中我们申请了一块内存,但是在函数体内b 是一个临时变量,离开函数会销毁,但是我们动态申请的内存不会消失,这样就会造成内存泄漏;有时在尚

2021-07-02 21:55:53 969 3

原创 c++分配器简易版内存池的实现

前几天看完了侯捷老师的内存管理这门课,想动手实现一个简易版的内存池这里记录一下:为什么需要内存池首先我们需要了解malloc申请一块内存时,内存的布局情况如下图:我们会发现实际的内存比我们申请的内存要多出许多东西,首先时上下两个cooki,cooki记录的是申请内存的大小和内存的状态,具体可以看一下侯老师的视频。如果我们一直用malloc申请内存,会浪费许多不必要的内存,那么怎样才能解决这种办法呢,那就是内存池.什么是内存池内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下

2021-06-30 11:25:31 373 1

原创 图解堆排序

完全二叉树一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。堆排序堆排序的时间复杂是O(nlgn)...

2021-06-25 12:04:20 115

原创 C++新特性--variadic Template

variadic Template(数量不定的模板参数)模板的参数在照往常来说是固定的大小之后让编译器进行推导,但是现在c++11出现了新的东西就是模板函数的参数可以使不确定的。1、语法:声明一个带有可变参数个数的模板的语法如下所示:template<typename ...Args> class tuple;tuple<int, string> a; //使用在模板参数 Args左边出现省略号 … ,就是表示Args是一个模板参数包(template type par

2021-06-24 09:48:54 373 2

原创 c++虚拟继承

虚拟继承虚拟继承引入的原因:在多继承方式下,派生类继承多个基类,当两个不同的基类拥有同名成员时,产生名字冲突。看一个例子:#include<iostream>using namespace std;class A{ public: void f(){ cout<<"A中的f调用" << endl; }}; class B:public A{};class C :public A{ }; class D: public B, p

2021-06-22 10:51:51 783

原创 函数返回值是类对象的问题

首先明确一个问题什么时候调用复制构造函数:1、用一个对象初始化另一个对象时;2、函数的形参是一个对象时而非引用;3、函数返回值时类对象的时候。#include <iostream>using namespace std;class Test{public: Test(){ cout <<"默认构造函数调用" << endl; } Test(const Test &t) { cout <<"复制构造函数调用" &

2021-06-20 20:50:25 2187 1

原创 抽象基类cpp

OOP面向对象程序设计(object-oriented programming)的核心思想就是数据抽象,继承和动态绑定。多态性分两类:静态多态性:函数重载和运算符重载实现的多态性属于静态,又称为编译时的多态性动态多态性:在程序运行过程中才动态确认操作所针对的对象,又称为运行时多态性,通过虚函数实现。虚函数:对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明成虚函数。虚函数允许通过基类指针或引用来访问基本和派生类中的同名函数,通过指针调用同名函数,而不是通过对象名。虚

2021-06-16 22:21:22 296

原创 二叉搜索树

什么是二叉搜索树二叉搜索树对于任何节点x,其左子树中的关键字最大不超过x的关键字。其右子树中的关键字最小不低于x的关键字。如图所示:

2021-06-10 22:12:49 241

原创 二手车交易价格预测 (数据分析)————task(2)

EDA-数据探索性分析EDA目标EDA的价值主要在于熟悉数据集,了解数据集,对数据集进行验证来确定所获得数据集可以用于接下来的机器学习或者深度学习使用。当了解了数据集之后我们下一步就是要去了解变量间的相互关系以及变量与预测值之间的存在关系。引导数据科学从业者进行数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测问题更加可靠。完成对于数据的探索性分析,并对于数据进行一些图表或者文字总结并打卡。内容介绍1、导入数据处理库可视化库2、载入数据3、数据总览4、数据缺失值,异常值5

2021-04-13 17:16:51 428 1

原创 深度学习作业 Building your Deep Neural Network: Step by Step

#导入作业中所需要的所有软件包。import numpy as npimport h5pyimport matplotlib.pyplot as pltfrom testCases_v2 import *from dnn_utils_v2 import sigmoid, sigmoid_backward, relu, relu_backward%matplotlib inlineplt.rcParams['figure.figsize'] = (5.0, 4.0) # set default

2021-03-17 10:36:29 260

原创 机器学习 线性回归(吴恩达)

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltpath = '1.txt'data = pd.read_csv(path,names=['Population','Profit'])data.head() Population Profit0 6.1101 17.59201 5.5277 9.13022 8.5186 13.66203 7.0032 11.85404 5.8

2021-03-10 12:01:59 283

原创 理解位运算及其用法

位运算及其用法异或 ^参与运算的两个位,如果两个位相同结果为0,不同为10^0 = 0;1^1 = 0;1^0 = 1;三个特点:1、0 异或任意数还是任意数2、1异或任意数等于任意数取反3、任意数与自己异或相当于置零操作用途:1、用于不使用临时变量交换两个数(注意一点如果两个数相同就不能进行交换)例如交换a、b的值a = a^b;b = a^b;a = a^b;2、某些特定位进行反转:例如对11100010的1、2位进行反转 11100010^00000011 1

2020-12-28 20:54:39 327

原创 回溯算法 + 详解

什么是回溯算法要想了解回溯算法,就要知道什么是递归,其实回溯和递归是密不可分de,要有了递归,就能有回溯。回溯算法的性能并不是很高,因为回溯算法其实就是穷举算法。回溯算法可以解决以下集中问题:组合问题排列问题子集问题棋盘问题理解回溯算法回溯算法解决的问题都可以抽象为一个树形结构,因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。递归就要有终止条件,所以必然是一颗高度有限的树(N叉树)。回溯法一般是在集合中递归搜索,集合的大小构成了树的宽

2020-12-25 10:23:00 767

原创 荷兰国旗问题(对三个数排序)

对{1,0,0,2,2,1,0,2}进行排序算法思路如图以1为分届小于一的在1的左边,大于1的数在1的右边这样就可以进行三个数的排序。算法思路:1、当cur小于划分值的时候:当前数与小于区的下一个数做交换,并且小于区范围扩一、cur+1;2、当cur等于划分值的时候:cur+1;3、当cur大于划分值的时候,cur与大于区的前一个做交换,大于区域+1,cur不变。include<iostream>using namespace std;void swap(int *arr,i

2020-11-24 12:12:53 152

原创 https://leetcode-cn.com/problems/linked-list-cycle-i 环形链表

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/linked-list-cycle-ii思路双指针,快慢指针如果能相遇,说明一定有环

2020-11-11 22:05:11 614

原创 160 https://leetcode-cn.com/problems/intersection-of-two-linked-lists/ 相交链表

编写一个程序,找到两个单链表相交的起始节点。https://leetcode-cn.com/problems/intersection-of-two-linked-lists/思路两个指针同时从两个链表的head开始移动,由此计算出两个链表的长度差。然后让较长的链表减去这个差值,再设置两个指针,边比较边移动class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {

2020-11-10 22:18:13 85

原创 c++中的特殊成员函数

复制构造函数复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中(包括按值传递参数),而不是常规的赋值的过程。类的复制构造函数原型通常如下:

2020-11-09 10:50:40 713

原创 768. 最多能完成排序的块 II (单调栈)

最多能完成排序的块 IIarr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块?示例 1:输入: arr = [5,4,3,2,1]输出: 1解释:将数组分成2块或者更多块,都无法得到所需的结果。题目来源https://leetcode-cn.com/problems/max-chunks-to-make-sorted-ii/思路找到最多能完成排序的块,就是要.

2020-11-06 21:45:41 177

原创 C++用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和

2020-11-05 20:40:23 422

原创 函数重载、引用

函数重载作用:函数名可以相同,提高复用性函数重载满足条件:1、同一个作用域2、函数名称相同3、函数参数类型不同或者个数不同或者顺序不同4、函数的返回值不可以作为函数重载的条件例子:void print(const char*str,int width);#1void print(double d,int width);#2void print(long l,int width);#3void print(int i,int width);#4void print(const char

2020-11-05 14:33:07 327

原创 leetcode字符串解码--Cpp

给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例 1:输入:s = “3[a]2[bc]”输出:“aaabcbc”示例 2:输入:s = “

2020-11-04 21:13:27 88

原创 cmake实战(4)

静态库和动态库的构建本节任务:建立一个静态库和动态库,提供HelloFunc函数供其他程序使用,HelloFunc向终端输出Hello World.安装头文件与共享库。1、建立t3目录2、建立共享库cd t3mkdir lib在t3目录下建立CMakeLists.txt内容如下PROJECT(HELLOLIB)ADD_SUBDIRECTORY(lib)在lib目录下建立源文件hello.c hello.hhello.c#include"hello.h"void HelloFun

2020-11-04 11:59:27 60

原创 设计一个支持增量操作的栈 数组实现

请你设计一个支持下述操作的栈。实现自定义栈类 CustomStack :CustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容纳的元素数量,栈在增长到 maxSize 之后则不支持 push 操作。void push(int x):如果栈还未增长到 maxSize ,就将 x 添加到栈顶。int pop():弹出栈顶元素,并返回栈顶的值,或栈为空时返回 -1 。void inc(int k, int val):栈底的 k 个元素的值都增加

2020-11-03 21:28:59 57

原创 cmake(3)

更好的Helloworld1、创建一个t2目录,把t1中的main.c和CmakeList.txt文件复制到t2.2、添加子目录src,把main.c移动到src目录中看一下t2目录的文件:3、需要为任何一个子目录建立一个CMakeList.txt文件,为src创建CMakelist.txtADD_EXECUTABLE(hello main.c)//生成目标文件4、t2目录的CMakeList.txt文件修改成PROJECT (HELLO)ADD_SUBDIRECTORY(src bin

2020-11-02 21:24:30 140

原创 字符的最短距离---cpp

题目描述给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。输入: S = “loveleetcode”, C = ‘e’输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shortest-distance-to-a-character思路1、类似双指针,先找到第一个相遇位置的下表,2、开始比较,计

2020-11-02 20:27:24 75

原创 cmake实战(2)

内部构建与外部构建上节讲的例子是“内部构建”,生成的代码比较多:这里展示一下外部编译1、首先清楚t1目录中除main.c和CmakeList.txt文件的所有中间文件2、在t1目录下建立一个build目录3、进入build目录,运行cmake … (点点代表父目录,父目录中存在我们需要的Cmakelist.txt)4、运行make构建工程,就会在当前目录中(build)获得目标文件hello.HELLO_SOURCE_DIR代表工程路径:t1目录HELLO_BINARY_DIR 代表编译

2020-11-01 21:46:53 101

原创 leetcode 第66题 加一 https://leetcode-cn.com/problems/plus-one。

题目描述:定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/plus-one。思路1、最后一位开始 遇 9 进 1,当前位值为 0,进入下次遍历2、如果加一小于 10,退出循环3、如果跳出循环,说明首位有进位,追加1时间复杂度O(n) n为循环的次数空间复杂度O

2020-11-01 21:30:38 676

原创 指针 和 const 结合

const 和 指针将const用于指针有一些很特比的地方。可以用两种不同的方式将const用于指针。第一种方式是让指针指向一个常量对象,这样可以防止使用指针来修改所指向的值,第二种方式是将指针本身声明为常量,这样可以防止指针改变指向的位置。声明一个指向常量的指针int age = 32;const int *ptr = &age;这里指出。ptr指向一个const int (这里的值是32),因此不能使用ptr来修改值。也就是说*ptr的值为const,不能被修改:*ptr = 20

2020-10-30 11:07:01 245

原创 cmake实战(1)

cmake “hello word” 内部编译1、准备工作建立一个目录用来存放文件例如:mkdir -p /zy/cmake///建立第一个目录cd /zy/cmake/mkdir t1cd t1建立main.c和CMakeLists.txt文档main.c#include<stdio.h>int main(){ printf("Hello World from t1 main?\n"); return 0;}CMakeLists.txtPROJECT (H

2020-10-28 20:18:48 110

原创 C++ 之 递增运算符(++)和递减运算符(--)

前缀格式(++i)和后缀格式(i++)++i的意思是先将i的值加一,在使用新的值计算表达式。i++的意思是使用当前的值计算表达式。然后再把i的加一。例如:int x = 5;int y = ++x;//运行之后x = 6;y=6;int z = 5;int y = z++;//运行之后z=6;y=5;副作用和顺序点副作用是指在计算表达式时对某些东西进行了修改;顺序点是程序执行过程中的一个点,在这里进入下一步之前将确保所有的副作用都进行了评估。(分号就是一个顺序点:意味着在处理下一

2020-10-27 11:25:23 683

原创 C++ 学习之共用体和枚举

共用体共用体union是一种数据类型,能够存储不同的数据类型,但只能同时存储其中的一种病数据类型。共用体的句法union one4all{ int int_val; long long_val; double double_val;};//可以使用one4all变量存储int、long、或者doubleone4all pail;pail.int_val = 15;//存储intcout << pail.int_val;pail.long_val = 38;//int 丢失

2020-10-26 09:26:05 125 1

c++实现简易内存管理

间要实现了一下内存池的设计,包含一个头文件一个测试文件

2021-06-30

matlab蚁群算法(各种经典蚁群算法for TSP).rar

使用蚁群算法求解TSP旅行商问题,精华蚂蚁,最大最小蚂蚁系统,基于最近邻最大最小蚂蚁系统,排序蚂蚁系统-RAS、自适应蚁群算法-自适应挥发系数

2020-06-18

空空如也

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

TA关注的人

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