自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构--并查集

1 并查集介绍1.给定N个元素; 2.开始时每个元素位于独立的集合中(即该集合只包含当前元素),当它们之间具有某种关系的时候,按照一定顺序,将位于同一组的所有元素进行合并。 3.利用并查集可以查找到某个元素位于哪一个组中,或者可以查找一共有多少个组。 应用场景:当有一组集合,当这些集合具有某些关系时,就需要对这些集合进行合并。 4.根据并查集:我们可以知道任意两个元素是否具有某种关系(...

2018-08-26 09:33:27 3214

原创 STL--set介绍及set的使用

1.set介绍 (1)set是STL中一个很有用的容器,用来存储同一种数据类型的数据结构(可以称之为K的模型),基本功能与数组相似。 (2)set与数组不同的是,在set中每个元素的值都是唯一的。 (3)而且set插入数据时,能够根据元素的值自动进行排序。 (4)set中数元素的值并不能直接被改变。 2.set的底层 (1)set的底层是红黑树,是红黑树里面K的模型; K模型:...

2018-08-23 11:52:01 21618 2

原创 软件测试--测试用例相关概念

1.什么是测试用例 测试用例是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。 2.为什么要编写测试用例 (1)理清思路,避免遗漏 如果我们测试的项目大而复杂,我们可以把项目功能细分,根据每一个功能通过编写用例的方式来整理我们测试系统的思路,避免遗漏掉要测试的功能点。 (2)跟踪测试进展 通过编写测试用例,执行测试用例,我们可以...

2018-08-23 10:08:25 2844

原创 数据结构--布隆过滤器

1 布隆过滤器的引入1.当给定大量数据时,内存放不下,我们要查找一个数据是否在这些大量数据里面,就会想到将这些数据用位图存起来,但是位图里面只能存放无符号的整数。如果要查找一个字符串是否在大量的字符串里,就不能用位图。 2.所以这里就引入了布隆过滤器,它针对任意类型,但是对于字符串用的比较多。 3.布隆过滤器的思想仍然是将某个数据映射到某个位置上,达到节省空间的目的。2 布隆过滤器...

2018-08-22 16:26:08 786

原创 软件测试--软件测试的分类

这个图片,如果有看不清的,可以在下面评论,我用邮箱私发给你们~~。

2018-08-21 17:23:54 385

原创 软件测试--基本概念

1.什么是软件测试软件测试是使用人工或自动的方法,来运行或者测量软件系统的过程,以验证软件系统是否满足用户需求,并找出与预期结果的差异。2.软件测试与调试的区别(1)目的不同 测试的目的是为了发现程序中的缺陷,调试的目的是为了定位并且解决程序中的问题。 (2)参于的角色不同 测试主要由测试人员和开发人员来执行(黑盒测试主要由测试人员完成,单元/集成测试主要由开发人员执行); ...

2018-08-21 14:27:21 388

原创 IO多路复用--epoll

一.初识epoll1.epoll是Linux内核为处理大批量文件描述符而作了改进的poll; 2.epoll是Linux下多路复用IO接口select/poll的增强版本; 3.epoll能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。二.epoll相关的系统调用1.epoll_create (1)函数原型:#include <sys/e...

2018-07-27 15:21:52 342

原创 Linux--线程同步与互斥

1 线程同步与互斥的引入 互斥:对于某种资源,如果有一个进程正在访问该资源,则其它的进程必须等待,当那个进程访问完成后其它进程才能访问。 同步:某些进程的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。 1.由于同一个进程之间的线程很多东西是共享的,就会使得多个线程看到同一份资源,不同线程都可以访问该共同资源。如果多个线程并发的访问某个共享资源...

2018-07-18 00:16:01 475

原创 Linux--线程控制及线程标识的探索

1 线程控制1.1 线程的创建1.通过pthread_create函数来创建线程 (1)函数原型:#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);(2...

2018-07-16 10:44:44 590

原创 Linux--线程的基本概念,线程与进程的区别

一.线程的概念1.线程是进程内部的一个执行分支。 2.线程是程序执行的最小单位。 3.线程是在进程的地址空间内运行。 4.在Linux下,没有真正意义上的线程,线程是用进程模拟的,线程称为轻量级进程。 5.创建一个线程比创建一个进程的粒度小的多(因为创建进程需要分配PCB,需要分配资源,而线程只需要将资源给某个线程)。 6.一个进程里面的线程大部分资源共享,只有少部分独立(独立的东西...

2018-07-15 18:30:21 673

原创 传输层--TCP的连接管理(三次握手与四次挥手)

我们知道TCP是一种保证可靠性的传输层协议,TCP可靠性保证的重要支撑就是TCP的连接管理机制,也就是三次握手与四次挥手。建立连接例如:在日常生活中我们经常会打电话,下面是小A和小B通话过程: 当小A给小B打电话时,小A不确定小B是否听的见,那么小A就会询问小B是否听的见,小B回复之后不确定小A是否听得见,就会询问小A,当小B收到小A得确认之后认为小A能够听见,此时双方都能对方能...

2018-07-12 21:54:01 838 3

原创 传输层--TCP和UDP的对比

TCP和UDP协议是传输层非常重要的两个协议,这两个协议在数据传输从起着非常重要的作用,前面两篇文章讲解了各自的特点,本文来讲解一下这两个协议有什么区别。从各自的特点来看1.TCP是面向连接的,而UDP是无连接的;TCP发送数据前先要建立连接,而UDP发送数据前不需要建立连接。2.TCP保证可靠性,UDP不保证可靠性;TCP具有很多的可靠性保证机制(TCP的连接管理...

2018-07-06 17:22:41 3588

原创 传输层--TCP协议(TCP协议详解及可靠性保证)

TCP协议的报头1.报头:2.各字段解释:(1)源端口号和目的端口号:TCP作为传输层协议,其上一层是应用层,当数据进行向上分用时,需要知道将有效数据交给上一层的谁,所以需要知道源端口号和目标端口号。(2)32位序号和32位确认序号:因为TCP是一种可靠的协议,当其传送数据报时,会按照字节进行编号,这些编号就是序号。当我向你发送数据时,我需要知道你是否...

2018-07-05 16:21:12 1545

原创 传输层--UDP协议

传输层的功能:传输层一个很重要的功能就是复用和分用。应用层不同进程的报文通过不同端口向下交到传输层,再往下就共用网络层提供的服务。具体功能:1.传输层是为应用进程之间提供端到端的逻辑通信(网络层是为主机之间提供逻辑通信)。 2.传输层要对收到的报文进行差错检测。 3.传输层有很多种协议,这里主要讲两种不同的运输协议,即面向连接传输控制协议TCP(Transmission Con...

2018-07-05 16:02:49 1460

原创 Linux--守护进程

什么是守护进程1.守护进程:在后台运行,且不受终端控制的一种进程。 2.通过ps axj | more指令可以查看到Linux下的守护进程[root@localhost 进程组]# ps axj | morePPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 1 1 1 ...

2018-07-01 21:30:04 10653 1

原创 Linux-- 进程的等待的方式比较(wait、witpid、忽略SIGCHILD信号)

写在前面1.前面已经介绍了,进程等待的相关知识,以及进程等待的必要性:https://blog.youkuaiyun.com/xu1105775448/article/details/80171244 2.上一篇关于信号的博客里介绍了Linux下一种又一种进程等待方式:https://blog.youkuaiyun.com/xu1105775448/article/details/80771363下面通过代码,...

2018-06-23 19:50:36 1377

原创 Linux--信号

什么是信号1.在现实生活中,我们过马路看到的红绿灯就是一种信号,铃声也是一种信号,根据不同的信号我们有着不同的处理方式。 2.在Linux中信号也是类似的,就是提供一种机制告诉进程 该怎么做。信号列表1.通过kill -l命令可以查看系统定义的信号:[xutingting@localhost Desktop]$ kill -l1) SIGHUP 2) SIGINT ...

2018-06-22 11:27:10 322

原创 Linux--进程间通信之信号量(system V版本的信号量)

引入信号量之前,我们先要了解四个基本概念,什么是临界资源与临界区,什么是同步与互斥。临界资源与临界区的概念1.临界资源:对于某些共享资源,一次仅允许一个进程访问,这个资源就称为临界资源。 2.临界区:访问临界资源的那些代码称为临界区。同步与互斥1.互斥:对于某种资源,如果有一个进程正在访问该资源,则其它的进程必须等待,当那个进程访问完成后其它进程才能访问。 2.同步:某些进...

2018-06-20 16:36:46 315

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

什么是共享内存共享内存是能够同时被多个进程看到的一段物理内存。(注意这里是物理内存)。共享内存的原理1.先在物理内存中申请一块内存; 2.将这段物理内存通过页表映射到多个进程的虚拟地址空间中; 3.一个进程往自己的虚拟地址空间上写就相当于往物理内存里写,其它进程从自己的虚拟地址空间里读就相当于从那段相同的物理内存里读; 4.这段公共的物理内存就是多个进程看到的同一个资源,这段物理...

2018-06-20 16:02:29 257

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

什么是消息队列1.消息队列,是消息的链接表,存放在内核中。 2.一个消息队列由一个标识符(即队列ID)来标识。 3.因为消息队列其实就是一个链表,所以往消息队列里面发送数据就等价于向链表里面插入一个消息结点,从消息队列里面取数据就等价于访问该结点,访问完后再删除这个结点。消息队列的特点1.消息队列可用于任意两个进程进行进程间通信(只要这两个进程能够看到同一个消息队列就可以); 2...

2018-06-20 11:36:00 649

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

进程间通信介绍1.进程间通信:在不同的进程间传播或交换信息。 2.进程间通信的方式:管道、消息队列、共享内存、信号量、socket(套接字)等。 3.进程间通信的本质:让不同的进程看到同一份资源。进程间通信的目的1.数据传输 2.资源共享 3.通知事件 4.进程控制管道1.管道通常指匿名管道,是Unix中最古老的进程间通信方式。 2.我们把从一个进程连接到另一个...

2018-06-20 10:45:27 294

原创 C++ -- 四种类型转换

C++四种类型转换的引入1.在C语言中也有类型转换 ①例1:相近类型之间可进行隐式类型转换 int a = 10; double b = a; //将int转换为double,然后赋值给b②例2:不相近类型可以进行强制类型转换 int a = 10; int *p = (int*)a; //将int强转为int*对于强制类型转换来说,有...

2018-06-14 12:07:46 885

原创 STL -- vector的使用详解

vector1.vector是一个顺序容器,是数组的升级版可以改变大小,即动态增长的数组。 2.vector实质上就是将数组和方法封装的一个类。vector的底层1.vector的迭代器 vector的迭代器就是一个原生指针,若数据类型为T,则其迭代器就是T*的指针。 将T*重定义为iterator(即typedef T* iterator)。 2.vector的成员变量为...

2018-06-09 15:47:52 470

原创 C++ -- 智能指针(自己模拟实现简单的智能指针)

上一篇文章介绍了智能指针的基本概念及boost库里基本的智能指针,这里主要模拟实现库里面的智能指针(简单实现)。auto_ptr1.auto_ptr具有RAII和像指针一样的特点。 2.模拟实现:template<class T>class Auto_Ptr{public: //RAII Auto_Ptr(T* ptr) ...

2018-06-08 19:42:47 9208

原创 C++ -- 智能指针( C++11与boost库的智能指针及其使用)

一.智能指针的引入 1.在动态内存管理中,如果new上一块空间,但是没有delete,就会产生内存泄露的问题。 2.但是有时候,我们new了,也delete了,但是还会出现问题。例如在new和delete之间调用了某个抛异常的函数,就有可能导致没有执行delete。 例如:fun2里面使用了new[],最后也使用了delete[],看着没有问题,但是在new和delete之间调用了fun1,...

2018-06-08 17:22:15 3059

原创 数据结构--位图(位图的模拟实现及STL里bitset的使用)

位图的引入1.对于下面的题* 给40亿个不重复的无符号整数,没排过序。任给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 【腾讯】2.分析 (1)我们首先可以想到将这40亿个整数进行排序然后在进行二分查找; (2)但是40亿个整数在内存中大约占16G的内存; (3)我们一般的计算机的内存很难达到16G,也就是说如果没有特殊的方式,我们无法在计算机的内存里存放这么多的数...

2018-06-03 16:38:04 782

原创 C++ -- 深浅拷贝

浅拷贝1.例如对于下面的String类,它包含一个成员变量,一个char*的指针:class String{private: char* _str;};2.对于String类的拷贝构造函数及operator=函数来说,当用一个String对象拷贝构造或赋值给另一个String对象时,就是将这个对象里的指针的值赋值给另一个对象里的指针。将一个指针值赋值给另一个指针,就会...

2018-06-02 12:33:53 14825 7

原创 C++ -- 异常

传统的错误处理方式1.错误码; 2.终止程序; 3.调用预先设置的回掉函数。传统错误处理方式的缺点1.如果返回错误码,用户必须要通过查看错误码对应的文字描述才能清楚错误,并且这种错误码表示的意义必须明确且唯一。 2.在某个大工程里面,如果由于某个错误而导致终止程序,本来这个错误可以容忍,但是程序终止就会导致正确的程序也无法正常的执行。异常1.异常:异常是程序在执行...

2018-06-02 10:27:06 235

原创 C++ -- 模板与分离编译

什么是分离编译1.将一个函数或类的声明放在.h文件里面,将其代码实现放在同名的.cpp里面,当调用该函数时,该函数就会进行分离编译。 2.以add函数为例:(定义一个函数Add,将其函数声明放在Add.h里面,将其实现放在Add.c(与头文件同名)里面,当在Test.cpp里面调用时,会正确运行。 Add.h#include<iostream>using namespac...

2018-06-01 18:14:39 693 1

原创 C++ -- 模板的特化与类型萃取

模板的特化1.定义:模板的特化就是特殊化 2.例如:对于一个模板类来说,可能对于某个特定的类型里面会有特殊的处理方式,这样就可以对该类型进行一个特化。 3.特化分类 ①全特化 ②偏特化全特化1.将模板参数全部写出来; 2.例如:template <class T1, class T2>class Data{public: Data() ...

2018-06-01 17:16:14 821

原创 C++ -- 模板的基础知识

模板的由来1.对于交换函数Swap来说, (1)如果用于交换两个整型,则代码如下:void Swap(int* a, int* b){ int temp = *a; *a = *b; *b = temp;}(2)当用于交换两个整型指针时,代码如下:void Swap(int** a, int** b){ int* temp...

2018-06-01 16:59:45 375

原创 C++ --类的默认成员函数是否可以被定义为虚函数

构造函数不能定义为虚函数1.因为虚函数是存放在对象的虚表里面,如果将构造函数定义为虚函数,则构造函数也必须存放在虚表里面,但是此时对象都还没有创建也就没有所谓的虚表。 2.不将构造函数定义为虚函数,对象模型如下: 3.如果将构造函数定义为虚函数:(直接会编译错误) 最好不要将operator=定义为虚函数虽然operator=不会构成重写(因为父类与子类的operato...

2018-05-27 20:21:06 3401

原创 C++--定义一个不能被继承的类/只能在栈上或堆上生成对象的类

定义一个不能被继承的类思路:(1)将父类的构造函数定义为私有的(因为子类的构造函数是合成版本所以会调用父类的构造函数,而父类的构造函数是私有的,则子类就不能构造出对象); (2)但是这种方式会有一个问题,因为父类的构造函数是私有的则父类也构造不出来对象。 (3)为了解决父类构造不出来对象的问题,则可以在父类定义一个GetObject方法,里面调用父类的构造函数,则可以通过调用Get...

2018-05-27 19:50:00 501

原创 Linux--实现一个简易的Shell(可以获取命令提示符,支持管道)

Shell的实现过程1.从标准输入获取命令行; 2.对用户输入的命令行进行解析,解析出要执行的指令和参数; 3.创建一个子进程; 4.子进程进行程序替换,父进程等待; 5.当子进程执行完毕,父进程从wait中返回,继续下一次循环。shell命令提示符(1)一般的shell输入命令之前都会有命令提示符:[root@localhost 进程替换]# root为用户名,...

2018-05-14 17:10:42 4955 1

原创 Linux--进程程序替换

替换原理1.当fork创建子进程后,父进程与子进程执行相同的代码,往往子进程要调用exec函数去执行新的程序。(让一个进程去执行一个全新的程序) 2.当进程调用exec,则当前进程的代码和数据全部被替换,堆和栈也要重新分配。 3.调用exec成功没有返回值,失败返回-1.为什么调用成功没有返回值? 因为调用exec成功,则当前进程的代码和数据已经被替换,以前的堆和栈已经被销毁,返回...

2018-05-14 15:08:52 894 1

原创 C++ -- 多态场景下探索C++对象模型

单继承对象模型1.单继承代码class Base{public: virtual void fun1() { cout << "Base::fun1()" << endl;

2018-05-09 18:04:26 283

原创 C++ -- 虚函数与多态

虚函数1.定义:在一个类的成员函数前面加上virtual关键字; 2.如果一个函数不是类的成员函数,则该函数不能定义为虚函数。(即就是类外面不能使用virtual关键字)虚函数中有一个特殊的虚函数:纯虚函数纯虚函数与抽象类1.纯虚函数:在虚函数的后面加上=0;virtual void Display() = 0;2.包含纯虚函数的类称为抽象类,抽象类不能实例化...

2018-05-09 16:20:53 207

原创 C++ -- 动态内存管理

C语言的动态内存管理C语言使用malloc/calloc/realloc进行空间开辟,使用free进行空间的释放。malloc(1)函数形式:void* malloc (size_t size) (2)参数:开辟空间的字节数; (3)返回值:返回一个指针,它指向新开辟空间的起始位置。 注意:malloc只开辟空间,并没有对数据进行初始化。calloc(1)函数形式...

2018-05-07 14:45:35 297

原创 C++ -- 类和对象之const成员函数,inline函数,友元,static成员

const成员函数基础知识1.定义 const成员函数是在类的成员函数后面加上const关键字,const修饰的是this指针所指向的对象,也就是保证调用这个const成员函数的对象在函数内不会被改变。 2.例子class Date{public: Date(int year, int month, int day) :_year(year) ...

2018-05-06 21:23:51 444

原创 C++ -- N种构造 / 拷贝构造的优化

以日期类为例日期类的代码如下(只包含4个默认成员函数,为了便于观察结果所以在4个成员函数里面输出一些语句):class Date{public: Date() { cout << "Date()" << endl; } Date(const Date&

2018-05-05 21:45:57 296

空空如也

空空如也

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

TA关注的人

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