自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(166)
  • 资源 (2)
  • 问答 (2)
  • 收藏
  • 关注

原创 valgrind使用

Valgrind是一个工具集,包含了许多调试与性能分析的工具。其中使用最多的是Memcheck,它能帮你检测C/C++中的内存问题,避免程序崩溃或不可预知错误。Cachegrind一个缓存和分支预测分析器。它能够模拟CPU中的一级缓存L1、D1和二级缓存,且能够精确指出程序中cache的命中和丢失。它还可以给出每行代码,每个函数,每个模块,和整个程序的内存引用次数以及指令数,有利于优化程序。Callgrind相当于Cachegrind的一个扩展。

2024-01-24 16:19:31 840

原创 红黑树的删除

好了,到这红黑树的删除总算讲完了,不知道你有没有睡着。重点是,红黑树的删除 = 删除 + 维护,无论怎样删除结点,都会动态的调整树高。

2023-12-29 17:02:50 900

原创 红黑树的插入

当你熟悉了上面五种场景后,无论红黑树已经有多大,无论新节点从哪个位置插入,都能按合适的方式调整整个树的高度,就才是插入算法的精妙所在!

2023-12-26 10:40:46 984

原创 红黑树的旋转、变色

旋转是以一个父节点作为参照物的。旋转分为左旋转与右旋转,其对应的结果就是将左子节点(后称左节点)或右子节点(后称右节点)替换原来的父节点,具体操作如下。右旋转使左节点成为新的父节点。原来的父节点,成为新的右节点。先前左节点的右子树,变成新右节点的左子树。左旋转使右节点成为新的父节点。原来的父节点,成为新的左节点。先前右节点的左子树,变成新左节点的右子树。

2023-12-25 10:54:08 361

原创 哈希表、哈希冲突解决办法

我们知道,普通数组能够直接寻址,在O(1)时间内能访问到数组中的任意位置。它需要足够大的空间,为每一个关键字保留一个位置。当关键字取值的范围很大,储存空间又有限时,能不能同样用数组的形式实现O(1)查找?哈希表(Hash Table)就是这样的数据结构,当实际储存的关键字集合,比所有可能的关键字的全集小许多时,使用一个长度有限的数组去储存这些关键字,从而节省大量的空闲空间。它也被称作为散列表,因为它的键是分散存储在数组中的。如图,黄色区域为键的全集,范围为0~99,绿色区域为实际存储的键。

2023-11-27 13:09:31 369

原创 多路复用IO:select、poll、epoll

多路IO复用是指单个进程/线程就可以同时处理多个IO请求。用户将想要监视的文件描述符添加到selectpollepoll函数中,由内核监视,函数阻塞。一旦有文件描述符就绪(读就绪或写就绪),或者超时(设置了超时时间),函数就会返回,然后该进程可以进行相应的读/写操作。

2023-11-13 10:53:56 106

原创 Linux 命令(11)—— tcpdump

tcpdump是一个网络抓包工具,它可以捕获和分析TCP/IP网络协议的数据包。它使用libpcap库来抓取网络数据包,这个库在几乎在所有的 Linux/Unix 中都有。之所以叫做tcpdump,是因为它最初是用于捕获和分析TCP协议的数据包。然而,随着时间的推移,它的功能扩展到了其他协议,如UDPICMP等。尽管如此,它的名称仍然保持为tcpdump。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

2023-10-26 14:29:12 562

原创 docker指令

docker指令

2023-10-25 16:14:55 693

原创 cppcheck新手指引

cppcheck 是一个开源的静态代码分析工具,用于检查 C 和 C++ 代码中的潜在问题和错误。

2023-10-19 14:16:30 1247 1

原创 Linux 命令(10)—— ps

UNIX风格的选项:必须以开头,多个选项可以组合在一起使用。例如,ps -auxps -ef。BSD风格的选项:不能以开头,多个选项可以组合在一起使用。例如,ps auxps ef。GNU风格的长选项:必须以--ps --info。ps -aux与ps aux会产生不同的结果。

2023-08-03 10:00:25 259

原创 如何避免GCC优化选项对程序带来的干扰?

关于具体每个编译选项的解释,牵扯到太多的背景知识。可以通过man文档查找说明。的汇编代码,精简了许多操作,而这些细微的差异如果不注意,会违背开发者的初衷,甚至影响程序预期结果。也就是说,程序没有按原有的逻辑去执行循环累加,而直接返回了计算结果。发现main函数汇编代码的第二行,是将立即数0x1356(十进制:4950)移入。开启的编译选项,默认。

2023-08-02 15:54:11 214

原创 实际用户ID、有效用户ID、保存的设置用户ID

与进程相关的id简介查看方式如何设置实际用户ID (Real User ID, RUID)进程被创建时的用户ID一般不可更改实际组ID (Real Group ID, RGID)进程被创建时的组ID一般不可更改有效用户ID (Effective User ID, EUID)进程访问文件或其他资源时使用的用户ID有效组ID (Effective Group ID, EGID)进程访问文件或其他资源时使用的组ID。

2023-07-22 14:38:32 616

原创 Google Test(gtest)新手入门

gtest),也称为Google C++ Testing Framework,是一个由Google开发的开源C++测试框架,提供了多种工具来支持C++代码的单元测试。提供了多种断言方法,可以用于测试函数、代码片段的预期行为。支持自动化测试,可以方便编写测试用例,并自动运行和输出结果。支持死亡测试(Death Test),测试代码在极端或异常条件下的行为表现。提供测试夹具(Test Fixture,一种用于编写可重复执行的测试用例的机制),使得测试用例便于重用。

2023-07-20 17:00:10 1604

原创 使用PAPI进行性能测试

PAPI(Performance Application Programming Interface)是一个跨平台的性能计数接口工具集。它提供了一套标准化的API,用于访问硬件性能监测计数器(PMU),在软件中实现高精度的性能分析与优化。PAPI性能测试工具的安装、使用及实例 - Satchmo丶 - 博客园 (cnblogs.com)

2023-06-28 13:59:24 411

原创 Linux Perf

perf (Performance analysis tools for Linux),是Linux官方的性能分析器(profiling),存在于内核源码目录tools/perf中。可以用于分析系统调用、硬件事件、软件事件、CPU使用情况、内存使用情况、锁等信息,从而帮助定位系统性能问题。perf原名为Linux性能计数器(Performance Counters for Linux,PCL),现名为Linux性能事件(Linux Performance Events,LPE)。

2023-06-25 16:54:01 1124

原创 Linux 命令(9)—— top

top提供运行系统的动态实时视图。它可以显示系统摘要信息以及当前由Linux内核管理的任务列表。所显示的系统摘要信息的类型以及为任务显示的信息的类型、顺序和大小都是用户可配置的,并且可以在重新启动期间使配置持久。

2023-06-16 15:10:36 2957

原创 解释器模式(Interpreter)

定义一个语言的文法,并且建立一个解释器来解释该语言中的句子。解释器模式是一种类行为型模式。就比如正则表达式,它就是解释器模型的一种应用,解释器为正则表达式定义了一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式。

2022-12-27 11:20:03 324 1

原创 访问者模式(Visitor)

在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。访问者模式定义:表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。假如你需要将数据对象存储到xml文件中,而这样的数据类型有很多种。你不可能为每个类添加一个存储为xml的方法,因为后续可能又需要将数据存储其它格式,比如json,csv等。

2022-12-15 23:45:36 292

原创 模板方法模式(Template Method)

模板方法模式定义:是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。如在构建造房屋时,有一些基本的步骤,例如打地基、 建造框架、 建造墙壁和安装水电管线等。标准房屋建造方案中可提供几个扩展点,允许潜在房屋业主调整成品房屋的部分细节。使得成品房屋会略有不同。

2022-12-15 20:58:46 383

原创 策略模式(State)

完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。策略模式定义:策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,让它们可以相互替换。假如你需要前往机场。你可以选择乘坐公共汽车、预约出租车或骑自行车。这些就是你的出行策略。你可以根据预算或时间等因素来选择其中一种策略。

2022-12-15 11:04:34 372

原创 状态模式(State)

状态模式定义:允许一个对象在其内部状态改变时改变它的行为,使其看上去就像改变了自身所属的类一样。

2022-12-14 23:25:52 201

原创 观察者模式(Observer)

建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。观察者模式:定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

2022-12-08 22:56:22 131

原创 备忘录模式(Memento)

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。

2022-12-06 22:40:34 303

原创 中介者模式(Mediator)

对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。

2022-12-05 23:56:22 336

原创 迭代器模式(Iterator)

提供一种方法,顺序访问一个聚合对象中(集合)的各个元素,而又不暴露该对象的内部表示。

2022-11-28 21:08:07 452

原创 命令模式(command)

在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。

2022-11-02 07:29:25 186

原创 责任链模式(Chain Of Responsibility)

C++实现责任链模式

2022-07-31 16:26:07 221

原创 代理模式(Proxy )

设计模式,代理模式,C++

2022-07-06 17:14:32 122

原创 Linux 命令(8)—— dmesg

linux命令dmesg

2022-07-06 16:23:15 1614

原创 享元模式(Flyweight)

享元模式

2022-06-20 11:49:49 120

原创 外观模式(Facade)

外观模式

2022-06-09 15:13:30 105

原创 装饰器(Decorator)

装饰器(Decorator)

2022-06-09 11:09:54 210

原创 组合模式(Composite )

组合模式

2022-06-08 15:36:50 135

原创 桥接模式(Bridge)

桥接模式   

2022-06-07 10:12:49 201

原创 适配器模式(Adapter)

适配器模式 把原本不兼容的接口,通过适配修改做到统一,方便用户使用

2022-06-02 11:01:54 149

原创 原型模式(prototype)

通过现有的东西,再复制另一个来,这就是原型模式。

2022-05-26 15:21:39 187

原创 git基础命令

git 常用命令

2022-05-24 16:44:45 109

原创 建造者模式(Bulider模式)

设计模式-builder-建造者模式

2022-05-09 10:22:27 494

原创 C++ map如何使用自定义关键字

C++ map如何使用自定义关键字?

2022-04-19 23:37:15 885

原创 Prim、Kruskal

文章目录一、什么是最小生成树?1、生成树2、最小生成树二、最小生成树求解算法1、Prim2、Kruskal一、什么是最小生成树?1、生成树对于有n个顶点的连通图,至少有n-1条边,那么连接所有顶点的极小连通子图就是生成树。如果在图的生成树中任意加一条边,则必然形成回路。 2、最小生成树对于连通网来说,边是带权值的,生成树的各边也带权值,因此把生成树各边的权值总和称为生成树的权,把权值最小的生成树称为最小生成树。 如图: 二、最小生成树求解算法1、Prim实现步骤将图的

2022-04-10 21:45:21 236

GDB调试程序-入门级

详细并且全面的GDB入门,易理解。 内容: 一、 GDB概述 二、系统认识GDB 三、GDB的命令概貌 四、GDB中运行UNIX的shell程序 五、在GDB中运行程序 六、调试已运行的程序 七、查看栈信息 八、查看源程序 九、查看运行时数据 十、查看寄存器 十一、改变程序的执行

2019-02-26

ubuntu16.04安装mysql5.7脚本

ubuntu16.04自动安装mysql5.7的部署脚本,内附mysql5.7,脚本中有注释,另有数据库搭建脚本。

2018-05-14

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

TA关注的人

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