自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

hanxiaoyong_的博客

业精于勤

  • 博客(248)
  • 资源 (7)
  • 问答 (1)
  • 收藏
  • 关注

原创 c++数据格式化输出/字符串复制/字符串比较

sprintf_s比

2021-06-02 09:49:16 636

原创 C++多线程编程(真实入门)

https://blog.csdn.net/Kprogram/article/details/89472995

2021-01-06 10:39:41 1942

原创 C/C++中深浅拷贝(map、vector)与内存释放

在实际应用中,有时需要进行map的深拷贝,直接上代码:#include <iostream>#include <string>#include <map>#include <string.h>#include <iterator>using namespace std;int main(){ map<string,int>m_map; m_map.insert(make_pair<string,int..

2021-01-03 20:05:50 10777

原创 js正则表达式-匹配空格/数字范围/网址/电话等常用表达式

项目需要匹配gh字符,要求gh前面有空格,后面有无空格都可以。思路如下:\s :表示space,空格+: 一个或多个^: 开始,^\s,以空格开始$: 结束,\s$,以空格结束|:或者/g:global, 全局str.replace(/^\s+|\s+$/g,'')错误写法如下: var reg=/(^\s+)gh(|\s)/geg:str='hello chinagh'reg.test(str) //false正确的写法如下:reg=/( +...

2020-07-27 21:59:24 16900 1

原创 C++ 使用共享内存的进程通信方式模拟生产者消费者模型

C++ 使用共享内存的进程通信方式模拟生产者消费者模型,进程间的同步使用信号量SystemV方式。

2024-04-16 23:06:37 308 1

原创 linux下backtrace函数获取函数调用堆栈信息用法

使用backtrace可以查看函数的调用关系,也可以查看程序异常时的函数调用关系。配置生成coredump生成文件的方法也可以捕获异常,但产生的coredump文件内存较大,backtrace函数的方法占用的内存小。:查看函数Print1函数是哪个函数调用。生成可执行文件的命令如下。执行下面运行可执行文件。

2023-10-30 21:37:38 443

原创 VSCode Linux的C++代码格式化配置

然后,重新打开VSCode,按下Ctrl+S时会自动格式化代码。保存后,在当前工程下面,按下Ctrl+S保存时会自动格式化代码。得到安装地址:/usr/bin/clang-format。(3)不用保存时格式化代码,使用快捷键格式化代码。默认的格式化代码快捷键Ctrl+Shift+I。

2023-10-03 09:44:59 444

原创 设计模式之解析器(Interpreter)的C++实现

设计模式之解析器(Interpreter)的C++实现。在软件开发的过程中,需要实现一种需求,该需求的结构稳定,但是需求的业务内容会频繁变化,如果使用普通语法实现需求,需要经常更新代码,不具有灵活性。可以使用解析器模式解决实现该类需求,解析器是实现一种能够解析该需求结构语法的功能代码,针对不同的业务调用对应的解析规则代码。有一个字符串的加减计算,如'a+b+c-d-e',其中a,b,c,d,e分别对应带计算的值。

2023-09-17 13:01:16 366

原创 linux下检测CPU性能的mpstat命令安装与用法

linux下检测CPU性能的mpstat命令安装与用法P: 指定要监控哪个CPU,范围是[0 ~ n-1], ALL表示监控所有CPU都监控。count: 采样的次数,count只能和delay一起使用。上面输出了2次的CPU状态,后面输出了所有 CPU 的平均值。(4)检测每个CPU的状态,每1秒检测1次,检测2次。interval: 相邻的两次采样的间隔时间、(2)1秒检测1次,检测5次CPU。mpstat的命令用法也可参考。(3)检测每个CPU的状态。(1)检测总的CPU状态。

2023-09-09 21:47:20 751

原创 设计模式之访问器模式(Visitor)的C++实现

在软件开发过程中,早已发布的软件版本,由于需求的变化,需要给某个类层次结构增加新的方法。如果在该基类和子类中都添加新的行为方法,将给代码原有的结构带来破坏,同时,也违反了修改封闭,扩展开放的原则。访问器模式可以实现不改变原有代码结构的前提下,基于双向分发机制(2次虚函数绑定实例对象),通过扩展的方法实现新的接口。上面的代码,ConcreteElementA和ConcreteElementB的方法更新,通过Visitor基类的扩展子类来实现。(2)Visitor的子类必须实现Element的所有子类方法。

2023-09-09 21:08:55 302

原创 设计模式之命令模式(Command)的C++实现

命令设计模式(Command)的C++代码实现。在软件开发过程中,“行为请求者”和“行为实现者”通常呈现一种“紧耦合”。如果行为的实现经常变化,则不利于代码的维护。命令模式可以将行为的请求者和行为的实现者进行解耦。具体流程是将行为请求者封装成一个对象,将行为实现者抽象成一个类。

2023-08-27 17:46:43 1880

原创 设计模式之职责链模式(ChainOfResponsibility)的C++实现

职责链模式(ChainOfResponsibility)的C++代码实现。在软件开发过程中,发送者经常发送一个数据请求给特定的接收者对象,让其对请求数据进行处理(一个数据请求只能有一个对象对其处理)。职责链模式的处理流程是:设计一个职责链处理基类,该类具有指向下一个待处理类的变量,通过set接口设置下一个待处理的链对象成员;该类具有遍历处理请求的功能,遍历过程中,只要有一个对象处理了请求,则停止遍历;该基类抽象了2个接口分别为:判断是否处理该类型请求和处理消息的功能接口。其他的具体职责链类继承并实现职责链

2023-08-22 22:57:54 777 1

原创 设计模式之迭代器模式(Iterator)的C++实现

迭代器模式(Iterator)的C++实现,泛型编程实现迭代器的C++实现。在软件开发过程中,操作的集合对象内部结构常常变化,在访问这些对象元素的同时,也要保证对象内部的封装性。迭代器模式提供了一种利用面向对象的遍历方法来遍历对象元素。迭代器模式通过抽象一个迭代器类,不同的对象继承自迭代器类,外部通过统一接口访问元素。面向对象实现的迭代器模式是在程序运行时,通过虚函数去操作对象元素;相比于C++中的泛型编程实现迭代器的运行性能较低(泛型编程是在编译时已确定访问的元素),所以建议使用泛型编程实现迭代器。

2023-08-20 18:17:47 1167

原创 设计模式之组合模式(Composite)的C++实现

组合模式(Composite)的C++代码实现。在软件开发过程中,使用者Client过多依赖所操作对象内部的实现结构,如果对象内部的实现结构频繁发生变化,则使用者的代码结构将要频繁地修改,不利于代码地维护和扩展性;组合模式可以使用者代码与复杂地操作对象结构进行解耦,根据操作对象的实现结构抽象出一个的基类,让操作对象内部根据需求变化实现复杂数据地操作接口,则使用者使用操作对象提供的统一接口就可完成功能。

2023-08-20 13:30:38 681

原创 设计模式之备忘录模式(Memento)的C++实现

备忘录模式(Memento)的C++代码实现。在软件功能开发过程中,某些对象的状态在转换过程中,由于业务场景需要,要求对象能够回溯到对象之前某个点的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节。备忘录模式是在不破坏对象封装性的前提下,增加一个备忘录类,用于保存捕获对象的内部状态。当该对象需要回溯到之前状态时,只需调用备忘录接口获取之前的状态,并设置状态。

2023-08-19 22:01:29 956

原创 设计模式之状态模式(State)的C++实现

状态模式(State)的C++代码实现。在开发过程中,某些对象的状态经常面临变化,不同的状态,其对象的操作行为不同。比如根据状态写的if else条件情况,且这种条件变化是经常变化的,这样的代码不易维护。可以使用状态模式解决这类问题。状态模式是将状态值抽象成一个基类,将不同状态下的操作,封装成基类中的虚函数,使用者可以依赖抽象的基类来进行功能开发。

2023-08-19 14:51:36 935

原创 设计模式之中介者模式(Mediator)的C++实现

中介者模式(Mediator)的C++代码实现在软件组件开发过程中,如果存在多个对象,且这些对象之间存在的相互交互的情况不是一一对应的情况,这种功能组件间的对象引用关系比较复杂,耦合度较高。如果有一些新的需求变化,则不易扩展。中介者模式使用一个“中介对象”去管理对象间的关联关系,这个中介对象里面定义了对象间的数据统一交互接口,解耦对象间的直接交互依赖,从而提高代码的扩展性。

2023-08-18 19:23:06 822

原创 设计模式之适配器模式(Adapter)的C++实现

适配器模式(Adapter)的C++代码实现。由于使用环境的改变,之前一些类的旧接口放在新环境的功能模块中不再适用。适配器可以解决此类问题。适配器模式:通过增加一个适配器类,在适配器接口中做一些适配操作,将旧模块类转换成使用者Client类期望的接口。

2023-08-18 15:53:25 1416

原创 设计模式之代理模式(Proxy)的C++实现

代理模式(Proxy)的C++实现。在组件的开发过程中,有些对象由于某种原因(比如对象创建的开销很大,或者对象的一些操作需要做安全控制,或者需要进程外的访问等),会使Client使用者在操作这类对象时可能会存在问题:(1)使用者直接访问这种对象会使系统带来很多麻烦。(2)或者使用者使不能直接访问这类对象;使用代理模式就可以解决此类问题。有一个主题类,该类具有请求功能和数据转换功能。而Client使用者不能直接访问和操作它,只能间接的通过其它类进行访问操作。3、代理模式的代码实现。

2023-08-18 12:52:24 1208

原创 设计模式之门面模式(Facade)的C++实现

门面模式(Facade)的C++实现。在组件的开发过程中,某些接口之间的依赖是比较紧密的,如果某个接口发生变化,其他的接口也会跟着发生变化,这样的代码违背了代码的设计原则。门面设计模式是在外部客户程序和系统程序之间添加了一层中间接口,使依赖的接口之间相互解耦。有3个公司,每个公司都有自己的工作流方式;客户端代码使用这3个公司的工作流。3、门面模式代码实现。

2023-08-17 22:28:50 671

原创 设计模式之享元模式(Flyweight)的C++代码实现

面向对象很好地解决了抽象问题,但是创建对象会带来一定的内存开销。绝大部分情况下,创建对象带来的内存开销是可以忽略不计的;在有些情况下是需要谨慎处理的,如类A的sizeof是50个字节,则创建50*1024*100个A对象,则对象的内存大小约为5MB,这个是很占用内存的。享元模式就是使用运用共享技术支持创建大量的对象情况,并同时减少内存开销。有3种类型产品,这几种类型产品的形状和大小各不相同;现有1000个产品(3种类型),分别输出这些产品的类型和大小。

2023-08-17 12:42:55 90

原创 设计模式之构建器(Builder)C++实现

构建器模式的C++代码实现。在软件功能开发中,有时面临“一个复杂对象”的创建工作,该对象的每个功能接口由于需求的变化,会使每个功能接口发生变化,但是该对象使用每个功能实现一个接口的流程是稳定的。构建器就是解决该类现象的。构建就是定义一个抽象类,然后将变化的每个功能接口定义为虚函数,稳定的流程定义为函数接口;其他有变化的类继承该抽象类。有一个产品需要经过设计、制作、包括、出售这几个步骤,才可以完成整个功能。每个产品都会有这几个步骤,但每个产品对应的具体细节是不一样的。

2023-08-16 21:44:38 588

原创 设计模式之原型模式Prototype的C++实现

设计模型之原型模式C++代码实现。在软件功能设计中,经常面临着“某些结构复杂的对象”的创建工作,且创建的对象想拥有其他对象在某一刻的状态,则可以使用原型模型。原型模型是通过拷贝构造函数来创建对象,并且该对象拥有其他对象在某一刻的状态。上面代码main函数中的创建方式根据实际情况选择,如果想隔离new,则使用方式1。原型模式的优点是将创建对象(该新创建的对象具有其他对象的状态,但与其他对象的地址区域是相互独立的)变得比较简洁。设计产品A,B,这个产品有重量和单价,输出产品的价格。3、原型模式代码实现。

2023-08-16 18:56:41 690

原创 设计模式之抽象工厂模式的C++代码实现

抽象工厂方法模式C++实现。在软件功能设计中,经常面临着“一系列相互依赖的对象”的创建工作,同时,由于需求的变化,这些相互依赖的对象会有更多子类的创建功能。抽象工厂模式主要是解决“一系列对象对象的创建工作,且这些对象有相互依赖或者作用的关系”。抽象工厂模式可以将一系列的变化对象分别创建对应的抽象基类,然后将这些有相互作用的抽象基类的对象创建集成到一个工厂类中。抽象工厂方法模式是将有相互依赖的创建工厂集中到一个工厂类中创建,即工厂方法集的类接口。抽象工厂方法模式实现。

2023-08-15 22:15:26 129

原创 设计模式之Bridge模式的C++实现

Bridge模式的C++实现。类实现的功能具有两个变化的维度,甚至由多个维度的变化。Bridge模式使用“对象间的组合关系”解耦抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度变化,即将不同的维度分别进行抽象,然后各自根据变化维度进行继承。Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类甚至由多个变化的维护,这时使用Bridge模式的扩展模式来进行设计代码。

2023-08-09 22:38:11 729

原创 linux下性能分析工具Perf安装与用法

perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。它由一个叫“Performance counters“的内核子系统实现,基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析,可用于性能瓶颈的查找与热点代码的定位。Perf介绍于火焰图分类。火焰图安装命令(1)安装Perf工具(2)下载可视化工具FlameGraph 。火焰图demo测试(1)生成CPU火焰图1(2)火焰图表解析(3)生成差分火焰图步骤。

2023-08-04 22:06:38 2792

原创 C++信号量与共享内存实现进程间通信

C++信号量与共享内存实现进程间通信。

2023-07-28 17:46:08 350

原创 信号量SytemV与Posix信号量的介绍与用法

信号量是一种计数器,用在多进程、多线程的共享资源访问控制上面,防止多进程、多线程对共享资源的同时读写。信号量种类有SystemV信号量和Posix信号量。信号量SystemV是Linux操作系统的内核对象,由内核同一管理,它的生命周期不依赖创建的进程,即使进程退出,信号量依然存在。信号量SystemV常用于多进程间的同步。最简单的信号信号量是只能取0和1的变量,也叫做二进制信号量,可以去多个正数的信号量被称为通用信号量,本文主要讲解二进制信号量。

2023-07-26 23:24:08 222

原创 C++ 创建共享内存

共享内存用于实现进程间大量的数据传输,共享内存是在内存中单独开辟一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限、大小和最近访问时间等。返回值:(1)成功,返回共享内存标识符(2)出错,返回-1,错误原因存于errno中。shmflag: 指定共享内存的访问权限和映射条件,一般设置为0,即读写权限。返回值:成功:0,出错:-1,错误原因存在于errno中。返回值:成功:0,出错:-1,错误原因存在于errno中。参数:shmaddr:指定共享内存的映射地址。作用:共享内存的内存管理。

2023-07-16 19:12:29 2092 1

原创 进程间通信方式介绍

进程间通信方式介绍:(1)管道 (2)命名管道 (3)信号(4)消息队列 (5)信号量 (6)共享内存 :共享内存就是映射一段能被其他进程访问的一块内存,该块内存由一个进程创建,多个进程访问。共享内存是进程间通信最快的进程通信方式。共享内存常跟信号量配合,来实现进程间的数据同步。(7)套接字 :套接字与其他通信机制最大的不同就是可用于不同设备间、不同系统间的进程通信。

2023-07-16 11:48:55 300

原创 C++ 可变参数函数用法与template模板泛型编程

C++ 可变参数函数与template模板用法。a> 在宏函数中使用可变参数,可以重定义输出打印函数。b> 在普通函数使用可变参数,可以适配不同的参数个数。c> 在线程池的任务队列中使用可变参数,可以适配不同的参数的线程任务函数。模板template泛型编程。

2023-07-15 16:56:24 277

原创 C++ 中chrono与gettimeofday获取时间与计算程序运行时间

C++计算程序运行时间。gettimeofday获取时间与计算程序运行时间。std::chrono::steady_clock获取时间与计算程序运行时间。秒与毫秒、微妙、纳秒的关系。

2023-07-15 15:31:20 926

原创 C++中空类、包含非静态成员类、包含静态成员类与包含虚函数类的sizeof字节计算与虚函数表指针介绍

C++中空类、包含非静态成员类、包含静态成员类与包含虚函数类的sizeof字节计算与虚函数表指针介绍。1、计算空类 2、包含非静态成员变量类 3、包含静态成员变量类4、包含普通成员函数类 5、包含虚函数类 6、继承虚函数类7、多重继承类 8、虚函数表。 只要基类有虚函数,子类不论实现或没实现,都有虚函数表。子类不会和父类共用一个虚函数表,每个类都会有一个虚函数表。

2023-07-10 08:09:47 345

原创 装饰模式Decorator介绍与C++实现

装饰模式Decorator介绍与C++代码实现。在软件设计中,如果类的责任划分不清晰,随着需求的增加,过度的使用继承扩展对象的功能,会使得子类极具膨胀,同时充斥者重复代码。装饰模式的目的并非解决“多子类衍生的多继承”问题,装饰模式应用的要点在于解决“主体类在多个方向上的扩展功能”------是为装饰的含义。

2023-06-24 17:35:00 91

原创 策略模式Strategy介绍与C++实现

策略模式的介绍和C++实现。定义一系列算法,将它们一个一个都封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定结构)而变化(扩展--->子类化)。即:使用算法的客户程序流程不会随着算法需求的变化而变化,对于算法需求的变化可以在子类中进行适配。(1)策略模式提供了条件判断语句if/switch的另一种实现方法,可以实现多个算法之间的解耦。注意:如果if、switch的条件类型是固定的,不会再扩展的话(eg:if的判断只有5种情况,不会再出现其他情况),则不使用策略类型。

2023-06-23 18:06:31 454

原创 单例模式C++实现和观察者模式C++实现

1、单例模式介绍 2、单例代码C++实现 3、观察者模式介绍 4、观察者模式C++代码实现单例实现3种方式(1)懒汉式。(使用时进行实例化。存在线程安全问题)(2)静态局部变量。(使用时进行实例化。不存在线程安全问题)(3)饿汉式。(单例类创建的时候进行实例化。不存在线程安全问题)。static静态成员变量,static类成员变量,static静态成员函数介绍和用法。

2023-06-04 18:26:50 765

原创 设计模式之-模板方法模式C++实现与C++模板template用法

设计模式之-模板方法模式C++实现与C++模板使用。模板方法模式使用比较常见,也比较简单,模板方法模式是属于设计模式中的行为设计模式。行为设计模式是关注对象的行为或者交互方面的内容,主要涉及算法和对象之间的职责分配。

2023-06-04 10:42:06 549

原创 简单工厂模式与工厂方法模式的C++代码实现

创建型模型设计介绍1、简单工厂模式C++代码实现2、工厂方法模式C++代码实现3、简单工厂模式与工厂方法模式的简单比较

2023-05-31 23:27:00 223

原创 C++设计模式介绍、分类与设计模式原则

一、设计模式定义二、设计模式的优点三、设计模式缺点四、设计模式中的抽象思维五、抽象的方法六、设计模式应用场景七、设计模式分类八、设计模式八大原则附加知识(1)C++面向对象三种访问修饰符(2)父类析构函数必须为虚函数(3)override关键字使用(4)final关键字使用(5)父类对象可以与子类对象相互转化吗(6)虚函数、虚函数表介绍

2023-05-24 21:48:09 1582 1

原创 C++线程池介绍和C++代码实现

C++线程池的介绍和使用场景,C++线程池demo实现。

2023-05-24 15:40:46 1376

CMake中一个工程依赖另一个工程生成的动态库demo

project1生成动态库,project2工程中引用porject1中生成的动态库。

2023-10-29

linux下tcp的服务端和客户端代码,一个服务器对应多个客户端 (多线程和select方式创建服务端)

linux下tcp的服务端和客户端代码,一个服务器对应多个客户端。 服务端程序对应多个客户端的创建方式有两种,如下: 1、每一个客户端创建一个线程。 2、使用IO多路复用的select方式来应对多个客户端。 程序启动命令如下: 服务器启动命令:$ ./server 37777 客户端启动命令:$ ./client 127.0.0.1 37777

2023-08-30

OpenglES离屏渲染 C++ demo

该资源使用OpenglES绘制了一个三角形,然后利用帧缓冲将数据读取到buffer,最后使用opencv将数据保存为jpg图片。代码在linux下编写,使用CMake编译。

2023-03-18

opengl加载obj模型

加载obj模型

2023-03-12

VSCode中配置ros环境

在CMakelists中配置最ros环境的demo,注释中带#ROS的为添加的配置,其实只有2部分: (1)查找头文件和库。 (2)添加ROS的静态库

2022-12-07

VScode配置C++工程

VSCode中配置C++,涉及三个文件c_cpp_properties.json,launch.json,tasks.json

2022-12-07

CMakeList配置文件介绍

CMakeList配置文件介绍:里面有3种配置方式, 1:在当前目录下,编译本目录的CMakeLists.txt,生成Makefile和其他文件,执行 (1)$cmake . (2) $make (3)$./main 2:将编译输出文件与源文件放到不同目录中,执行命令: $mkdir build $cd build $cmake .. $make $./main 3:工程多个CMakelists,makelist编译嵌套

2022-12-07

VS2017番茄助手Visual Assist 10.9 Setup2270下载

支持VS2017、2015、2013、2010、2008版本。 步骤: 1、若之前VS2017上已安装番茄助手,请卸载,卸载步骤:打开VS2017->工具->扩展和更新->卸载。点击后,关闭VS2017软件,卸载完成。 2、双击下载的VA_X_Setup2270.exe,安装完成。 3、用VA_X.dll替换电脑中的VA_X.dll文件。 注:VS更高版本是否支持,没有试过。

2022-08-07

基于TCP的服务端和客户端软件

tcp的服务端和客户端,待完善

2022-05-06

RegisterTable.rar

demo为VS2017程序,C++往注册表中写数据读数据,windows程序。

2021-10-05

QtSocket.rar

Qt Socket存在不能一次接收到完整数据的问题,需多次拼接数据;若是复杂的场景,需要较好的处理数据方法,才可接收到完整的数据。本方法可以较好的提取出完整的数据。

2021-05-06

EasyBCD.rar

在windows7系统下,可以使用EasyBCD软件进行引导,进入Ubuntu系统。此资源无需安装EasyBCD,直接使用。

2019-06-30

MFC启动画面(VS2010,无对话框边框,只显示启动图片)

C++,无对话框边框,只显示启动图片,真正的启动动画,值得参考。

2017-08-15

MFC基于对话框的启动画面(只显示启动图片无对话框边框)

本程序使用利用延时关闭启动画面,启动画面没有边框,做到只显示启动图片,真正的启动画面。

2017-08-14

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

TA关注的人

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