自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 并查集结构

将两个元素所在集合合并以及判断两个元素是否属于同一个集合。并查集就是一个用于解决这类问题的一种数据结构。

2022-10-05 22:21:39 512 1

原创 TrieTree结构

TrieTree 又称为前缀树、字典树,是一种用于字符串处理的结构。给定一个字符串集合(字典),提供下面所述的操作。

2022-09-25 22:33:46 507

原创 关于C++内存泄露的一点思考

怎么探查内存泄露?如果是大规模的内存泄露,直接通过系统资源探查命令就可以确认有内存泄露。但是如果只有少量的内存泄露,就不容易被发觉。整体来讲,内存泄漏是由于new/delete或者malloc/free的调用不匹配导致的。如果说我们能统计在整个程序运行生命周期中,malloc被调用调用次数和free被调用的次数的话我们就能大致分析是否存在内存泄露。如果是C++代码,通过new/delete来分配内存的话,可以在项目之初就引入智能指针来管理对象的创建和释放。对于现有的代码侦测,可以通过valgrind.

2022-02-15 17:18:44 347

原创 0.Redis源码目录

​ Redis5.0.8的目录主要由四个部分组成deps、src、tests、utils。另外在根目录下有两个重要的配置文件,一个是redis.conf这个是Redis启动运行参数相关的配置文件,另一个是sentinel.conf哨兵功能的配置文件。deps目录​ 通过阅读当前目录下的README.md可以知道deps目录下是第三方依赖和官方C语言客户端hiredis。当然,Redis也依赖libc(标准c库),只是这个库是来自系统平台的。​ jemalloc是一个第三方的内存管理器,可以用于替代默认

2021-10-12 17:14:29 153

原创 LeetCode 买卖股票的最佳时机(上)

LeetCode 121 买卖股票的最佳时机给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例:输入 :[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最

2021-10-10 20:26:12 79

原创 重学C++系列之函数指针

引子函数指针的一个最大的好处在于它可以像我们常用的变量一样在代码中进行传递。它的本质就是用一个变量去接收函数所在内存的地址。普通的函数调用void functionTest(){ std::cout << "Hello function!!!" <<std::endl;}int main(){ functionTest();}函数指针类型用auto关键字定义接收函数地址auto helloFuntion = &functionTest;

2021-03-28 00:18:07 88

原创 Redis的持久化方案—学习笔记

Redis提供了三种持久化方案,RDB、AOF以及两种混合使用。RDBRedis Data Base, Redis可以用SAVE或者BGSAVE命令来创建.rdb文件将数据持久化到磁盘上,或者根据用户配置策略来触发持久化操作。SAVE命令Redis服务器阻塞执行持久化操作,期间不再响应外部请求。这种一般用户系统停机维护的场景。BGSAVE命令Redis服务器后台执行一个fork操作创建一个子进程用于后台执行持久化操作。因为Linux内核下的copy-on-write机制的存在,子进程不用拷贝父

2020-09-09 17:25:31 126

原创 策略模式-Strategy Method(C++语言描述)

我们如何看待设计模式?设计模式需要站在时间轴上来看待,需要看到未来。如果一个系统是静态的,那我们也不需要设计模式,毕竟引入了某种设计模式之后,系统的复杂性以及可理解性就会大打折扣。策略模式在软件设计的过程中,某些对象使用的算法可能多种多样,经常会发生改变,如果将这些算法都硬编码到对象中,通过 if…else… 或者 switch…case… 来进行管理,将会使对象变得臃肿。策略模式要解决的问题就是如何在运行时根据需要透明地更改对象所使用的算法?将对象与算法解耦,从而避免上述问题。场景模拟例如我们

2020-05-12 14:08:48 266

原创 工厂设计模式-Factory Method(C++语言描述)

概述我们在谈设计模式的时候,需要结合具体的场景来谈。没有万能的设计模式可以适应每一个业务场景,我们只有结合实际业务场景,抓住场景中的「变」和「不变」的主体才能更好地运用设计模式来设计出优良的代码结构。工厂设计模式属于让我们灵活创建对象的模式。用于应对这样的场景:通过一个类,在不改变它的源码的情况下可以通过它暴露的接口构造出我们想要的对象。通过模拟一个小场景并逐步重构来理解工厂设计模式。需求...

2020-04-23 10:40:25 190

原创 数组元素去重

问题:去除数组中重复的元素。输入:2, 7, 3, 7, 2, 9, 9, 3输出:2, 7, 3, 9思路:1、利用数组准备一个额外空间的数组A,遍历输入数组中的元素,每个元素都去数组A中遍历,A中存在则不管,不存在就将该元素放入数组A。2、利用ADT利用语言自身所带的红黑底层结构的容器,如Java的TreeSet以及TreeMap,C++的unordered_set,se...

2019-11-28 21:05:03 806

原创 Makefile基础学习(一)——从依赖到伪目标

一、初识Makefilemake是一种用于项目编译的应用程序,本质是一种脚本。而Makefile则是对make脚本的规则描述。仅仅是写脚本编译项目的话shell脚本也是可以做的,用make的原因在于,make可以解析源文件之间的依赖,根据依赖关系自动维护编译工作。执行宿主操作系统中的各种命令。Makefile是一个描述文件,定义一系列的规则来指定源文件之间的调用先后顺序。有自己特定的语法规则...

2019-08-07 19:18:25 738

原创 进程间通信——管道

基于管道的进程间通信模型为了完成进程间通信,需要先建立管道。管道不属于进程的资源而是和套接字一样属于操作系统。两个进程通过操作系统提供的内存空间进行通信。创建管道的API:#include <unistd.h>//成功返回 0,失败返回 -1int pipe(int filedes[2]);接口参数为文件描述符组成的数组。filedes[0]管道出口,filedes[1...

2019-07-09 14:16:25 204

原创 递归实例求数组元素最大值

在用递归求解问题的时候,边界条件重要,子过程的划分一样重要,子过程反映了求解问题思路。将数组求最大值的问题划分子过程,采用左右划分。即将一个数组左右 「切成」两半,求取左侧最大值及右侧最大值,再二者之间返回最大值即可,其中左侧与右侧再按此划分,直到不能再划,即「当前半边」只有一个数组元素了。例子实现 C++ 代码:#ifndef _MY_ALGORITHM_#define _MY_...

2019-06-06 13:59:52 1078

原创 排序算法之选择排序

在初级排序算法中,冒泡和插入排序已经不被实际工程所采用了。而选择排序还是会有地方用的。选择排序,插入排序像整理扑克牌一样,牌一张张的来,每来一张,就要将它插入手里之前已经整理好的牌中。我们假定数组有 n 个元素。下标索引为 i。i 从 1 到 n - 1。假定数组 array 元素为:1, 4, 3, 90, 1, 2, 3我们采用升序,第一轮:i 的值取 1,array[i] = 4...

2019-04-16 19:25:02 129

原创 对宏offsetof理解

#ifndef offsetof#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE*)0)->MEMBER)#endifoffset这个宏有两个参数 TYPE 和 MEMBER ,这个宏求的是结构 TYPE 中 MEMBER 成员的偏移量。先理解最里面的部分:((TYPE*)0)->MEMBER这里将0地址转换为...

2019-03-25 23:27:48 200

原创 Linux下librdkafka编译安装使用学习

Kafka分为服务端和客户端,服务端集群一般称为brokers,客户端分为生产者(producer)和消费者(consumer)。开发者通常用客户端从kafka生产消息或消费消息,不同的语言使用不同的客户端,具体信息参见这个页面:https://cwiki.apache.org/confluence/display/KAFKA/Clients我使用的是C++开发的客户端:librdk...

2018-11-30 14:24:30 7302

原创 Go语言学习之路(一)——hello,world

//filename: hello.gopackage mainimport ( "fmt" "os")func main(){ //这个 { 不能另起一行 fmt.Println("hello world!")}1.go语言用「包」来组织代码, 代码开始部分的 package main指明这个文件属于哪个「包」。名为main的包比较特殊,它用来定义一个独立的可执行程序。...

2018-08-16 23:05:48 7303

原创 Linux下zookeeper简单安装配置

基本安装配置zookeeper,安装目录为/usr/local.zookeeper, 数据目录为/var/lib/zookeeper 1、下载zookeeper-3.4.12.tar.gzhttp://mirror.bit.edu.cn/apache/zookeeper/2、解压tar -zxf zookeeper-3.4.12.tar.gz3、剪切sudo mv z...

2018-07-31 20:22:55 186

原创 Linux下安装 jdk 环境

1、选择对应的jdk版本下载(jdk-8u181-linux-x64.tar.gzs)http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html2、在 usr 目录下新建 java 安装目录cd /usrsudo mkdir java3、将下载下来的jdk 文件复制到新...

2018-07-31 19:59:32 147

原创 C++ const 关键字使用小结

const 作用在指针变量上, 有作用于指的针指向不能修改和作用于指针指向的变量不能修改的区别。如果关键字 const 出现在星号左边, 表示被指向的对象是常量; 如果 const 出现在星号右边, 表示指针本身是常量, 不能指向其他内存空间; 如果 const 出现在星号两边表示指向的对象和指针本身都是常量。int a = 0;int b = 1;const int* c = &amp;a;...

2018-05-22 23:22:25 292

原创 引用与指针小结

引用与指针小结1、引用在创建的时候就必须被初始化, 即引用到一个对象; 指针在定义的时候不必初始化, 可以在之后根据自己的需要初始化。2、没有空引用, 指针可以赋值为NULL, 而引用是不可以的,引用必须与合法的存储单元关联。3、引用一旦被初始化指向(绑定)某个对象后, 它就不可以再被改变指向另一个对象。 而指针在没有经过const修饰的时候, 是可以随时指向另一个对象的。int a = 0;i...

2018-05-20 09:17:09 357

原创 排序算法之选择排序与冒泡排序

冒泡排序    对于给定的一个数组, 欲将其升序排列。     下标 i 从后往前走,每次把 i 及其之前『最大』的元素『沉』到 i 位置。    第一次 遍历数组 0 到 n-1 位置, 将最大的一个元素捡出来, 与第 n - 1 位置元素交换, 第二次 遍历数组 0 到 n-2 位置, 与 n - 2 位置元素交换, 第三次... 直到把整个数组排完。class Sort{public:...

2018-05-10 22:50:22 163

原创 Makefile中的变量值的替换(二)

1.变量的嵌套引用    一个变量名中可以包含对其他变量的引用    嵌套引用的本质是使用一个变量表示另外一个变量    例:x := yy := za := $($(x))    分析: 这个很好理解,上述第三行可以解析为a := $(y) ==&gt; a := z   2.命令行变量    在shell中运行make的时候,在命令行中定义变量    命令行变量可以默认覆盖Ma...

2018-05-07 21:38:28 1673

原创 Makefile中的变量值的替换(一)

1.使用指定字符串替换变量中的后缀字符(串)    格式:$(var:a=b)或${var:a=b}    注意:替换表达式中不能有空格】    例:src := acc bcc cccobj := $(src:cc=o)test: @echo "obj =&gt; $(obj)"    make test输出结果:    ao bo co2.变量的模式替换    使用%保留变量值中的...

2018-05-06 23:12:21 6809

原创 Makefile中变量的定义及使用

Makefile中变量的定义及使用CC := gccTAGRET := hello.out$(TARGET): func.o main.o $(CC) -o $(TARGET) func.O 上述Makefile中第一二行依次定义了变量CC、TARGET,第四五行引用了这两个变量,引用变量采用"$(变量名)"或者"${变量名}"的形式。Makefile中的变量只能是字符串类型。Ma...

2018-04-30 16:54:36 12836 2

原创 Qt模型视图(MV)小案例

需求在本地文件中读取学生分数信息,按照一定规则显示到界面中支持数据动态加载,即本地文件更改后,可以动态地在界面上显示......支持分数平均等小功能本案例采用MVC设计模式,采用四层架构,从下往上即数据层(Data Source)、数据表示层(Data Object)、数据组织层(Model)、数据显示层(View)系统架构图:核心类图:DataSource类设计:——设置数据源并读取数据——对数...

2018-04-06 17:08:48 1295

原创 基于QPainter的简易绘图板设计

——功能需求自由图形绘制基本图形绘制选择图形绘制颜色类似于Windows自带的绘图程序——界面解决方案以QWidget为基类创建绘图主窗口使用QGroupBox创建图形设置区域使用单选按钮QRadioButton实现目标图形的选择使用QComboBox实现绘图颜色的选择效果:问题分析:1、如何实现自由绘图?自由绘图的本质即跟踪鼠标的移动,所以必须考虑鼠标何时开始,何时结束,以及如何记录鼠标的移动。...

2018-04-01 21:02:34 421

原创 标准库容器里存的是引用还是实体对象?

以前没有认真思考过容器里存的到底是引用还是对象。因为存引用的话会减少调用拷贝构造带来的开销,但是那样的话就不能保存local object(局部对象)的引用,那样会给容器的使用范围带来很大的局限性。所以,容器里存的是实体对象。这是今天在写代码查一个bug的时候发现的。场景是代码从文件中读取数据,存到一个list中。在调用append后,发现值就发生了变化,字符串变成了空串,int变成了随机值。(以...

2018-03-18 17:44:00 1497 2

原创 支持最小值的栈设计

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

2017-12-22 13:30:06 203

原创 DynamicList动态顺序存储结构

DynamicList动态顺序存储结构设计与实现

2017-12-20 22:39:48 944

原创 线性表的顺序存储操作

顺序存储表的定义:线性表的顺序存储结构指的是用一段地址连续的存储单元一次存储线性表中的数据元素。顺序存储结构线性表的设计:可以选择用一维数组来数显顺序存储结构--存储空间:T* array;--当前长度:int m_length;【代码示例】#ifndef SEQLIST_H#define SEQLIST_H#include "List.h"namesp

2017-11-17 22:31:11 191

原创 C&&C++异常处理(三)

在C++中catch语句块也可以抛出异常为什么C++要支持catch语句块也可以抛出异常呢?catch语句块中可以将捕获到的异常重新解释后再抛出(在大型的软件系统中我们就可以对异常做统一的规范,便于软件的开发管理)在软件开发工程中,我们采用下面这样的方式统一异常【编程实验】C++中异常的重新解释#include #include u

2017-11-12 14:56:42 266

原创 C&&C++异常处理(二)

C++中内置了异常处理的语法元素try...catch...    --try语句处理正常代码逻辑    --catch语句处理异常情况    --try语句中的异常由对应的catch语句处理try{ double r = divide(1, 0);}catch(...){ cout << "Divide Exception..." << e

2017-11-12 10:35:11 418

原创 C&&C++的异常处理(一)

异常的概念--程序在运行过程中可能产生异常--异常(Exception)与错误(Bug)的区别异常是程序运行时可预料的程序执行分支Bug是程序中的错误,是不被预期的运行方式异常和Bug的对比:    --异常运行时产生除0的情况需要打开的外部文件不存在 数组的越界访问        --Bug使用野指针堆数组使用后未释

2017-11-11 03:14:01 385

原创 线性表性质与操作

线性表(List)的表现形式:--零个或多个数据元素组成的集合--数据元素在位置排列上是有序的--数据元素的个数是有限的--数据类型必须相同线性表(List)的抽象定义:--线性表是具有相同类型的n(n >= 0)个数据元素的有限集合。--(a0, a1, a2, ... an-1)--其中ai是表项, n是线性表长度。线性表(List)的性质:

2017-11-01 23:41:03 481

原创 重载new/delete自定义内存管理

new/delete是C++预定义的操作符。 new/delete行为: –new 1、获取足够大的内存空间(默认是堆空间) 2、调用类的构造函数创建对象 –delete 1、调用析构函数销毁对象 2、回收内存空间(默认为堆空间)

2017-10-31 22:56:21 459

原创 Qt客户服务端传输数据总结

第一个小项目是关于Qt多线程与网络传输的。 环境:VS2015+QT5.3(或者任意的其他版本的VS+QT组合) 要求:分别编写一个客户端和服务器端的程序,程序A作为客户端,程序B作为服务器端。

2017-06-12 22:07:34 2401

原创 指针与内存管理初步

野指针及内存管理初步

2017-05-21 11:00:58 253

原创 多线程之生产者消费者模型

多线程生产者消费者模型及代码实现。

2017-05-17 12:10:46 396

原创 Tempalate Method

在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?

2017-05-05 09:07:57 363

空空如也

空空如也

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

TA关注的人

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