自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LruCache结合Any容器类型实现任意类型缓存

使用unordered_map 和 双向链表实现,支持设置缓存过期时间;通过Any容器可实现任意类型的缓存

2023-02-13 21:58:30 118

原创 面试经典:TCP粘包是怎么回事?

前言关于TCP协议的问题在面试中会经常被问道,尤其是在应届生面试中。TCP协议是面向连接的可靠性协议。说它可靠并不表示数据信息一定会被对端接受,而是在传输失败后会放弃重传机制并中断连接来通知用户。它提供的只是数据可靠性的传输和故障通知。回到TCP粘包这个问题上,TCP是数据流传输,数据流是只有起点和终点的字节数据序列,只有输入流和输出流。根本不存在“包”的概念。那大家常说的粘包的“包”是指什么呢?其实大家说的是应用层的包,应用层协议规定了包的结构和大小,本质上就是一段数据报文。具

2021-08-06 15:59:27 297

原创 VS2019安装QT5.14.1全过程

前言作为一个VS的老用户,在开发Qt项目时,实在不想使用QtCreator来开发,我相信很多人和我一样,用过VS编写C++就不想在用其他IDE了????。记录一下我安装VS2019+Qt5.4.1的全过程(保姆级教程),帮大家快速安装。安装QT15.4.1https://download.qt.io/在这里面选择一个要使用的Qt版本我这里选择5.14.1选择windows版本下载安装需要你的账号密码,如果没有可以使用邮箱注册VS2019和VS201..

2021-07-25 19:32:51 4978

原创 分级时间轮c++简单实现

在实际工作中我们不能为每一个定时任务创建一个定时器,因为定时器也是一种珍贵的资源,在linux中可以使用alarm信号,timerfd,epoll_wait,select都可以来实现定时器。其中epoll_wait和select提供了延时作用,alarm采用异步的信号,timerfd系列需要在select/epoll中注册定时器事件EPOLLIN,并在事件发生后uint64_t x; read(timerfd,&x,sizeof(x));否则select和epoll的水平触发模式下会不断的提醒...

2020-08-16 22:13:46 897

原创 C++ 利用linux函数makecontext等实现简单协程

我是一个编程新手,最近了解到协程这个概念,协程可以理解为用户级线程,在用户空间实现调度,在处理异步IO时,可以在子程序中让出cpu交给其他协程,等事件完成再切换到子程序中。当然回调也可以实现,但是使用协程会使程序“看起来”是顺序执行的。我利用linux系统函数getcontext,makecontext,swapcontext来实现协程之间的切换。getcontext(ucontext_t*)初始化上下文,makecontext(ucontext_t*,void(*)(void),int args)

2020-06-13 20:18:31 1614 2

原创 在docker中部署consul

consul可用于服务发现,并提供可视化工具,默认端口9000首先在docker中拉取consul最新版本docker pull consul:lasest启动脚本,搭建consul集群,并设置consul服务随docker启动而启动 1 #!/bin/bash 2 3 PORT=8500 4 IP=172.19.0.8 5 rm -fr /data/cons...

2019-12-17 11:16:01 430

原创 在docker中发布微服务

Dockerfile文件//使用最新的debian作为基础镜像,debain为linux环境FROM debian:latest//运行mkdir 创建app目录RUN mkdir /app//切换目录WORKDIR /app//将当前目录中的可执行文件添加到/app目录中ADD email-service /app/email-service//运行邮件服务CMD ["....

2019-12-14 23:05:08 300

原创 在搭建centos7 go微服务环境中遇到的问题汇总

首先安装go环境首先下载一个go的版本https://golang.google.cn/dl/在网站中找到链接后使用wget https://studygolang.com/dl/golang/go1.13.1.linux-amd64.tar.gz 下载压缩包解压:tar -xvf go1.13.1.linux-amd64.tar.gz 会生成一个go文件夹,这个文件夹就是goroot...

2019-10-18 13:31:03 576

原创 centos7安装protocol buffer

centos7安装protocol buffer因为搭建go环境需要使用protoc,所以记录一下对于protoc的安装记录:是用wget下载protobuf包wget https://github.com/protocolbuffers/protobuf/releases/download/v3.10.0/protobuf-all-3.10.0.tar.gztar zvxf pr...

2019-10-17 10:59:20 979

原创 任意类型容器Any

利用模板类继承非模板类,实现一个可以存储任意类型的容器#ifndef _ANY_H#define _ANY_H#include <string>#include <algorithm>class IAnyItem abstract{public: virtual ~IAnyItem() {} virtual const type_info& ...

2019-08-13 20:08:50 582 1

原创 c++实现LFU算法

LFU (Least Frequently Used),是一种缓存算法,它对每一个数据块都有一个访问次数的记录,也就是一个数据块的访问次数越大,在将来越可能访问。1.每个节点(数据块)都有一个访问次数,新插入的节点访问次数为12.相同访问次数的依据时间排序,后插入的在前面3.当需要淘汰数据时,会从尾部,也就是访问次数从小到大,开始淘汰这里是使用c++实现的LFU缓存:主要利用了一个mu...

2019-08-09 15:10:31 4464

原创 c++实现LRU算法

LRU算法(Least Recently Used),是内存管理中为了保证命中率的一种页面置换算法,可用于内存和辅存之间也可用用在cache和内存之间,redis中的过期淘汰策略中也使用了lru算法。它是利用了程序局部性的原理,简单说就是此刻访问的页面很可能在下一时刻也会访问。这里使用c++实现简单的LRU缓存#ifndef _LRU_H#define _LRU_H#include...

2019-07-31 20:49:52 1095

原创 跳跃表实现

跳跃表:跳跃表与链表结构相似,只是引入“分层”的概念,从上到下的每一层都是一个链表。借个图:从图中可观察到跳跃表有以下的性质:1.每个节点有多个层,每层都有一个指向同层的下一节点的指针2.每层的链表都是一个有序链表,根据给定的key排序3.最底层也就是第一层,的链表包含所有节点4.存在于 k 层的节点,同样也存在于 <k 层的链表中引入多层的链表的概念是为...

2019-07-04 11:57:47 517

原创 排序算法总结对比

/*常用排序算法分析*/void swap(int& x,int& y){ if(x != y){ x = x + y; y = x - y; x = x - y; }}/*冒泡排序时间复杂度为o(n^2)两两比较,交换,每次内层循环在未排序序列中找出最大值放到已排序中对于部分有序的序列来说,效率较高稳定*/void bubble_sor...

2019-04-28 10:45:36 722

原创 B+树插入删除实现(c++)

B+树性质B+树B+树的实现有多种,有关键字和子树个数相等的,还有向B树一样的子树比关键字数量多一个。这里使用第二种方式。1.树的每个节点最多有M个子树2.根节点至少有两个子树(如果不是叶子节点)3.除根节点之外的所有非叶子节点,至少有M/2个子树(向上取整)4.所有非叶子节点包括keycount,child[0],key[1],child[1],key[2]..key[keyco...

2019-03-20 22:29:36 1442

原创 B树插入删除实现(c++)

B树的性质1、树的每个节点最多有M个子树。2、根节点至少有两个子树(除非它是叶子节点)。3、除根节点之外的所有非叶子节点至少有M/2个子树(向上取整)。4、所有非叶子节点包含keycount, childs[0],keys[1],childs[1],keys[2]........keys[keycount],childs[keycount]。也就是所有非叶子节点的子树在key值...

2019-03-14 13:14:59 1158

原创 使用mmap遇到总线错误bus error

先简单描绘一下错误发生的场景:#define MMAP_BUFF_SIZE 4096struct Message{ int len; char data[1024]; };int fd = open("./test",O_RDWR | O_CREAT);lseek(fd,MMAP_BUFF_SIZE,SEEK_SET);Message* m ...

2019-03-07 14:21:35 4872

原创 哈夫曼编码

哈夫曼树哈夫曼树就是一棵带权二叉树、它的WPL是最小的、也就是从根节点到每一个节点的路径长度(经过的边数)与权值乘积的总和是最小的、就称为哈夫曼树。哈夫曼编码把各个字符在整个串中出现的频率作为它的权重、通过使用0、1表示来缩短整个串的长度、可用于无损压缩。完成哈夫曼编码首先要先建立哈夫曼树、根据树中节点的路径、计算出对应节点的编码。下面我写了一个类其中就包含了建立哈夫曼树和完成...

2019-01-23 21:22:25 1075 1

原创 智能指针shared_ptr

说明:在使用c++语言编程时、为了防止忘记对申请的空间进行释放、我们通常使用智能指针来管理对象。智能指针有很多种、它们适用于不同的场合。auto_ptr:只允许唯一的一个auto_ptr对象管理一个资源、在拷贝时会自动将原auto_ptr指向置空。unique_ptr:同一时刻只允许一个unique_ptr对象指向指定资源、不允许拷贝、通过release()释放所有权、move移动所有...

2019-01-23 19:17:33 160

原创 遇到的错误以及一些配置、做个记录

Vs2012 重定义的错误2018-12-5今天我遇到了一个链接期错误“重定义”、以前也遇到过、但是以前是“真的重定义”、有重复的变量或者是重定义的函数、但是这次不一样、听我讲清整个事件的全过程:地点:一个头文件中、暂时命名为“app.h”,更细致一些是在一个命名空间中如下:namespace test{ namespace APP { boos...

2018-12-05 19:56:30 162

原创 开链式哈希表

简单说明hashtable适用于需要频繁插入、删除、查找的场合、在这些场合中hashtable都可以常数平均时间完成、然而之所以hashtable的效率这么高、是因为在以上这些操作时都是通过hash function直接定位元素在表中的位置然后直接操作。不可避免的有一些部分性质或全部性质相同的元素被定位到同一个位置上、这时新的问题产生了:解决冲突。实际上解决方法有很多:像线性探测、二次探测、开...

2018-11-04 20:06:46 549

原创 优先队列实现

简单说明优先队列可以根据key值的大小将元素进行排序、先被pop的通常是优先级最高的。优先队列的内部实现其实是利用了堆的数据结构、binary heap是一种完全二叉树、以大堆为例、每棵树的根节点的key值一定大于其子孙节点的key值、完全二叉树处了最底层的叶子节点外、其他位置都是填满的。这样我们可以利用数组来存储所有节点。若将数组从下标1开始存储元素、那么下标为 i 的节点的左孩子节...

2018-10-31 17:02:16 5694 1

原创 循环队列

在开发时常常需要使用循环队列、看到python中的Queue线程安全的队列、自己也想实现一个。没什么好说的、代码:#pragma once#include &lt;Windows.h&gt;template&lt;class T&gt;class CMyCirQueue{private: T* const head; size_t size; size_t...

2018-10-29 10:38:16 224

原创 STL内存池讲解

简单说下:设计内存池的目的主要是为了解决在一些特殊的场合(比如:网络编程时接受数据包)频繁的创建和销毁、造成的大量的内存碎片和降低效率。在STL的内存池中可以看到、它的实现是利用了一个自由链表数组、Obj** free_lists;数组中每个元素都是一个自由链表的头指针、它指向一个由多个内存块连成的链表。另外、每个链表中所包含的内存块的大小是固定的、STL中是从8开始到128byte结束、块与...

2018-10-26 16:37:57 1035 3

原创 红黑树插入删除操作

红黑树有以下的性质:性质1. 节点是红色或黑色。性质2. 根节点是黑色。性质3 每个叶节点(NIL节点,空节点)是黑色的。性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。红黑树是二叉平衡树的一种、STL中的map、set、xxxmap、xxxset都是使用红黑...

2018-10-11 19:23:55 169

空空如也

空空如也

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

TA关注的人

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