自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (4)
  • 收藏
  • 关注

原创 浅析函数栈

函数调用大家都很熟悉了,写代码的人每天都在各种调用,那这个函数调用怎么实现的呢,通过栈实现的,但并不是说只能用栈实现,只是正好栈的先入后出,后入先出的特性正好满足函数调用的特性。如果感兴趣的可以研究研究其他的方式。下面就介绍一下函数栈。 ...

2021-12-20 13:32:07 814

原创 2021-06-18

我已经两年没有更新我的博客啦,平时工作实在太忙了,996的福报我受不了了,所以有一点点想换份工作,所以我又要开始我的博客之旅了,此次博客会按照算法-leetcode题目-设计模式-sql-然后就是一些书的学习笔记!希望能坚持下去,看到的亲记得催更,不然木有动力!明天开始啦!!!...

2021-06-18 11:41:58 155 5

转载 buffer和cache的区别

作者:知乎用户链接:https://www.zhihu.com/question/26190832/answer/32387918来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到**加快访问速度**的作用。而 buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平...

2019-08-18 12:01:49 515

转载 GPU与CPU的区别

转载自:https://www.cnblogs.com/biglucky/p/4223565.html如介意请联系我。我觉得这个是我看到的比较清晰的介绍了CPU与GPU区别的了,关于文章中cache、buffer等概念的解释,我会另开一篇,如已经了解可直接看这篇。1.2CPU和GPU的设计区别CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。C...

2019-08-18 12:00:47 11885

原创 中缀表达式转后缀表达式

自从找完工作人就废了,幡然醒悟不行不行,得把忘记的都记下来。。。。。。中缀表达式就是我们正常使用的那种,例如:a+b*c后缀表达式就是abc*+;为什么要有中缀表达式和后缀表达式呢?因为中缀表达式便于人们的理解与计算,但是后缀表达式更方便计算机的运算(如二叉树、堆栈的方法计算),因此在读取一个中缀表达式后,我们得办法将他转化为后缀表达式。转化方式有三种:首先假设我们需要转化...

2019-04-12 17:55:21 95497 38

原创 打开jupyter notebook时打不开网页,网页不显示等情况

python小白为了学习爬虫,在第一步就遇到了问题,记录一下解决办法在windows下打开jupyter notebook时,首先是win+r打开控制台然后输入ipython notebook打开时会默认使用IE浏览器,但是只显示一个home不能打开使用,这是因为不支持该浏览器的原因。1、win+r   然后输入jupyter notebook --generate-config2...

2018-11-30 17:34:20 15390 10

原创 二十六进制加法

二十六进制加法#include<iostream>#include<string>#include<vector>#include<stdio.h>using namespace std;vector<char> add(string str1, string str2){    vector<char>...

2018-09-08 10:00:24 628 2

原创 PCB的信号集

      每一个进程都有一个PCB(进程控制块),在PCB中有两个信号集,分别是未决信号集和阻塞信号集。       其中未决信号集是记录有没有信号来临,一旦有信号来临则该信号位置1,如下图中有2号信号来临,则将2号未决信号集置1,然后未决信号集再将该信号像阻塞信号集传递,如果对应2号信号集的位是1,则表示阻塞,该信号被阻塞在了阻塞信号集上无法到达句柄,该信号处于未决态。若阻塞信号集的2号信...

2018-08-24 14:44:30 598

原创 pipe管道通信原理

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信管道是一种最基本的IPC机制,由pipe函数创建:#include <unistd.h>int pipe(int filedes...

2018-08-03 22:50:26 23715 3

原创 僵尸进程和孤儿进程

每个进程都是由用户空间和系统空间组成,pcb在系统空间。一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。我们知道一个进程的退出状态可以在Shell中用特殊...

2018-08-03 20:55:35 472

原创 cpu如何运行进程

     cpu主要是由运算器、寄存器、控制器和译码器组成,当我们运行一段代码的时候,代码被加载进寄存器中,(单cpu单核的情况)当有另一个进程需要运行的时候,第一个进程就会被存入pcb的栈中,等到一定的时间在重新加载到寄存器中运行。      一般情况下,cpu处理数据能力有1Ghz=1ns,多进程的时候cpu采取分时复用的方式进行,每个进程10ms或者其他时间的进行交换,由于运行速度很快所...

2018-08-02 16:19:10 1947

原创 虚拟内存

         每一个进程在打开时,都各自有自己的pcb(进程控制块),pcb相当于一个指针,指向文件描述符表,假如一个进程要打开一个文件就会产生一个句柄(文件描述符),该句柄通过pcb指向文件描述符表,通过文件描述符表的内容在磁盘中找到你想打开的文件。pcb在内核中,每一个进程打开时都会有内核层和用户层,其中内核层是不对用户开放的,其中包含命令行参数和环境变量。用户层就是我们常见的堆栈常量...

2018-08-02 15:08:13 3686

原创 linux下IO工作机制

        每一个FILE文件流(输出流、输入流、错误流)都有一个缓冲区buffer,默认大小8192Byte。        每一个文件流都有三个部分组成:文件描述符 、位置指针、缓冲区buffer。如下图右边所示        我们平时写程序用到的都是c标准函数,我们并不清楚在操作系统中怎么处理我们的输入的,下面就以printf来距离说明:假如现在有程序A需要向屏幕输出hell...

2018-07-31 22:22:32 802

原创 树的非递归调用遍历(中序遍历)

本文讲的是非递归调用的中序遍历,如果想知道递归调用的中序遍历可以看我的另一篇博文分析:1、访问顺序     中序遍历是当左子树为空或者左子树已经访问完毕以后,在访问根节点。访问完根节点在访问右子树。2、选择什么类型的数据结构(栈?队列?)     因为先走到的后访问,后走到的先访问,所以很显然是栈结构。3、节点所有路径的情况     步骤1、如果节点有左子树,该节点入栈...

2018-07-22 16:21:43 531

原创 拷贝二叉树

拷贝二叉树,就是要拷贝根节点,叶子节点,第一步得先分配一个空间给根节点, BiTNode* newnode = (BiTNode*)malloc(sizeof(BiTNode));将其叶子节点指向NULL,在判断原树的根节点的左节点和右节点是否为空,不为空就得复制过去,利用迭代就很容易做到。最后将新的子节点和根节点链接起来。typedef struct BiTNode{    int da...

2018-07-22 14:46:47 2203

原创 计算树的高度

树的高度就是数的层数。那怎么计算树的高度呢?我们可以分贝将左节点的高度计算出来和右节点的高度计算出来,在比较大小。大的就是树的高度。 其实不管是求树的高度还是叶子节点个数,都是在遍历整个树,只不过在遍历的过程中满足了某种条件就做出一定的处理,所以树的遍历是最基本的。typedef struct BiTNode{    int data;    struct BiTNode* ...

2018-07-22 10:55:10 12794 3

原创 求树的叶子节点个数

首先我们得知道什么事叶子节点,叶子节点就是只有根节点没有子节点的节点。下面我们就根据这个特性来写一下这个程序typedef struct BiTNode{    int data;    struct BiTNode* lchild, *rchild;}BiTNode;int sum = 0;//用来存放叶子节点个数void CountLef(BiTNode *root){ ...

2018-07-22 10:43:06 12106

原创 树的遍历的本质

树的遍历分为前序中序后序,这三种遍历的本质是什么呢?其实不管哪种遍历方式遍历的路径都是一样的,为什么结果不一样,就在于是第几次遍历的时候输出。下面我们来看一下遍历的图如上图可以看出每一个节点都会经过三次,就像一个邮递员在寄信的时候,可以选择是第一次经过你家的时候给你投信还是回来再经过你家的时候给你投信。第一次经过一个节点的时候就输出就是前序遍历,第二次经过的时候输出就是中序遍历,最后一次经...

2018-07-22 09:20:32 467

原创 树的遍历(前序、中序、后序)

前序遍历的思想:先遍历根节点,在遍历左节点,最后遍历右节点。中序遍历的思想:先遍历左节点,在遍历根节点,最后遍历右节点后序遍历的思想:先遍历左节点,在遍历右节点,最后遍历根节点光这么说太过于抽象,就举个例子说一下。前序遍历:首先遍历根节点所以输出1,然后左节点,发现左节点也是一个根节点就输出2,在遍历2的左节点,输出4,然后就到右节点了,此时以2为根节点,所以右节点是5,以...

2018-07-21 22:55:27 311

原创 计算机如何计算我们的表达式的

计算机的工作本质就是做数学运算,计算机喜欢做后缀运算,而我们自己却是喜欢做中缀运算,所以计算机就会自动将我们的中缀运算转化成后缀运算,现在我们自己通过栈的应用来实现以下这个功能。例如:5+4=>54+1+2*3=>123*+ 在转化之前我们得知道计算机是如何做的转化,下面我们就来看一下这个算法1遍历中缀表达式的数字的符号,对于数字,直接输出。2对于符号:左括...

2018-07-21 22:33:30 2891

原创 异常简单使用

class A{public: A() { cout << "A构造" << endl; } ~A() { cout << "A析构" << endl; }};class B{public: B() { cout << "B构造" << endl; } ~B() { cout

2018-07-15 15:47:21 122

转载 c++抽象类

本文转载自https://www.cnblogs.com/dongsheng/archive/2013/09/28/3343939.html如有不妥请联系我予以删除C++抽象类一、纯虚函数定义.     纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”二、引入原因:1、为了方便使用多态特性,我们常常需要在...

2018-07-12 15:19:45 3823

转载 抽象类的作用

该文章转载自https://www.cnblogs.com/heyonggang/p/3142338.html如有不妥请联系我老是在想为什么要引用抽象类,一般类不就够用了吗。一般类里定义的方法,子类也可以覆盖,没必要定义成抽象的啊。看了下面的文章,明白了一点。其实不是说抽象类有什么用,一般类确实也能满足应用,但是现实中确实有些父类中的方法确实没有必要写,因为各个子类中的这个方法肯定会有不同,所以...

2018-07-12 15:12:33 900

原创 纯虚函数

纯虚函数和抽象类1、纯虚函数是一个在基类中说明的虚函数,在基类中没有定义要求任何派生类都定义自己的版本2、纯虚函数为各派生类提供一个公共接口(接口的封装和设计,软件的功能模块划分)3、一个纯虚函数的基类是抽象类。#include<iostream>using namespace std;#include<stdlib.h>class Figure{public: virtu...

2018-07-12 15:11:09 237

原创 多态的使用和虚函数表

在什么情况下会使用多态,在定义一套接口时,如这个接口void compare(Student &st, StudyBySelf &sb),定义的是父类指针但是在传入子类指针的时候希望执行的是子类的函数如 compare(pr, sb);,但是if (st.educational() > sb.educational())传入的是pr希望调用Primal这个子类的educa...

2018-07-11 22:32:44 378

原创 虚析构函数

#define  _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;class A{public: A() { p = new char[20]; strcpy(p, "obja"); cout << "A g" << endl; } virtual ~A() { delete []...

2018-07-11 22:21:28 92

原创 友元函数和重载

友元函数:类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend重载函数步骤:...

2018-07-11 10:54:42 2777

转载 cout、cin等的本质

此文转载于https://www.cnblogs.com/honkly/p/3724647.html我个人认为写的很好,很透彻从原理各方面来详细阐述了iostream。VC中头文件为:#include <iostream.h>这个在c中没有。是C++引进的。cout<头文件#include中printf()类似。只是不需要标明数据类型。endl就是end of line...

2018-07-10 10:38:31 1616

原创 c中数组常量字符串和指针常量字符串的区别

常量字符串例如“abcde”这种的系统会将他们放在常量区,而常量区就是意味着不能修改的,只可以读取的数据区域,并且相同常量字符串只有一份。void string2(){ char* p = "abcde"; printf("%p\n", p); char*p1 = "abcde"; printf("%p\n", p1);}如上,p1和p的地址是一样的,他们都指向的是同一个常量向量,这是编译器做的优...

2018-07-10 09:51:18 1566

原创 类的静态成员函数

class My1{private: int a;        static b;public: static  void set(int a) { this->a = a;//此时this没有实例 是不存在的。 } My1(); ~My1(); My2 mymm;};My1::b;//这样是可以的,因为b已经存在以上程序是错的,因为静态成员函数是不可以对非静态的成员变量进行操作的。错误...

2018-07-09 22:47:28 195

原创 c++在一个类中嵌套另一个类的对象

class My2{public: My2(); ~My2();};class My1{public: My1(); ~My1(); My2 mymm;};My1::My1(){ std::cout << "my1gouzao " << std::endl;}My1::~My1(){ std::cout << "my1xigou " << std::...

2018-07-09 22:30:42 17717 1

原创 c++中两种初始化方式的区别

首先我们来看一下两种初始化:int ival(1000);//直接初始化是将初始化式放在括号里int ival=1000;//复制初始化是用等号(=)那么这两种方式有什么区别呢?我们可以这样认为,对于内置类型来说,复制初始化和直接初始化几乎没有差别,对于类类型来讲,当创建类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初...

2018-07-07 14:47:27 1400 3

原创 函数模板包装器

在模板函数中,引用无效,必须使用引用包装器template<typename T>void com(T num){ num++;}void main(){ int num = 9; com(num); std::cout << num << std::endl; int &pnum = num; com(pnum); std::cout <<...

2018-07-05 21:20:14 220

原创 函数包装器

#include<functional>template<typename T,typename F>T run(T a, F f){ return f(a);}void main8(){ using std::function; double db = 12.9; //       返回值(参数) function<double(double)> fun1 =...

2018-07-05 21:07:03 393

原创 通用可变参数函数模板

//通用可变参数模板void showall()//空函数  起到接口的作用  用来结束递归{}template<typename T,typename...Args>void showall(T value, Args...args){ std::cout << value << std::endl; showall(args...);}void main()...

2018-07-05 21:06:30 371

原创 new的高级用法

const int buf(512);int buffer[buf] = { 0 };//静态区void main(){ int *p1 = new int[3]; int *p2 = new(buffer) int[3]; for (int i = 0; i < 3; i++) { p1[i] = i; p2[i] = i + 4; std::cout << "&...

2018-07-05 15:44:31 214

原创 C++中的tuple(元组)

tuple是类似于结构体,功能跟C语言中的结构体一样。在不需要创建结构体的前提下可以使用类似于结构体的功能下面是touple的简单使用//使用元组需定义的头文件#include<tuple>void main(){       //创建元组 std::tuple<int, char, double>tp(2, 'b', 1.9); auto data0 = std::get...

2018-07-05 11:00:07 5226

原创 新式字符串

较C语言而言是新式字符串:#include<iostream>#include<array>#include<string>void main1(){ double db[4] = { 1.1,2.2,3.3,4.4 }; std::array<double, 4>newdb = { 5.5,6.6,7.7,8.8 }; std::array<...

2018-07-05 09:42:16 120

原创 一维数组的引用和二维数组的引用以及函数指针的引用

#include<iostream>using namespace std;#include<stdlib.h>void main(){ int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; int(&ra)[10](a);//一维数组的引用 int i = 1; for (auto data : ra) { data += i; //i+...

2018-07-04 21:48:48 4377

原创 c++内联函数

inline只是对于编译器的建议一般情况下,我们对内联函数做如下限制1、不能有递归2、不能包含静态数据3、不能包含循环4、不能包含switch和goto语句5、不能包含数组若一个内联函数不能满足以上限制,则编译器把他们当做普通函数...

2018-07-03 20:08:36 298

用c++实现任意位数的乘法

任意位数的乘法,经常会遇到需要随意输入数据的情况下可以直接计算出结果。类似于实现计算器功能

2018-07-07

一个简单的解决6位数密码的代码

一个六位数密码 ,第一位是3 ,第四位是7 , 且相邻的密码不能是相邻的数字,,变成求解所有可能的密码。

2018-06-28

mt-metis-0.6.0tar.gz

METIS主要的特性如下。首先,METIS具有高质量的划分结果,据称比通常的谱聚类(spectral clustering)要精确10%-50%。其中Chaco支持谱聚类算法。其次,METIS执行效率非常高,比常见的划分算方法快1-2个数量级。百万级顶点的图几秒钟之内就可以切分为256个类。最后,METIS具有很低的注入元(fill-in ),从而降低了存储负载和计算量。

2018-05-14

petsc-3.8.4.tar.gz

Petsc是系列软件和库的集合,三个基本组件SLES、SNES、和TS本身基于BLAS、LAPACK、MPI等库实现的,同时为TAO、ADIC/ADIFOR、Matlab、ESI等工具提供数据接口或互操作功能,宁具有极好的可扩展性能。

2018-05-14

空空如也

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

TA关注的人

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