自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 收藏
  • 关注

原创 Linux系统编程之守护进程

守护进程简介及特点    守护进程又称精灵进程(DAEMON),是一类具有如下特点的进程。其生命周期很长,通常在系统启动的时候会创建并一直运行,当系统关闭时才终止,不随着用户登录、注销等改变其状态。 他是在后台运行且不拥有控制终端的进程。守护进程创建过程及原因    要把一个进程变成守护进程,要完成以下步骤:执行一个fork,然后父进程退出,子进程接着运行。这样做就是为了让子进...

2019-01-18 22:01:44 209

原创 C++——分配器allocator

Allocator简介 分配器(配置器,allocator)是STL中六大组件(容器、算法、迭代器、仿函数、适配器、分配器)之一,用于分配管理内存空间。其实我们可以把allocator看成一个简易的内存池,其主要适用于在使用容器时,对内存空间的动态分配,如果是我们平常要申请一块动态内存时,不推荐使用allocator,应该使用new-delete(malloc-free),主要原因是al...

2019-01-15 14:03:39 4669 1

原创 Git简介与使用

Git简介    Git是一个开源的分布式版本控制系统。SVN是一个集中式版本控制系统,程序的版本都是集中放在中央服务器,用户可以从上push和pull,最大的问题就是需要联网才能使用,速度较慢,效率较低,而且中央服务器一旦出现问题,将会造成很大的影响。Git是分布式的版本控制系统,每个人的电脑上都有完整的版本库,安全性能较高,分支管理较为方便。详细可见git教程。Git常用指令git...

2019-01-07 23:26:33 202

原创 Effective C++读书笔记

本篇记录一下首次研读Effective C++的知识点和自己的理解,会分条款逐一阐述。条款01:视C++为一个语言联邦    C++有四个次语言,次语言之间相互协调,当你在编写程序的时候,最有可能运用到的就是次语言之间的相互转换,所以可以分开来学习,熟悉了每一块之后再联合起来使用。C:C++任然是以C为基础,区块、语句、预处理器、内置数据类型、数组、指针等都是延续C的传统。 面向对象...

2019-01-06 12:05:32 194

原创 剑指offer——删除链表中的节点

题目1:在O(1)内删除链表节点。给定单向链表的头指针和一个节点的指针,在规定时间复杂度内删除该节点解题思路:首先在时间复杂度O(1)就不可能从头遍历链表查找节点。我们把下一个要删除节点的下一个节点的值赋值给指定的节点,然后删除下一个节点即可,再改变一下next指针的指向即可。具体代码如下:#include <iostream>using namespace std;...

2019-01-04 11:30:44 341

原创 Linux系统编程之线程

线程概述 线程是允许应用程序并发执行多个任务的一种机制,一个进程中可包含多个线程。同一程序中的所有线程都会执行相同的程序,共享一份全局内存区域,其中包括代码段、初始化数据段、未初始化数据段、以及堆内存段、栈及文件描述符。 多线程可以弥补多进程的缺陷:进程之间信息难以共享,而线程则可以方便快速共享信息,只需将数据复制到共享变量中即可 调用fork()创建进程代价较高,创建线...

2019-01-03 19:19:59 269

原创 Linux系统编程之进程

进程的创建    系统调用fork()可以从一个父进程中创建一个子进程,子进程的资源同父进程几乎一样:子进程获取父进程的栈、数据段、堆和代码段(执行文本段)的拷贝。执行fork()之后,每个进程都可以修改自己栈数据、堆中的变量且并不会影响另一个进程。执行fork()时,子进程会获得父进程所有的文件描述符副本,类似于dup(),意味着父进程和子进程对应的文件描述符指向同一个打开文件句柄(共享当前...

2018-12-31 18:32:31 255

原创 剑指offer——打印从1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数。解题思路:首先要想到这是一道大数题,用字符串存储每一位数字,然后要想到利用每一位的全排列来递归求解。从最后一位开始。若n=2,则字符串大小为3,str[2]='\0',分别从01,02,03 ...,99。所以利用递归每次index=3时,就可以打印。打印的时候要注意把字符串前面的0去掉。#include <stdio.h&g...

2018-12-30 22:37:16 165

原创 Linux信号(一)

信号的概述    信号是事件发生时对进程的通知机制,也成为软件中断,是进程之间通信的方式之一。信号分为两大类,一组用于内核向进程通知事件,构成所谓的传统或标准信号;另一组由实时信号构成。    信号因某些事件而产生,信号产生后,会于稍后传递给某个进程,进程即会采取相应的措施来相应信号。但是有时候需要保证一段代码不被传递来的信号所中断,即可以将信号添加到进程的信号掩码中(其作用就是阻塞该信号...

2018-12-29 16:17:48 960 1

原创 剑指offer——剪绳子

题目描述:有一个长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1且m>1)每段绳子的长度记为k[0]、k[1]...k[m-1],求每一段相乘最大为多少?解题思路:这道题目有两种思路。动态规划和贪心。贪心的策略:当绳子的长度大于或等于5时,我们尽可能多的剪成长度为3的绳子,当剩下的绳子为4时,将绳子剪成长度为2的绳子。#include <iostream>...

2018-12-27 20:27:07 727

原创 剑指offer——机器人运动范围

题目描述:地上有一个m行n列的方格,一个机器人从坐标(0,0)的格子开始移动,可以向左右上下四个方向,但是不能进入行坐标和列坐标的数位之和大于k的格子。请问机器人能够达到多少个格子?解题思路:这道题目也是一道典型的回溯法题目,可以用递归来写。写递归的思路都相似的,通过变化若干个参数调用自己所在的函数。重点在于递归出口的编写。因为本题要求满足条件格子的数量,如果某个格子不满足条件,则返回coun...

2018-12-26 19:27:04 222

原创 Linux目录与链接

目录    在文件系统中,目录与普通文件主要有两个区别。i节点条目中,会将目录标记为一种不同的文件类型。 目录是一种特殊的文件,本质上是一个表格,包含文件名和i节点编号。而文件的i节点中存储信息列表不包含文件名。     关于目录的系统调用有很多。#include <sys/stat.h>#include <unistd.h>#include <...

2018-12-26 15:58:38 960

原创 剑指offer——矩阵中的路径

题目描述:设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,分别向上下左右四个方向都可以移动。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。解题思路:这是一个回溯法的经典题,最常用就是递归来做。用递归解题的最主要问题就是要注意递归的边界条件。本题为目标字符串遍历完成,即可return。还有一点需要注意,就是题目中提及,矩阵中...

2018-12-25 20:28:00 159

原创 剑指offer——旋转数组的最小数字

题目描述:把一个数组最开始的若干个元素搬到数组的末尾,就称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如输入{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,输出最小值1。题目解析:本题如果直接遍历的话复杂度为O(n),如果采用二分查找的话复杂度为O(logn)。具体逻辑:选取中间元素,如果其大于等于第一个元素,说明其处于第一个递增阶段,最小值在其或者后...

2018-12-24 00:12:50 137

原创 Linux文件系统与文件属性

磁盘和分区    常规文件和目录通常存放在硬盘里。可将每块磁盘划分为一个或多个不重叠的分区,内核将每个分区视为位于/dev路径下单独设备。    磁盘分区主要是以下三种之一:文件系统、数据区域(可做裸设备对其访问)、交换区域(供虚拟内存使用)。文件系统    文件系统是对常规文件和目录的组织集合。在文件系统中,用来分配空间的基本单位是逻辑块,即文件系统所在磁盘设备上若干连续的物理块...

2018-12-23 20:15:04 760

原创 剑指offer——两个栈实现队列与两个队列实现栈

题目描述:两个栈实现队列解题思路:栈是“先进后出”,队列是“先进先出”。操作“入队列”:利用两个栈s1和s2,元素进的时候,放入s1即可。操作“出队列”:先检查s2是否为空,如果不为空,直接pop出s2的元素,如果为空,则把s1的元素都pop出来,然后依次放入s2中,再对s2进行pop即可。class Solution{public: void push(int node) ...

2018-12-21 21:33:16 142

原创 Linux进程与内存分配

进程    进程是由内核定义的抽象实体,该实体分配用以执行程序的各项系统资源,是拥有资源的基本单位。从内核的角度来看,进程由用户内存空间和一系列内核数据结构组成,其中用户内存空间包含程序代码及代码所使用的变量(程序段和数据段),而内核数据结构则用于维护进程状态信息。    每个进程都有一个进程号,用以标识系统中的某个进程。Linux内核限制进程号小于等于32767,一旦进程号达到32767...

2018-12-21 17:43:50 2810

原创 剑指offer——二叉树的下一个节点

题目描述:给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左右子树节点的指针,还有一个指向父节点的指针。解题思路:这道题目就是要理清二叉树的前、中、后序遍历,然后分情况理清楚下一个节点就行。要举一反三。如果这个节点有右子树,则下一个节点是右子树中最左子节点。 如果这个节点没有右子树,且节点是父节点的左子节点,则下一个节点是其父节点。 如果这...

2018-12-20 20:31:12 125

原创 剑指offer——重建二叉树

题目描述:输入二叉树的前序遍历和中序遍历结果,请重建二叉树。假设输入的前序遍历和中序遍历都不含重复的数字。解题思路:首先要了解二叉树的前序遍历和中序遍历分别是是怎样的规则,了解之后就可以发现。前序遍历的首节点一定是根节点,然后再去中序遍历中查找根节点所在的位置,依此将其分为左右子树,然后分别遍历即可。注意递归边界条件,即为当发现数组中没有元素,则返回空子树。/** * Definiti...

2018-12-19 20:37:01 125

原创 基类析构函数与虚函数

    基类析构函数为什么要声明为虚函数?    这个问题是C++理解虚函数和动态绑定的一个基础,也是面试常考的一个点。虽然几乎每本书中都会提及这个点,但是很少有把其具体阐明。本文通过具体实例+理论阐述尽量清晰解释这个问题。    首先看一下effective c++中是怎么描述的。   ----摘自《Effective C++》    C++中明白指出,当derived cla...

2018-12-18 16:55:58 882

原创 剑指offer——从尾到头打印链表

题目描述:输入一个链表的头节点,从尾到头反过来打印出每个节点的值。解题思路:这道题目是链表中的基础题,主要思路有两种第一种思路:可以利用栈的特性“后进先出”,将链表从头到尾遍历,然后将元素放到栈中,最后再取出。 第二种思路:可以利用递归的思想,在链表遍历的时候,对于每个节点而言:如果next指针不为空,则先遍历next指向的链表,回退时在打印本节点的值。/*** struct L...

2018-12-17 19:00:04 126

原创 剑指offer——替换空格

题目:请实现一个函数,把字符串中的每个空格替换成"%20",例如输入“We are happy” ,输出"We%20are%20happy"解题思路:    首先会想到从头到尾遍历一遍string,只要遇到空格就插入"%20",但是发现在数组中执行插入非常难实现,同时也有较高的复杂度。接下来就会想到是否能够直接定位出每个新元素的位置呢?答案是可以的,但是需要知道每个元素之前有多少个空格,因...

2018-12-17 18:17:30 139

原创 剑指offer——二维数组中的查找

题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的二维数组和一个整数,判断数组中是否含有该整数。解题思路:首先选取数组右上角的数字,如果该数字等于要查找的数字,则查找过程结束,如果该数字大于要查找的数字,则说明该数字所在的列都不会有目标数字,所以去掉该列,如果该数字小于要查找的数字,则说明该行都不会存在目标数字,所以去...

2018-12-16 19:12:42 120

原创 剑指offer——数组中重复的数字

 题目一:在一个长度为n的数组中,所有的数字都在0~n-1的范围里,数组中的某些数字是重复的,但不知道有几个数字重复了,请求出数组中任意一个重复的数字。解题思路:首先想到的肯定是排序,然后再次遍历来查看有无重复,这样的时间复杂度至少为O(nlogn) 然后第二种想到的方法就是hash表,或者利用unordered_set,因为其内部实现也是利用hash表。具体过程就是遍历数组中的每一个元...

2018-12-15 20:58:02 193

原创 Linux系统编程基础知识

本篇主要介绍了Linux系统编程的基础概念,为后续深入打好基础,还有助于回顾操作系统的知识。内核    通常来说,操作系统的内核是整个os的核心所在,是指管理和分配计算机资源(CPU、RAM和设备)的核心软件层。    内核的主要任务:进程调度:Linux属于抢占式多任务操作系统,多任务是指多个进程可以同时驻留在内存中,而且每个进程都可以获得CPU的使用权,抢占式是指运用进程调度算...

2018-12-15 17:09:36 468

原创 IP协议详述

本文将从两个方面对IP协议进行详解:IP头部信息,IP数据报的路由和转发。IP基础知识    IP协议是TCP/IP协议栈网络层的协议,它主要是为上层提供无状态、无连接、不可靠的服务。无状态是指IP通信双方不同同步传输数据的状态信息,所有的IP数据报的发送、传输和接受都是独立的,这种服务的最大缺点是无法处理乱序和重复的IP数据报,所以每当接收端接收到完整的IP数据报,只能把其将数据部分...

2018-12-10 21:49:41 375

原创 TCP协议详述

TCP协议是面向连接的传输层协议。其相对于UDP而言,主要有三个特征:面向连接、可靠传输、面向字节流。面向连接。TCP协议规定双方通信之前需建立可靠的连接(三次握手),通信结束后需断开连接(四次分手)。由此可见,TCP协议也是一种一对一的通信协议,即不支持广播和多播。 可靠传输。TCP协议规定发送端发送的每个报文段都要得到接收端的回复(ACK),除此之外,TCP还有超时重传,定时器等...

2018-12-06 22:47:56 386

原创 Linux文件IO

本文章中提到的文件IO都是不带缓冲的IO,即每个read和write都调用内核中的一个系统调用。文件描述符    文件描述符是一个非负数,每当打开一个现有的文件或者创建一个新文件时,内核都向进程返回一个文件描述符。文件描述符用以表示所有类的已打开文件,包括管道(pipe)、FIFO、socket、终端设备和普通股文件。特殊:文件描述符0、1、2分别代表标准输入、标准输出、标准错误,把其换为...

2018-11-23 17:29:10 179

原创 C++侯捷面向对象高级编程笔记

P7 三大函数(big three):拷贝构造,拷贝赋值,析构函数设计一个拥有指针的类String。(1)拷贝构造函数如果没有显示的写出来,编译器会默认给一个。当我们设计的class带有指针,就不能用默认的拷贝构造函数,需要自己定义拷贝构造函数,拷贝赋值操作符,析构函数。(2)拷贝构造函数,首先也是一个构造函数,即函数名和类名相同,没有返回值,与普通的构造函数不同的是,实参为本类对象的...

2018-11-23 14:31:20 967

转载 grep与正则表达式

转自马哥linuxgrep是linux下强大的文本搜索工具。命令:grep [option] pattern [FILE]option:  --corlor=auto 把匹配的文本着色               -v 显示不能够被pattern匹配到的行               -i 忽略字符大小写               -o 仅显示匹配到字符串本身    ...

2018-11-19 17:24:11 151

转载 linux目录介绍

转自 https://blog.csdn.net/m0_38044196/article/details/72844025/:根目录,位于Linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中。/bin,/usr/bin:该目录为命令文件目录,也称为二进制目录。包含了供系统管理员及普通用户使用的重要...

2018-11-14 21:09:59 168

原创 网络编程笔记——多进程服务器

多进程服务器端并发服务器实现模型和方法主要有三种:(1)多进程服务器端:通过创建多个进程提供服务(2)多路复用服务器:通过捆绑并统一管理IO对象提供服务(3)多线程服务器:通过生成与客户端等量的线程提供服务用sigaction信号处理技术消灭僵尸进程。(这里不详述)多进程服务器端实现echo服务器。每当客户端请求服务时,回声服务器就创建子进程以提供服务。步骤如下:(...

2018-11-08 10:36:23 231

转载 网络编程笔记——套接字可选项

转自 https://blog.csdn.net/wangdd_199326/article/details/76595293套接字可选项套接字具体多种特性,可通过可选项更改。1 套接字可选项和I/O缓冲大小SOL_LOCKET层是套接字相关的通用可选项IPPROTO_IP层可选项是IP协议相关事项IPPROTO_TCP层可选项是TCP协议相关事项可选项的读取和设置通过如下两个函数完...

2018-11-08 10:03:44 139

原创 网络编程笔记——UDP

TCP原理首先,TCP套接字的数据收发无边界,意思就是即使调用1次write函数传输40字节数据,客户端也有可能通过4次read函数调用每次读取10字节。实际上,数据在网络中存在输入缓冲和输出缓冲,调用write函数时,数据将移动到输出缓冲,在适当的时候传向对方的输入缓冲,然后对方将调用read函数从输入缓冲中读取数据。IO缓冲特性:(1)IO缓冲在每个TCP套接字中单独存在(2)IO...

2018-11-07 11:43:12 207

原创 C++ Primer 记录(二)

第三章 字符串、向量和数组这一章主要介绍了string、vector、迭代器和数组,也是较为基础的一章,但是在刷算法题目的时候经常可以用到一些里面的操作,所以一些基本的知识需要熟练运用。(1)标准库类型string表示可变长的字符序列,其初始化的方式有很多种,主要是直接初始化和拷贝初始化。值得一提的是,其可以通过getline(is,s) 从输入流对象is中读取一行赋给s,并返回s,可以保...

2018-11-03 22:48:55 165

原创 网络编程基础知识

网络编程就是编写程序使两台连网的计算机相互交换数据。而socket就是连接两台计算机的纽带,首先了解一些socket相关函数。SOCKET 创建套接字所用的socket函数#include <sys/socket.h>int socket (int domain,int type,int protocol);成功时候返回socket文...

2018-10-16 18:49:18 410

原创 C++ Primer 记录(一)

这是一本C++的圣经,以前上课的时候没有好好学,现在趁着这个机会好好回顾一下,同时着重掌握C++11的特性,里面很多知识点都是面试必考,应该反复多读理解并记好笔记。第一章 开始这一章比较基础,编者以一个书店程序的例子作为引入,本章着重记录一下几个之前没有注意到的细节。(1)大多数系统中,在主函数main中的返回值被用来指示状态,返回值0表明成功,非0返回值的含义由系统定义,通常用来指出...

2018-10-12 16:35:26 179

转载 vector初始化方式

转自:https://blog.csdn.net/yjunyu/article/details/77728410?locationNum=10&fps=1vector的几种初始化及赋值方式:(1)不带参数的构造函数初始化//初始化一个size为0的vectorvector<int> abc;(2)带参数的构造函数初始化//初始化size,但每个元素值为...

2018-10-04 22:29:04 163

原创 最大子数组和(一维和二维)

经典算法题。【一维数组】一个有N个整数元素的一维数组,最大连续的子数组和是多少?大致思路如下:首先定义一个变量存储以某个元素结尾的最大数组和。再定义一个变量存储全局的最大子数组和。然后初始化,遍历整个数组,找出对应的值比较即可。#include<stdio.h>int max(int a,int b){ if(a<b) return b; ...

2018-10-01 12:10:16 397

原创 结束与开始

【结束】2018.9.28,终于结束了保研过程。是一次非常值得怀念的时光。一路走来并不顺畅。最后还有一些小波浪,不过还是磕磕绊绊的去了华科大计算机,也算是给自己这几个月画上一个句号。保研其实就是一个多重选择的过程,很多的选择都是由个性所决定的。我自己其实不是一个很有野心的人,比较安逸,这是一个优点,同时也是缺点,当有很多的机会摆在眼前时,我不想触碰,也不敢触碰,我也许会选择忽视,到后面...

2018-09-28 20:55:56 432

空空如也

空空如也

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

TA关注的人

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