自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 单例模式中的饿汉模式和懒汉模式

饿汉模式:将单例类的唯一实例对象定义为静态成员变量,当程序开始运行,实例对象就已经创建完成。优点:加载进行时静态创建单例对象,线程安全。缺点:无论使用与否,总要创建,浪费内存。懒汉模式:用静态成员指针来指向单例类的唯一实例对象,只有真正调用获取实例对象的静态接口时,实例对象才被创建。优点:什么时用什么时候创建,节约内存。缺点:在第一次 调用访问 获取实例对象的静态接口时 才真正创建,...

2019-08-25 13:52:49 348

原创 C++中的拷贝构造和赋值构造

拷贝构造拷贝构造又称为复制构造,是一种特殊的构造函数,当使用一个现有的旧对象构造一个新对象时就会调用拷贝构造函数,拷贝构造函数只有一个引用型的参数(类对象本身)拷贝构造函数格式类名(const 类&){ }编译器会自己生成一个拷贝构造函数,负责把旧对象中的所有数据拷贝给新创建的对象(浅拷贝)拷贝构造分为深拷贝和浅拷贝,它们的区别是:如果类中的成员有指针变量的话,那么浅拷贝只...

2019-08-25 12:02:19 441

原创 Git远程仓库的添加和克隆

本文只介绍如何将码云和Github添加为Git的远程仓库,对Git不是很熟悉的小伙伴可以看一下博客Git快速入门教学在添加远程库之前,我们需要现在终端中输入命令,创建一个密钥文件ssh-keygen -t rsa -C “输入你之前设置过的邮箱”输入这条命令后,一路回车就行,按照系统默认配置生成就行通过这条命令,在主目录中会生成一个.ssh目录,可是正常情况下我们并不能看到,因为这是一个隐...

2019-08-24 21:54:34 352

原创 Git快速入门教学

本文主要介绍在Linux下如何通过Git进行版本控制。首先需要在Linux上安装一下Git,可以在终端中输入下面这条命令sudo apt-get install git如果安装不成功,检查一下是否联网,如果联网的情况下不成功,试着输入下面这条命令更新一下,然后在输入上面的安装命令sudo apt-get update安装成功后设置一下名字和邮箱,通过下面两条命令git config -...

2019-08-24 19:40:32 378

原创 Linux下互斥量详解

一、同步、竞争、互斥当多个线程同时访问其共享的资源时,需要相互协调,以防止出现数据不一致、不完整的问题,能达到这种状态线程同步。而有些资源在同一时刻只有一个线程访问,对于这种资源的访问需要竞争。 当资源获取到后,能够防止资源被其它线程再次获取的技术叫互斥。二、互斥量(锁)pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;int pthread_...

2019-08-17 20:47:49 1313

原创 Linux下条件变量详解

条件变量可以让线程在满足特定的条件下暂停(睡眠),需要与互斥量配合使用。pthread_cond_t cond = PTHREAD_COND_INITIALIZER;通过宏对条件变量初始化int pthread_cond_init (pthread_cond_t cond,pthread_condattr_t cond_attr); 功能:初始化条件变量 cond:待初始化的条件变量 ...

2019-08-17 20:39:06 793

原创 Linux下多线程编程详解

一、线程基本概念1、线程就是进程中的执行路线,即进程内部的控制序列,或者说是进程的子任务(进程就是正在运行的程序,它一个资源单位)。2、线程就是轻量级的,没有自己独立的内存资源,使用的是进程的代码段、数据段、bss段、堆(注意没有栈)、环境变量表、命令行参数、文件描述符、信号处理函数、工作目录、用户ID、组ID等资源。3、线程拥有自己独立的栈,也就是有自己独立的局部变量。4、一个进程中可以...

2019-08-17 20:33:26 400

原创 Linux下的socket网络编程

一、网络通信的基本概念1、TCP和UDP的区别TCP:传输控制协议,面向连接的服务,安全、可靠(三次握手、响应+重传、四次挥手),速度相对较慢,一般应用在对安全性、完整性有严格要求的场景:FTP、SMTP、HTTP。UDP:用户数据报文协议,面向无连接的服务,不保证安全、可靠,但大多数情况下是可靠的,相对较快,一般应用在流媒体(在线的视频、音频)。三次握手与四次挥手的过程:三次握手:第...

2019-08-17 20:22:11 168

原创 Linux下进程之间通信方式详解

一、基本概念什么进程间通信(IPC,Interprocess communication):是指两人个或多个进程之间交换数据的过程叫进程间通信。进程之间为什么需要通信?当需要多个进程协同工作高效率完成任务时,因为每个进程都个独立的个体(资源单位),进程之间就需要进行通信。进程间通信方式:1、简单进程间通信:命令行参数,环境变量表、信号、文件2、传统进程间通信:管道3、XSI进程间通信...

2019-08-17 16:32:06 255

原创 Linux下目录流函数opendir/readdir/closedir详解

#include <dirent.h>#include <sys/types.h>DIR *opendir(const char *name);功能:打开一个目录流name:目录路径返回值:目录流struct dirent *readdir(DIR *dirp);功能:从目录流中读取一个文件结点信息dirp:opendir返回值返回值:文件节点信息i...

2019-08-13 15:38:03 595

原创 Linux下函数stat/fstat/lstat的区别

#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int stat(const char *path,struct stat *buf);功能:用来获取文件属性path:需要文件路径buf:用于存放获取的文件属性返回值:成功返回0,失败返回-1int fstat(int ...

2019-08-13 15:18:27 250

原创 Linux下函数sync/fsync/fdatasyn的区别

硬盘上一般都有一些缓冲区以此来提高数据的写入效率,操作系统写入数据其实只是写入了缓冲区,直到缓冲区满,才排队写入硬盘中。这种操作降低了写入的次数,但是提高了数据的写入的延时,导致缓冲区中的数据与磁盘中的文件不同步。#include <unistd.h>void sync(void)功能:把所有缓冲区中的数据全部同步到磁盘注意:只是发布将数据同步到磁盘的命令,并不是等待执行完成...

2019-08-10 23:49:58 1083

原创 为什么标准IO比系统IO快

因为标准IO使用缓存技术,当数据写入时并没有立即把数据交给内核,而是先放在缓存区中,当缓存区满时,会一次性把缓冲区中的数据交给内核,这样就减少了内核态与用户态的切换次数。而系统IO每写一次数据就要进入一次内核态,这样就浪费了大量时间进行内核态与用户态的切换,因此用时更长。如果为系统IO设置更大的缓冲区,它会比标准IO更快。...

2019-08-03 16:47:23 320

原创 Linux下内存管理函数

内存管理API#include <unistd.h>void *sbrk(intptr_t increment)increment:0 获取未分配前的内存首地址(也就是已经分配内存的尾地址)大于0 增加内存空间小于0 释放内存空间返回值:未分配前的内存首地址,以字节为单位。int brk(void *addr)功能:设置未分配内存的首地址返回值:成功0,失败-1...

2019-07-28 18:55:58 293 1

原创 Linux下环境变量的获取和设置

环境变量以字符串形式存在的,绝大多数据记录的是路径信息,它表示了当前操作系统的资源配置,环境设置等相关信息。1、环境变量表每个程序运行时操作系统都会把所有的环境变量记录到一张表中传给程序。通过main函数参数获取 int main(int argc,char* argv[],char* environ[])通过声明为全局变量获取 extern char** environ;2、环境...

2019-07-28 18:43:36 997

原创 Linux下动态加载共享库

#include <dlfcn.h>1、加载共享库void *dlopen(const char *filename, int flag);filename:共享库的库名,或路径flag:RTLD_LAZY 使用时才加载RTLD_NOW 立即加载返回值:共享库的句柄(类似文件指针)2、获取标识符地址并使用void *dlsym(void *handle, const ...

2019-07-28 18:30:53 218

原创 Linux下共享库的创建和使用

共享库与静态库的区别在于,共享库只是在调用模块中嵌入调用代码的在库的相对位置的地址,当执行程序时,共享库会和程序一起加载到内存中,当执行到调用共享库中代码的指令时跳转到共享库中执行,执行完毕后在跳转回来。相比于静态库占用空间小,方便更新(共享库发生变化后,程序不需要再次编译),但相比于静态库执行效率略低。共享库以.so结尾,Linux下需要以lib开头下面将以libmath.so来说明如何创...

2019-07-28 16:55:49 2180 1

原创 Linux下静态库的创建和使用

静态库:静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系。静态库的优点是执行速度快;缺点是占用空间大,被多次使用就会有多份冗余拷贝。当静态库中的内容发生变化时,需要重新编译出新的程序,因此不能轻易修改库中的内容。静...

2019-07-28 16:34:02 629

原创 快速排序(C语言实现)

快速排序算法(Quick Sort)快速排序算法是在起泡排序的基础上进行改进的一种算法,其实现的基本思想是:通过一次排序将整个无序表分成相互独立的两部分,其中一部分中的数据都比另一部分中包含的数据的值小,然后继续沿用此方法分别对两部分进行同样的操作,直到每一个小部分不可再分,所得到的整个序列就成为了有序序列。C语言中自带函数库中就有快速排序——qsort函数 ,包含在 <stdlib.h...

2019-07-28 15:18:11 815

原创 归并排序(C语言实现)

归并排序:其排序的实现思想是先将所有的记录完全分开,然后两两合并,在合并的过程中将其排好序,最终能够得到一个完整的有序表。不交换数据,但需要借助额外的空间,用作临时的存储空间。void _merge(int* arr2, int* arr1, int s, int m, int t) //合并函数{ int m1, k; for(m1=m+1, k=s; s<=m &&a...

2019-07-28 15:10:07 657

原创 堆排序(C语言实现)

在学习堆排序之前,首先需要了解堆的含义:在含有 n 个元素的序列中,如果序列中的元素满足下面其中一种关系时,此序列可以称之为堆。1、ki ≤ k2i 且 ki ≤ k2i+1(在 n 个记录的范围内,第 i 个关键字的值小于第 2i 个关键字,同时也小于第 2i+1 个关键字)2、ki ≥ k2i 且 ki ≥ k2i+1(在 n 个记录的范围内,第 i 个关键字的值大于第 2i 个关键字,同...

2019-07-28 15:01:28 1092

原创 选择排序(C语言实现)

选择排序:是冒泡排序的一种变种,但是它没有冒泡对数据有序性的敏感,但它在排序过程中比较冒泡要少了很多数据交换,因此数据比较混乱的情况下要比冒泡要比快。#include <stdio.h>#define swap(a,b) {typeof(a) t=a; a=b; b=t;} // 宏函数void select_sort(int* arr, int len){ for(i...

2019-07-28 14:34:43 186

原创 插入排序(C语言实现)

插入排序:是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。直接插入排序是插入排序算法中的一种,采用的方法是:在添加新的记录时,使用顺序查找的方式找到其要插入的位置,然后将新记录插入。当一列数据已经有序,再有加入的数据时,适合使用插入排序。#include <stdio.h>#define ...

2019-07-28 13:27:42 1146

原创 冒泡排序(C语言实现)

冒泡排序:是一种稳定排序,在排序过程中可以监测到数据是否已经有序(对数据的有序性敏感),可以立即停止,如果待排序的数据基本有序,则冒泡的效率是非常高的。下面用C语言实现冒泡排序。#include <stdio.h>#include <stdlib.h>#define swap(a, b) {typeof(a) t=a; a=b; b=t;} // 交换宏函数,typ...

2019-07-28 11:50:27 249 1

原创 二分查找(C语言实现)

二分查找:前提就是数据必须有序,然后从数据的中间位置开始查起,如果中间值比key小,则从中间值位置开始继续查找,反之刚从开头到中位置查找,重复以上过程直到结束。从代码实现上来说,既可以用循环实现,也可以用递归实现。下面将用这两种方法以C语言实现二分查找。递归int _binary_find(int* arr,size_t l,size_t r,int key) // 参数分别为,数组首地址,...

2019-07-28 11:16:37 475

原创 二叉树(C语言实现)

以下为用C语言实现的二叉排序树,包含了树的创建,销毁,添加,删除,修改,前、中、后、层序遍历,深度,密度。#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#define TYPE inttypedef struct Node{ TYPE data; struct Node*...

2019-07-28 10:43:41 273

原创 队列(C语言实现)

#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#define TYPE int//设计节点typedef struct Node{ TYPE data; //数据域 struct Node* next; //指针域 }Node;//创建节点Node* crea...

2019-07-13 15:00:26 327

原创 栈(C语言实现)

#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#define TYPE int // 设计节点typedef struct Node{ TYPE data; //数据域 struct Node* next; //指针域}Node;// 创建节点Node...

2019-07-13 14:50:43 322 1

原创 通用链表(C语言实现)

#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include "list.h"//设计链表节点typedef struct Node{ void* ptr; //指向数据的首地址 struct Node* next; // 元素的下一个位置}Node;/...

2019-07-13 14:34:18 738 1

原创 C语言之文件操作

FILE *fopen(const char *path, const char *mode);功能:打开文件path:文件的路径mode:文件打开的方式,以字符串形式提供 "r" 以只读方式打开文件,如果文件不存在则打开失败,返回值为空。 "r+" 在"r"的基础上增加写权限。 "w" 以只写方式打开文件,如果文件不存在则创建,如果文件存在则...

2019-05-03 19:57:03 172

原创 C语言之堆内存管理

什么是堆内存:一种由程序员手动管理的内存,它的申请和释放都需要显式的调用函数来实现。为什么使用堆内存:1、栈内存的大小有限。2、栈内存中的数据随时可能被释放。如何使用堆内存:C语言对堆内存的管理是以标准库函数形式实现的,头文件stdlib.hvoid *malloc(size_t size);功能:从堆内存申请size个字节内存,如果size值为0,则返回NULL。返回值:所申请...

2019-05-03 19:28:33 688

原创 C语言之指针

什么是指针:指针是一种数据类型(无符号整数,这种整数代表了内存的编号),使用它可以定义的变量叫指针变量(简称指针,这种变量占用4|8字节内存大小)。为什么使用指针:1、函数之间共享变量:全局变量可能会名字冲突不可过多使用。 函数之间传参是值传递的,因此不能共享变量。函数之间的命名空间是独立的,但是存储空间是统一,可以把存储的地址在函数之间传递,达到共享的目的。2、堆内存无法取名字(标识符...

2019-05-03 17:08:45 127

空空如也

空空如也

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

TA关注的人

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