自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(149)
  • 资源 (2)
  • 收藏
  • 关注

原创 Linux c++ udp按包发送接收文件

我最近写一个项目的时候需要涉及到udp传输文件.网上找了找发现没什么合适的,那么我就写了一个自己的供参考.文件分成两类:第一类是文本文件,第二类是二进制文件.他们的文件读写是不一样的.所以我提供了两种文件的读写,传输方式.首先看源端DataSource的main.cpp:#include "UDPSocket.h"#include "Package.h"#include <unordered_map>#include <iostream>#include &l

2021-01-03 22:52:55 2336 5

原创 String类的实现

#include <iostream>#include <cstring>using namespace std;class String{public: // 默认构造函数 String(const char *str = nullptr); // 拷贝构造函数 String(const String &str); // 析构函数 ~String(); // 字符串赋值函数 String&.

2020-09-03 13:38:21 443

原创 链表归并排序与翻转

我在链表排序和翻转上面总是踩坑,在此记录一下。链表归并排序:#include <iostream>#include <algorithm>#include <vector>#include <unordered_map>#include <unordered_set>#include <string>#include <map>using namespace std;struct ListNode

2020-08-25 00:13:18 480

转载 MYSQL MVCC 实现机制

1. MVCC简介1.1 什么是MVCCMVCC是一种多版本并发控制机制。1.2 MVCC是为了解决什么问题?大多数的MYSQL事务型存储引擎,如,InnoDB,Falcon以及PBXT都不使用一种简单的行锁机制.事实上,他们都和MVCC–多版本并发控制来一起使用. 大家都应该知道,锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销.1.3 MVCC实现MVCC是通过保存数据在某个时间点的快照来实现的. 不同存储引擎的M

2020-08-22 18:44:47 158

原创 C++ 实现一个简单内存池

在使用内存池进行内存管理之前,通常使用new/malloc或者delete/free来申请或者释放内存。在这个过程中,系统要首先查找内部维护的内存空闲块表,并且需要根据比如LRU等内存分配算法找到合适大小的空闲内存块。如果该空闲内存块过大,还需要切割成已分配的部分和较小的空闲块。然后系统更新内存空闲块表,完成一次内存分配。类似地,在释放内存时,系统把释放的内存块重新加入到空闲内存块表中。如果有可能的话,可以把相邻的空闲块合并成较大的空闲块。默认的内存管理函数还考虑到多线程的应用,需要在每次分配和释放内存时加

2020-08-09 18:17:14 768

原创 https 非对称加密

https相当于在http和tcp之间加上了一层ssl加密,但是要注意的是,https协议在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。这是为什么呢?因为非对称加密的加解密效率是非常低的,而 https的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受的。首先我们需要对对称加密和非对称加密有所了解。对于对称加密,比如说常见的移位替换等方法,只要知道了加密过程,就一定知道解密过程,因为加密算法比较简单,那么根据加密算法就能反推出解密算法,也就是双方的秘钥是一样的,这

2020-08-01 23:30:39 2523

原创 牛牛爱66

今天面试了一道算法题,这到算法题我写的有问题,我在这里记录一下。众所周知,牛牛不喜欢6这个数字(因为牛牛和66发音相近)所以他想知道,不超过n位十进制数中有多少个数字不含有连续的6(从1开始算的)输入只包含一个正整数n(1<=n<20),输出一个整数,表示不超过n位十进制数中有多少个数字不含有连续的6。比如输入1,输出10: 1,2,3,4,5,6,7,8,9,10 这十个数字中都满足条件输入2,输出99,因为只有66不满足条件。分析:我是用动态规划的方式来写的,首.

2020-06-30 08:59:44 599

原创 C++ 泛型编程

泛型编程就是独立于确定的类型的方式编写代码,需要提供具体程序实例所操作的类型或者值,而不是之前确定的。比如在stl容器中,vector<int>, vector<char> vector<double> 用的是不同的数据类型,但是声明和调用的语句却是一样的。这就是泛型--建立通用的模具以提高复用性。 泛型的一个关键就是模板。通过template关键字来声明使用模板,通过typename来定义模板使用的是哪种类型。基本的模板有两种:函数模板...

2020-06-28 16:50:30 474

原创 设计模式之桥接模式

我们考虑这么一种问题:假设手机有多种分类:折叠式,翻盖式,滑盖式等等。每一种模式下面有多个手机品牌,他们都能实现打开手机等操作。也就是说功能划分如下图所示: 我们能看到每种手机下面有多个手机品牌,每个品牌都能实现自己的call操作。那么这么设计很直白,但是有一个问题:当手机的模式增加的时候,除了增加这一种样式,还要在这种样式下面增加各种手机品牌;当我们增加一个手机品牌,也要在每一种手机样式下面添加,这也就造成了类爆炸的问题。并且,当增加手机...

2020-05-23 17:27:00 196

原创 设计模式之适配器模式

适配器模式实际上是将某个类的结果转换成客户端期望的另一个类的接口表示,让原本因为接口不匹配的不能一起工作的两个类可以协同工作,就像适配器一样。适配器模式主要分三类:类适配器模式,对象适配器模式和接口适配器模式。对于用户的角度,看不到被适配者,也就是被适配的类是无感知的,从而实现了解耦。用户收到的反馈就是感觉只是和目标接口交互。1. 类适配器模式 比如说220V电压通过适配器转换成5V可以作为手机的输入。那么被适配者就是220V电源,适配者就是这个5V手机。 ...

2020-05-21 23:21:02 257

原创 设计模式之建造者模式

我们考虑这么一个问题:建房子。假设建房子有三个步骤:修地基,砌墙,砌屋顶。有很多种类的房子,但是建造的过程是相同的:那么假设想用一个传统方式进行建房子:首先定义一个commonHouse继承自基类AbstractHouse并且重写修房子的三种方法。然后有一个客户端去调用这个commonhouse的方法实现:package com.builder;public abstract class AbstractHouse { //打地基 public abstract void bu

2020-05-16 20:51:15 183

原创 设计模式之工厂模式

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。创建对象的过程由工厂实现。假设我们有一个pizza类,对应两种pizza分别是CheesePizza和GreekPizza.他们都有四种方法:prepare,bake,cut和box.每种pizza对应的方法不同:package com.factory.simplefactory.pizzastore.pizza;import org.omg.Messaging.SYNC_WITH_TRANSPORT;public abstract

2020-05-15 22:48:15 145 2

原创 设计模式之原型模式

原型模式适用于大量创建比较复杂对象(包含各类基础类型和引用类型的类)的情况。我们知道在传统模式下,比如说一只羊,我们定义羊sheep的各类属性如下:package com.prototype;public class Sheep { private String name; private int age; private String color; public Sheep(String name, int age, String color){

2020-05-15 21:23:34 171

原创 设计模式之单例模式

单例模式就是采取一定方法保证整个的软件系统中,对于某个类只能存在一个对象实例,并且该类只能提供一个取得该对象实例的方法(静态方法)。单例模式主要有下面几种实现方式:1)饿汉式2)懒汉式(同步,双重检查,以及静态内部类)3)枚举1. 饿汉式(采用静态常量)package com.singleton.type1;public class singletonTest01 { public static void main(String[] args){ ...

2020-05-15 14:07:26 154

原创 设计模式七大原则

所谓设计模式,其实是总结出了一套能够通用的软件设计规范的参考。在编写软件过程中,如何提高代码的重用性,可读性,拓展性与可靠性,这都是设计模式需要解决的问题。设计模式包含了面向对象的精髓。设计模式的原则主要有七种:1)单一职责原则:对类来说,一个类只负责一项原则,如A负责两个不同职责:职责1和职责2,当职责1的需求改变而改变A的时候可能造成职责2错误,所以需要把类A分解成A1和A2.2)接口隔离原则:一个类对于另一个类的依赖应该建立在最小的接口上。 ...

2020-05-14 23:12:35 703

原创 C++11常见新特性

1. auto关键字auto关键字起到的作用是自动类型判断。在声明变量的时候根据左值可以判断出类型并自动为此变量选择相匹配的类型。比如:#include <iostream>#include <string>#include <queue>#include <vector>#include <map>#include ...

2020-04-28 16:13:23 165

原创 C++11新特性 右值引用与移动语义

右值引用作用是可以减少内存拷贝次数,从而优化性能。 首先,什么是右值?右值是一个与左值相区分的概念。左值是:既能出现在等号左边也能出现在等号右边的变量或表达式,比如int a = 5,那么a就是一个左值,因为它可以出现在等号左边被赋值,也可以在等号右边给别人赋值。右值:因为声明结束后会被销毁,所以不能放在等号左边,比如上面int a = 5;这句话的5,就是一个明...

2020-04-25 23:30:29 468

原创 C++11新特性之 可变参数模板

C++ 11的可变模版参数是其新增的最强大的特性之一。通过对参数进行了泛化,可以表示从0到任意个数、任意类型的参数。我们知道对于一个模板类来说,通常只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。下面来具体说一下:可变参数模板与通常的类模板写法相似。声明可变参数模板时需要在typename后面带上省略号 ... 。写法如下:template<typename T, ty...

2020-04-25 18:04:28 735

原创 C++ 自己实现一个unordered_map(hashmap)

今天面试的时候遇到面试官出了一个问题,要实现一个unordered_map. 我实现的不太好,所以面试之后重新自己整理实现了一个unordered_map,在此记录一下。首先unordered_map的底层实现是哈希表。那么对于任何一个关键key的哈希,首先需要考虑的是哈希冲突的问题,在这里应该用链表的方式解决。如果不同的key哈希成了同一个地址,那么在链表的基础上向后连接就行。然后主要实现的...

2020-04-25 13:55:29 2181 1

原创 生产者消费者问题

生产者消费者问题是面试常见的题,如何用两个线程实现对于一个队列的生产者消费者模型呢?//这是生产者消费者模型的代码 #include<iostream>...

2020-04-14 00:01:26 260

原创 用模板类实现shared_ptr和unique_ptr

今天面试的时候被问到了一个问题,要我用模板类实现一个shared_ptr. 坦白来说这道题我并不会做,因为我对于shared_ptr的认知仅仅停留在引用计数上面。所以查阅了资料写了一份代码出来,希望对于更深入理解共享智能指针有帮助吧。首先就是每个指针类应该有一个引用计数变量,以及一个模板指针,用于存放对应的不同类型的指针。对于shared_ptr来说,指针指向相同的位置,引用计数要加1. 同时...

2020-04-12 18:06:47 379

原创 双线程交替修改变量 条件变量

这里用到了条件变量。对于条件变量,它的作用是可以调度各个进程阻塞或者唤醒。每个条件变量都有两个操作:wait和signal。wait操作可以把自身进程放于等待队列中,并且紧急等待队列非空的情况下可以唤醒第一个等待者。signal可以唤醒等待队列进程中的第一个等待者,然后本进程进入紧急等待队列的末尾。#include<stdio.h>#include<unistd.h&gt...

2020-04-02 13:01:54 339

转载 C++11 智能指针

c++里面支持四种智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr。 其中后三个是c++11支持,并且第一个已经被c++11弃用。为什么要用智能指针呢?因为c++的内存管理是需要手动管理的,当new一个对象的时候,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句...

2020-03-27 12:18:04 191

原创 malloc,free 与new delete的区别

1 malloc与freeC语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。2对于非内部数据(比如int char*这种)类型的对象而言,光用maloc/free无法满足动态对象的要求,这是因为对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构...

2020-03-26 23:04:10 114

转载 并查集详解

江湖上散落着各式各样的大侠,有上千个之多。他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架。但大侠们有一个优点就是讲义气,绝对不打自己的朋友。而且他们信奉“朋友的朋友就是我的朋友”,只要是能通过朋友关系串联起来的,不管拐了多少个弯,都认为是自己人。这样一来,江湖上就形成了一个一个的帮派,通过两两之间的朋友关系串联起来。而不在同一个帮派的人,无论如何都无法通过...

2020-03-26 14:51:09 199

原创 stl vector 容量与大小之间的关系

当对vector进行push_back等操作的时候,当超出之前内存所分配的部分之后,需要新增内存空间存放更多元素。将原来的数据复制过来,释放之前的内存,然后插入新增加的元素;那么这个过程是怎么样的呢?我们用代码来试一下:VS2013环境下如下:#include<iostream>#include<vector>using namespace std;int ...

2020-03-24 17:47:36 589

原创 数据库的四大事务特性

首先我们需要清楚,所谓数据库事务就是一串连续的数据库操作动作,是数据库执行过程中的一个逻辑单位。通俗来说,就是一串增删查改的集合。对于每一个数据库事务,它把数据库从一个一致的状态转换到另一个一致的状态,比如数据库操作前是一个点,数据库操作后是一个点,我们只管这两个点的状态,而两点之间的连线上的状态我们不管因为他们可能对我们想要的结果产生影响。1. 第一个特性 原子性...

2020-03-22 22:32:30 346

原创 数据库脏读,不可重复度,幻读以及对应的事务隔离级别

1. 脏读:所谓脏读,即“无效事务读出”。也就是说,一个事务读取到另一个事务没有提交的数据。我们举个例子:事务A1修改了一行数据,但是还没有提交(还没写入硬盘),这时候事务A2读取了被事务A1修改后的数据,之后事务T1因为一些原因Rollback回滚了,那么事务T2读取的数据就是脏的。那么它的解决办法是把数据库的事务隔离级别调整到READ_COMMITTED。2. 不可重复读:不可...

2020-03-22 22:12:16 508

原创 求0到数字n中的所有数字中某一个数字k出现的总次数

今天在leetcode上面遇到了一道题:编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数。这道题最好的解法是动态规划。分析如下:设dp[i]标志这个数字前i位中出现了2的次数,那么我们需要求的是dp[i]和的dp[i - 1]的关系。比如说一个数字2849,那么dp[2]就表示0~49中出现2的数量,dp[3]就表示0~849中出现2的数量,dp[4]就表示0~28...

2020-03-17 18:29:36 768

原创 求连续区间和为目标值的一种解题思路

今天在leetcode上面遇到了一道题,我觉得解题思路很好,在此记录下来:题目是:给定一个放有字符和数字的数组,找到最长的子数组,且包含的字符和数字的个数相同。返回该子数组,若存在多个最长子数组,返回左端点最小的。若不存在这样的数组,返回一个空数组。如:输入: ["A","1","B","C","D","2","3","4","E","5","F","G","6","7","...

2020-03-17 15:47:29 1167

原创 LL(1)文法与其对应的FOLLOW,SELECT和FIRST集

所谓LL1(1)文法是一种预测分析文法。从文法的开始符号出发,从每一步推导过程中根据当前句型的最左非终结符A和当前输入符号a能够就能够确定出一个产生式。这样就是预测分析文法的工作过程。仔细想这个过程,假设有S -> aBC 和 S->aDE两个产生式,当输入指针指向a的时候,发现两个产生式都是合适的,那么我们应该选择那个产生式呢?这就是预测分析文法会面临的问题,这个就涉及到我们所说...

2020-03-10 23:15:33 2176

原创 编译原理 自顶向下分析

从顶部的根节点到底部的叶节点分析方法叫做自顶向下分析。我们知道顶部的根节点可以表示成一个文法的开始符号S,所以说,自顶向下分析可以看成是从文法的开始符号S推导出词串w的过程。 例如,我们以输入id + (id + id)为例分析自顶向下的分析方法。首先从开始符号E(也就是树的根节点)开始推导。首先用第一个产生式生...

2020-03-09 22:05:23 1659

原创 Linux和windows下多线程的区别

Linux和windows对于多线程的多线程的实现是不同的。总体来说,Linux系统下,是用户级的多线程,也就是说内核是并不清楚多线程的存在的;而windows下则是核心级别的线程,内核可以直接对于线程进行管理。 具体来说,Linux只是用一个叫做“运行时系统”完成对于多线程的管控。Linux没有一个直接对于多线程可以管理的数据结构,他只能对于多线程上一层的进程,...

2020-02-26 22:48:27 3190

原创 面向对象的程序设计特点

面向对象的程序设计特点主要有四个:抽象、封装、继承、多态。1. 抽象:首先在面向对象的程序设计中,每一种事物都可以成为“对象”。那么一个对象可以有多个特点,比如人有身高,体重等等。把一个事物对象的特点概括表示出来的过程叫做抽象。比如员工对象的薪水,上班时间,绩效考考核等等。2. 封装:在完成抽象之后,把静态属性和动态属性归为一个整体,那么这个步骤叫做封装。通过封装,一个对象的属性和操作这些...

2020-02-25 22:55:56 8184

原创 词法分析 有穷自动机

1. 有穷自动机的概念: 有穷自动机(FA)是词法分析的重要理论基础。系统根据自己的有穷状态和离散的输入信息决定系统的后序行为。每处理一个输入,系统内部状态也可能发生改变。 其转换图表示法如下所示: 其中start指向的表示初始态,箭头上面的表示输入,有向边就是变化,圆圈内...

2020-02-24 13:39:10 2445

原创 编译原理 语法分析树和二义性文法

语法分析树是用来描述语法中句子结构的一种树,它能够动态表示一个句子推导的过程。 我们来看一个例子:由左边的文法规则可知,这是一个实现加法减法和乘法的算术表达式。从开始符号E开始,逐步推导,E => - E,然后 E => (E)等等,最终推导成E => - (E + E...

2020-02-22 16:19:47 4502

原创 编译原理 推导和归约

1. 推导 我们还是从一个英文句子来入手: 从上面一张图,我们看出文法是如何 推导 出一个英文句子的。从上往下看,从句子开始,句子可以被替换成<名词短语><动词短语>。而<名词短语>又可以被替换成<形容词><名词短语>。对于文法中的每一个产生式,都可以把左部替换成右部。这样一步一步递推,就把一个文法...

2020-02-22 14:50:38 5484 1

原创 编译原理 文法

什么是文法?我们从一个自然语言的例子讲起: 这是一个简化版本的英文文法。比如一个句子是由名词短语和动词短语构成的。名词短语由形容词和名词短语构成。从这个例子中我们能够看出语法的基本构成。用尖括号括起来的部分是语法成分,而没有被尖括号括起来的部分是语言的基本符号。英文的基本符号就是单词了。那么编译语言的文法形式化定义是...

2020-02-22 14:33:30 1018

原创 语法制导定义 SDD

语法制导定义SDD是对于 上下文无关语法CFG的一个推广:将每个产生式和一组语义规则相关联,用来计算该文法产生式中每个文法符号的属性值。 将每个文法符号和一个语义属性集合相关联。 问法符号的属性包括:综合属性和继承属性。 所谓综合属性,指的是:分析数节点N上的非终结符A的综合属性只能通过N的子节点或者N本身的属性决定。 ...

2020-02-20 16:11:28 4207

原创 上下文无关问法cfg

上下文无关文法(contextfree grammar,简称为CFG)是形式问法的一种,和其对应的语言是上下文无关语言。所谓上下文无关,如果用我们的语言举例,就是一个文法符号,不论在任何地方出现,他表示的意思都是不变的,不会随着上下文的语义为改变。 首先我们看一下形式文法:形式文法描述形式语言的基本想法是,从一个特殊的初始符号出发,不断的应用一些产生式规则,从而...

2020-02-20 12:05:00 1446 2

精通Qt4编程

是给不方便买纸质书的同学的电子版阅读。完整且清晰,方便自学。

2017-10-17

C++ GUI Qt 4编程(第二版)

给不方便购买纸质书的同学们的电子版,完整且清晰,便于自学。

2017-10-17

空空如也

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

TA关注的人

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