自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(71)
  • 资源 (1)
  • 收藏
  • 关注

原创 排序算法(插入、选择、交换、归并)

八大排序算法1.排序的概念2.算法分析3.具体排序讲解3.1直接插入排序3.2希尔排序1.排序的概念排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。排序分为内部排序和外部排序。若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。2.算法分析插入排序直接插入排序将第一个和第二个元素排好序,然后将第3个元素插入到已经排好序的元素中,

2020-12-14 15:06:54 1466

原创 STL中的greater<T>()和less<T>()

在构造map、set、multimap、multiset这些序列式容器时,默认按照key值来进行排序,比较器默认从小到大。在构造时加上greater<T> 会让容器的比较器按照key值从大到小排序,less<T>则相反。#include<iostream>#include<map>#include<functional>using namespace std;int main() { map<int, string,greater

2020-12-14 09:34:28 525

原创 Linux进程间通信--消息队列

Linux进程间通信--消息队列消息队列(message queue)1.特点2.消息队列的使用消息队列的格式ftok()函数获取键值msgget()函数msgsnd()函数msgrcv()函数msgctl()函数3.模拟实现消息队列消息队列(message queue)消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管

2020-12-12 11:18:36 168

原创 Linux进程间通信--共享内存

Linux进程间通信--共享内存共享内存(Shared Memory)1.通信原理2.为什么共享内存通信最快?3.特征&优缺点4.共享内存的使用5.共享内存操作流程6.操作共享内存的函数创建共享内存:shmget()函数将共享内存映射到地址空间:shmat()函数解除内存映射:shmdt()函数控制共享内存:shmctl()函数ftok()函数指定key值7.共享内存实现共享内存(Shared Memory)共享内存就是允许多个不相关的进程访问同一个逻辑内存。 共享内存是在两个正在运行的进程之间

2020-12-12 09:40:37 252

原创 Linux进程间通信--管道

Linux进程间通信①--管道1.进程间通信目的2.管道2.1匿名管道(pipe)基本特征管道自带同步和互斥读写规则匿名管道的创建pipe()匿名管道基于fork()的使用2.2命名管道(named pipe)基本特征打开/读写规则命名管道的创建命名管道实现无亲缘关系的进程间通信3.总结1.进程间通信目的数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)进程

2020-10-16 16:58:11 196

原创 Linux文件IO--文件描述符/重定向

Linux文件IO--文件描述符/重定向1.基础IO1.1C语言文件IO1.2Linux系统文件IO1.3Linux 系统调用与C库函数对比打开文件1.基础IO1.1C语言文件IO给一个testio.txt写入Hello World:通过操作文件流指针完成。#include<stdio.h>#include<string.h>int main(){ FILE* fp = fopen("testio.txt", "w+"); if(fp == NULL){

2020-10-12 15:24:43 360

原创 Linux进程程序替换

Linux进程程序替换1.进程程序替换1.1为什么要进行进程程序替换1.2进程替换的原理2.替换函数exec函数族2.1execv2.2execl2.3execvp/execlp2.3execve/execle1.进程程序替换1.1为什么要进行进程程序替换fork()创建子进程后,创建的子进程要么和父进程执行一样的代码,要么执行不同的代码分支(通过fork的返回值控制),但这样还是不够灵活。假如有很多的功能已经用别的程序实现好了,那么就不需要在父进程中控制子进程执行不同的代码分支,让子进程在自己的分支

2020-10-11 16:43:33 359

原创 Linux进程退出--_exit()&exit()

Linux进程退出1.退出场景2.进程常见的退出方法2.1正常退出2.2异常退出3.信号处理程序4._exit()系统调用接口5.exit()函数6._exit()和exit()的区别1.退出场景正常符合预期退出正常不符合预期退出(结果不正确)异常退出:执行过程中异常奔溃, 还未执行完2.进程常见的退出方法2.1正常退出main函数返回 ( return )调用 exit( int status )函数使用 _exit( int status )系统调用接口可以使用ench $?

2020-10-10 22:00:02 1557

原创 Linux进程等待--wait()&waitpid()

Linux进程等待1.进程等待1.1 基本概念1.2 进程等待的必要性2.进程等待的方法2.1 wait等待2.2 waitpid等待获取子进程status3.模拟实现1.进程等待1.1 基本概念进程退出时会关闭所有文件描述符,释放在用户空间分配的内存,但是PCB会暂时保留,里面存放退出状态。比如一个进程正常退出, PCB里就存放进程的退出状态(退出码);如果是异常退出,那么PCB里存放导致该进程终止的信号。子进程的退出状态应该是由父进程回收的,也就是父进程必须得等待子进程退出,接收子进程的退出状态。

2020-10-10 18:58:45 319

原创 Linux进程优先级

Linux进程优先级1.进程优先级1.1 基本概念1.2 优先级取值范围2.查看进程优先级1.进程优先级1.1 基本概念由于系统中进程数量众多,而CPU资源比较少甚至只有一个,进程之间需要竞争来使用CPU。这时让一个比较重要、需要优先执行的进程去和其他进程竞争,显然是不合理的。为了更合理的分配CPU资源, 就有了进程优先级。优先级高的进程有优先执行的权利。此外,优先级还影响分配给进程的时间片长短。 重要的进程,应该分配多一些cpu时间片,好让其尽快完成任务。所有的进程都会有机会运行,但优先级高的进程

2020-10-10 14:49:04 2281

原创 Linux进程状态

Linux进程状态1.进程状态2.运行状态R3.睡眠状态S(可中断睡眠)4.磁盘休眠状态D(不可中断睡眠)5.停止状态(T) & 跟踪状态(t)6.死亡状态X(退出状态)7.僵死状态Z8.僵尸进程孤儿进程1.进程状态状态在Kernel源码中的定义:static const char * const task_state_array[] = { "R (running)", "S (sleeping)", "D (disk sleep)", "T (stop

2020-10-09 21:45:31 223

原创 Linux进程概念

Linux 进程1.冯诺依曼计算机体系结构把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。计算机的数制采用二进制;计算机应该按照程序顺序执行。2.现代计算机的硬件体系结构五大部输入设备:输入设备是用来完成输入功能的部件,即向计算机送入程序、数据以及各种信息的设备。常用的输入设备有键盘、鼠标、扫描仪、磁盘驱动器和触摸屏等。输出设备:输出设备是用来将计算机工作的中间结果...

2020-10-07 17:08:07 118

原创 Linux进程创建--fork()

Linux进程创建--fork函数1.创建进程1.1 fork()函数1.2 fork()的返回值2.fork的写时拷贝策略3.fork失败原因fork用法1.创建进程我们说过一个进程就是一个PCB,即一个task_struck结构体,那么创建进程也就是创建一个task_struck结构体。在Linux中我们常用fork()函数来创建进程。1.1 fork()函数从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。fork()在函数内部会调用clone这个系统调用接口。#include

2020-10-07 16:58:44 600

原创 二叉树的层序遍历

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构队列来实现,队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(

2020-09-14 23:53:56 77

原创 [链表]LeetCode206. 反转链表

LeetCode206. 反转链表思路:使用双指针,一个指向当前节点cur,另一个指向当前节点的前一个节点prev。需要保存一下当前节点的下一个节点curnext(因为当前节点会变)。然后让当前节点指向他的上一个节点,再将prev和cur向后移动。当cur==nullptr说明走到链表尾,结束。迭代法://迭代法:class Solution {public: ListNode* reverseList(ListNode* head) { ListNode* prev=n

2020-09-06 21:10:55 85

原创 [二叉树]LeetCode257.二叉树的所有路径

LeetCode257.二叉树的所有路径思路:深度优先算法遍历二叉树,需要注意每次要将结果保存在一个string字符串内,最后将字符串尾插进vector容器。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), righ

2020-09-04 09:42:37 69

原创 [二叉树]LeetCode105&106.从中序与前/后序构建二叉树

105. 从前序与中序遍历序列构造二叉树思路:根据root节点,将中序vector划分成vin_left,vin_right两部分中序子序列,根据中序子序列长度,将前序vector划分成pre_left, pre_right对应的前序子序列。root->left递归生成,root->right递归。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *le

2020-09-03 17:22:42 86

原创 AVL树及其模拟实现

AVL树及其模拟实现1.AVL树的概念2.AVL树节点的定义3.AVL树的插入1.AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。一棵AV

2020-09-02 18:27:21 229

原创 [字符串替换]NewCode.替换空格

NewCode.替换空格请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路一: 替换问题,替换后字符串的长度也变长了,就要涉及到字符串中字符移动的问题。可以先遍历字符串统计空格的个数,再计算出新的字符串的长度,再向新的字符串中插入"%20"。利用双指针,各自指向新老空间的结尾,然后进行old->new的移动。如果是空格,就连续放入“%20”,其他平移即可。class Solution

2020-07-28 16:55:43 106

原创 [数组]NewCode.数组中出现次数超过一半的数字

NewCode.数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路一:定义map,使用<数字,次数>的映射关系,最后统计每个字符出现的次数。class Solution {public: int MoreThanHalfNum_Solution(vector<int> numbe

2020-07-28 16:08:26 98

原创 数据结构--顺序表&链表

数据结构--顺序表&链表1.线性表2.顺序表2.1概念及基本结构2.2 接口实现1.线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以顺序结构和链式结构的形式存储。特征:对于同一个线性表,其每一个数据元素的值虽然不同,但必须具有相同的数据类型;数据元素之间具有一

2020-07-26 15:49:01 318

原创 malloc/calloc/realloc函数的区别及用法

malloc/calloc/realloc函数的区别及用法1.malloc函数2.calloc函数3.realloc函数malloc/calloc/realloc函数都是分配内存,但是也存在一定的差异。1.malloc函数malloc函数文档函数原型:void* malloc (size_t size);**返回值:**成功时指向由函数分配的内存块指针,此指针的类型总是void*,该数据指针可以转换为所需类型的数据指针(如下例的int类型),以便可以解除引用。如果函数未能分配请求的内存块,则空指针

2020-07-25 19:54:54 353

原创 [二分查找]NewCode.旋转数组的最小数字

NewCode旋转数组的最小数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。方法一:遍历一次即可,但是我们可以根据题面使用稍微高效且更简单一点的做法。按照要求,要么是一个非递减排序的数组(最小值在最开始),要么是一个旋转(最小值在中间某个地方)。而且旋转之后有个特征,就是在

2020-07-22 23:02:40 92

原创 [数组搜索]NewCode二维数组中的查找

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:如数组样式如下:1 2 3 42 3 4 53 4 5 6正常查找的过程,本质就是排除的过程,如果遍历整个数组,本质是一次排除一个,效率过低。根据题面要求,我们可以采取从右上角(或左下角)进行比较,这样可以做到一次排除一行或者一列class Solution {public: bool F

2020-07-22 21:16:13 78

原创 二叉搜索树及其模拟实现

二叉搜索树1.二叉搜索树1.1二叉搜索树的概念1.2二叉搜索树操作在对map/multimap/set/multiset进行了简单的了解后,会发现这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的。那什么是二叉搜索树?其底层是二叉搜索树吗?1.二叉搜索树1.1二叉搜索树的概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜

2020-07-22 18:28:40 139

原创 数据结构--二叉树&堆及其实现

数据结构--二叉树&堆及其实现1.树的概念及结构1.1树的概念1.2树的表示2.二叉树的概念及结构2.1概念2.2特殊的二叉树2.3二叉树的存储结构3.二叉树的顺序结构及实现3.1堆的概念及结构3.2堆的实现3.2.1堆向下调整算法&向上调整算法3.2.2堆的创建3.2.3堆的插入3.2.4堆的删除3.3堆排序3.3.1实现过程3.4模拟实现堆4.二叉树链式结构的模拟实现1.树的概念及结构1.1树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的

2020-07-22 10:24:38 343

原创 STL关联式容器之set&multiset

set1.set的介绍set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比uno...

2020-07-17 17:20:35 166

原创 STL之关联式容器

STL之关联式容器1.关联式容器2.键对值3.树形结构的关联式容器1.关联式容器在接触容器初,我们学习了STL中的部分容器,如:vector,list,deque…等,这些容器统一称为序列式容器。因为其底层为线性序列的的数据结构,里面储存的是元素本身。关联式容器就有所不同关联式容器也是用来存储与序列式容器不同的是,里面存储的是<key, value>结构的键值对,在数据检索时比序...

2020-07-16 17:04:10 142

原创 C++中的智能指针

C++中的智能指针1.为什么要使用智能指针?2.智能指针的使用及其原理2.1RAII2.2智能指针的使用及原理3.C++中常见的智能指针3.1auto_ptr3.1.1 auto_ptr的实现原理3.1.1auto_ptr的缺陷:3.2unique_ptr3.3shared_ptr3.3.1shared_ptr中的循环引用的问题1.为什么要使用智能指针?先来看一段代码,分析这段代码有没有内存上的错误?#include <iostream>using namespace std;void

2020-07-15 17:29:43 235

原创 C++多态的原理(虚函数指针和虚函数表)

C++多态的原理 (虚函数指针和虚函数表)1.虚函数指针和虚函数表2.继承中的虚函数表2.1单继承中的虚函数表2.2多继承中的虚函数表3.多态的原理4.总结1.虚函数指针和虚函数表以下代码:问类实例化出的对象占几个字节?#include<iostream>using namespace std;class A { int m_a;public: void func() { cout << "调用类A的func()函数" << endl; }};

2020-07-09 17:40:45 1060

原创 C++中的多态

C++多态1.多态的概念2.多态的定义即实现2.1多态定义的构成条件2.2什么是虚函数2.3虚函数的重写2.4虚函数重写的两个例外1.多态的概念在面向对象语言中,接口的多种不同实现方式即为多态。具体来说就是去完成某个行为,当调用不同的对象去完成时会产生不同的状态。例如:在车站买票这个行为,学生去购买学生票就是半价;普通人去买票则是全价。2.多态的定义即实现2.1多态定义的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象

2020-07-04 21:57:35 181

原创 C++中的继承

C++中的继承1.继承的概念及定义1.1继承的概念1.2继承的定义1.继承的概念及定义1.1继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。 继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。#include<iostream>#include<string>using na

2020-06-29 18:37:24 139

原创 时间复杂度和空间复杂度

时间复杂度和空间复杂度1.算法效率2.时间复杂度2.1概念2.2大O的渐进表示法3.空间复杂度1.算法效率算法效率分析分为两种:时间效率和空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。2.时间复杂度2.1概

2020-06-22 15:25:40 211

原创 C++的IO流

C++的IO流1. C语言的输入与输出2.C++的IO流2.1流是什么2.2C++IO流3.文件操作3.1文本文件3.1.1写文件3.1.2读文件3.2二进制文件3.2.1二进制写文件3.2.2二进制读文件1. C语言的输入与输出C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输

2020-06-20 14:57:13 186

原创 C++模板进阶(非类型模板参数和模板特化)

C++模板进阶1.非类型模板参数1.非类型模板参数模板参数分为类类型形参和非类型形参。类类型参:出现在模板参数列表中,跟在class或者typename之后的参数类型名称,比如int,char,string等,也可以是自己实现的自定义类型。非类型参: 就是用一个常量作为模板(类模板和函数模板)的一个参数,在模板中可将该参数当成常量来使用。...

2020-06-20 11:30:43 746

原创 C++函数模板的显式具体化

C++函数模板的显示具体化1.函数模板的局限性2.显式具体化1.函数模板的局限性在C++中,我们可以使用函数模板来增加代码的复用性,但是并不是所有的类型都可以调用函数函数模板来处理,如数组和结构体数据类型。这就是函数模板的局限性。struct job{ char name[10]; double salary; int floor;}//交换两个这种结构的内容,原来的模板使用以下代码进行交换: temp=a; a=b; b=temp;由于C++允许将一个结构赋给另一个结构,因此即使

2020-06-18 15:49:24 922

原创 STL容器适配器stack/queue/priority_queue的介绍与使用

STL容器适配器之stack的介绍与使用1.stack的介绍2.stack的使用1.stack的介绍stack的文档介绍stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类

2020-06-15 16:18:29 263

原创 STL容器之deque的介绍与使用

这里写目录标题deque的介绍2.deque的使用2.1deque的定义2.2deque的常见构造deque的介绍deque是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可以像两端进行伸缩。特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高效。与vector不同的是,deque

2020-06-14 18:41:12 258

原创 STL容器之list的介绍与使用

STL容器之list的介绍与使用1.list的介绍2.list的使用2.1list的定义2.2list的常见构造2.3list iterator的使用2.4list的容量操作1.list的介绍cplusplus中对list的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同

2020-06-12 14:57:56 206

原创 STL容器之vector的介绍与使用

STL容器之vector的介绍与使用1.vector的介绍2.vector的使用2.1vector的定义2.2vector的常见构造2.3vector iterator的使用(vector迭代器)2.3vector的容量操作2.4vector增删改查1.vector的介绍cplusplus中对vector的介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它

2020-06-09 15:41:25 229

boost_1_58_0.zip

Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发、维护。Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能。

2020-06-15

空空如也

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

TA关注的人

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