自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 C++11 atomic

atomic是在多线程编程中经常使用的一个类。使用的时候需要包含<atomic>文件。atomicatomic内部封装一个值,并保证对该值的访问的互斥性。可以用来进行线程同步。使用非常方便。说白了就是atomic内部保存的值是线程安全的,不用担心多线程访问时的同步问题。也就是说保证对内部值的读取和保存的操作的原子性。atomic是个模板类,可以保存的常用的值的类型(这些类型在at...

2019-02-05 17:13:43 1718

原创 C++11 condition_variable

condition_variable也是在多线程编程中经常用到的一个类。使用的时候需要包含头文件<condition_variable>condition_variablecondition_variable对象能使调用线程阻塞,直到被notify去唤醒。这个性质经常在多线程编程中使用,因为在多线程编程中经常遇到一个线程需要等待某个条件然后继续执行的情况。一般使用unique_l...

2019-02-05 14:39:49 1126

原创 c++11 mutex

mutex是多线程编程时经常用到的,在C++11中需要包含<mutex>模块。而在该文件中还有其他和mutex协作的类和函数,使得多线程编程时非常方便。1 mutex类mutex对象是一个lockable的对象,当关键区域需要被互斥访问的时候被用来当作信号。mutex对象提供互斥的拥有权限,并且不支持递归。实际就是mutex是用来进行线程同步的。常用的成员函数有lock()和un...

2019-02-04 23:10:48 3103 3

原创 C++11 thread

std::thread是C++11中提供多线程编程模块。使用时需要包含<thread>头文件。简单说一下thread的用法1 构造函数构造函数是构造thread对象的,thread只是一个管理线程的类,并不是所有的thread对象都绑定一个实际的可执行的线程。也就是说有的thread对象并没有创建一个可执行的线程。构造函数函数default(1)threa...

2019-02-04 14:08:41 1303

原创 C++11实现线程池

1 线程池是什么?在多任务并发执行的时候往往需要开启很多线程来执行。而一个线程的创建和销毁是需要消耗一部分计算机资源的,而如果一个线程执行任务的资源消耗和创建一个线程的消耗差不多的情况下,那简直太浪费资源了。所以如果有已经创建好的一堆线程等着执行任务,有任务来了,调用一个线程去执行就可以了,不用重新创建一个线程。这样可以省去很多资源消耗。而线程池就是创建了若干个等待执行任务的线程的容器。线程池...

2019-02-04 00:46:01 324

原创 markdown公式符号大全

上下标算式markdowna0,aprea_0, a_{pre}a0​,apre​a_0, a_{pre}a0,a[0]a^0, a^{[0]}a0,a[0]a^0, a^{[0]}括号算式markdown(, )(, )[, ][, ]⟨,⟩\lang, \rang⟨,⟩\lang, \rang 或 \langle, ...

2018-12-22 13:37:36 6848 4

原创 Linux中文件权限和修改

如下是Linux中常见的文件与其属性:-rw-r--r-- 1 root root 1864 May 4 18:01 initial-setup-ks.cfg共有7个字段,每个字段意思如下表:-rw-r–r--1rootroot1864May 4 18:01initial-setup-ks.cfg文件权限文件连接数文件拥有者文件所属群组文件容量文件最...

2018-11-27 23:01:42 849

原创 设计模式之类之间的关系和六大原则

设计模式之类之间的关系和六大原则1 类之间的关系1.1 继承关系1.2 实现关系1.3 依赖关系1.4 关联关系1.5 聚合关系1.6 组合关系1.7 总结2 六大原则2.1 单一职责原则2.2 开放-封闭原则2.3 依赖倒转原则2.4 里氏代换原则2.5 接口隔离原则2.6 迪米特法则3 各种设计模式1 类之间的关系类与类之间的关系大概有6种,要看懂UML图,首先需要了解这几种关系。1.1...

2018-10-27 08:46:17 2381 1

原创 设计模式之中介者模式(C++)

设计模式之中介者模式中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。该模式很好理解,其UML图如下:Mediator中每个交互者的引用,在Mediator内部封装了各种类之间的交互。至于那个类和那个类交合则有具体的需求来决定。示例代码如下:// MediatorModel.h文件#pragma on...

2018-10-27 08:33:39 446

原创 设计模式之享元模式(C++)

设计模式之享元模式享元模式,运用共享技术有效地支持大量细粒度的对象。面向对象技术可以很好地解决一些灵活性或扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正式为了解决这依赖问题而诞生的。享元模式通过共享技术实现相同或相似对象的重用,示意图如下(我们可以公用一个Hello world对象,其中字符串“Hello world...

2018-10-27 08:33:34 122

原创 设计模式之解释器模式(C++)

设计模式之解释器模式解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就只得将该问题的各个示例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。其UML图如下:在解释器模式中每一种表达式对应一种表达式解释类,比如Termi...

2018-10-27 08:33:23 543

原创 设计模式之访问者模式(C++)

设计模式之访问者模式访问者模式,表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间耦合解脱开,使得操作几何可以相对自由地演化。访问者模式的目的使要把处理从数据结构中分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的...

2018-10-27 08:33:16 242

原创 设计模式之责任链模式(C++)

设计模式之责任链模式责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。该模式很好理解,其UML图如下:每个ConcreteHandler都有一定的请求处理能力,当自己处理不了的时候就把请求转移给自己的后继者。所以每个ConcreteHandler都有一个Handler的引用。示例代码如下...

2018-10-26 08:13:55 240

原创 设计模式之命令模式(C++)

设计模式之命令模式命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。其UML类图如下:该模式主要是为了隔离请求和实际执行者之间解除。就是解耦和,所有的请求统一有一个类负责,而该类负责管理这些请求(添加请求、撤销请求之类的)。上图种Invoker负责接受和管理各种命令。然后有Invoker统一像Receiver发起请求。...

2018-10-26 08:13:31 1682 1

原创 设计模式之桥接模式(C++)

设计模式之桥接模式桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里说的实现分离,并不是说然抽象类与派生类分离,这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。其UML图如下:结合上图理解一下其定义。抽象部分指的是Abstraction或者RefinedAbstraction。实现部分指的是Implementor。以为抽象部分得实现有多种变化,为了减少耦合,...

2018-10-26 08:13:18 1179

原创 设计模式之单例模式(C++)

设计模式之单例模式保证一个类仅有一个实例,并提供一个访问他的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且可以提供一个访问该实例的接口。其UML图如下:其示例代码如下:// SingeltonModel.h文件#pragma once// 线程不安全类...

2018-10-26 08:12:58 1659

原创 设计模式之组合模式(C++)

设计模式之组合模式组合模式,将对象组合成属性结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。其UML图如下:一个组织有很多子组织,而无论子组织是单独一个部门或是一个分组织。该组织都希望把它们当成一样的子组织来管理。举个例子吧,就拿公司来说吧,一个公司总部为了方便管理希望把分公司当成一个部门来管理就行了。比如公司要发奖金了,总公司只用通知自己的所有部门...

2018-10-26 08:12:49 1626 1

原创 设计模式之备忘录模式(C++)

设计模式之备忘录模式备忘录,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。该模式很好理解,其UML图如下:在Originator中提供了创建Memento的接口,具体要保存什么样的内容,则根据需求来定。而Caretaker则是负责管理Memento。而保存的内容的具体的组织方式什么的都封装在Memento中了。这样做耦合...

2018-10-26 08:12:40 168

原创 设计模式之适配器模式(C++)

设计模式之适配器模式适配器模式,将一个类的借口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要解决的是数据和行为都正确,但接口不符合的情况。该模式很好理解,其UML图如下:示例代码如下:// AdapterModel.h文件#pragma once#include <iostream>class Ta...

2018-10-26 08:12:30 120

原创 设计模式之状态模式(C++)

设计模式之状态模式状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了类本身。状态模式主要解决的时当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。其UML图如下:在以上UML图中,Context中有一个状态的引用(C++中是指针),当该状态发生变化时,Context中的状态不同,响应的操...

2018-10-26 08:12:21 694

原创 设计模式之迭代器模式(C++)

设计模式之迭代器模式迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象的内部表示。该模式很好理解,C++中的迭代器应该都用过,和那个差不多。其UML图如下:ConcreteIterator内部有一个聚合对象的引用(指针),而ConcreteAggregate依赖于ConcreteIterator。以前向链表为例,示例代码如下:// IteratorModel.h文件#...

2018-10-26 08:11:36 122

原创 设计模式之抽象工厂模式(C++)

设计模式之抽象工厂模式抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。其UML图如下:结合上图我们来理解一下抽象工厂模式的定义。提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类。在上图中一系列相互依赖或相关的对象可以理解为ProductA,ProductB,也可以有ProductC、ProductD等,这些是一系列类,要创建这一系列对象。而...

2018-10-26 08:11:20 2904 1

原创 设计模式之观察者模式(C++)

设计模式之观察者模式观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。其UML图如下:在ConcretSubject内部有一个Observer的列表,当Subject的状态发生改变时,会通知列表内的所有的观察者。而观察者都实现了统一的接口,而不同的观察者在该接口中做出了不同的响应。其示例代码如...

2018-10-25 15:41:30 371

原创 设计模式之建造者模式(C++)

设计模式之建造者模式建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。其UML图如下:简单理解就是Builder中定义了创建Product各个部分的接口。ConcreteBuilder中具体实现了创建Product中的各个部分的接口,就是具体的建造者。Director是根据用户的需求构建Product的(具体怎么构建,怎么把Product中的各个部件构建...

2018-10-25 15:38:57 110

原创 设计模式之外观模式(C++)

设计模式之外观模式外观模式主要是为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得该子系统更加容易使用。说白了就是一堆系统或类实现了些复杂的功能,然后为了方便使用,又新建了一个类把这些类实现的功能封装起来了。该模式不难理解。其UML图如下:在Facade类提供了一堆调用该子系统功能得接口。而该接口内部具体怎么实现是根据需求来得。其示例代码如下:// Facade...

2018-10-25 15:36:30 113

原创 设计模式之模板方法模式(C++)

设计模式之模板方法模式模板方法模式,定义一个操作中的算法的股价,而将一些步骤延迟到了子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。说白了就是有一个算法有很多部分,这个算法在基类中已经定义好了。而算法中的各个部分都写成各个成员函数了。然后在子类中可以覆盖这些成员函数,从而实现不同的算法。其UML图如下:在AbstractClass中有个TemplateMet...

2018-10-25 15:34:36 426

原创 设计模式之原型模式(C++)

设计模式之原型模式原型模式是用原型实例指定创建兑现的种类,并且通过拷贝这些原型创建新的对象。原型模式说白了其实就是有一个把自己拷贝一下的方法。该模式很好理解,该模式独特地方不是类与类之间的关系,更多的是从语义上理解,只是实现了一个接口而已。其UML图如下:示例代码如下:// PrototypeModel.h文件#pragma once#include <iostream>...

2018-10-25 15:32:51 708

原创 设计模式之工厂方法模式(C++)

设计模式之工厂方法模式工厂方法模式,定义一个用于创建对象的接口,让子类决定实力化哪一个类。工厂方法使一个类的实例化延迟到其子类。其UML图如下:这里要区分一下工厂方法模式与简单工厂模式的区别。简单工厂模式需要在工厂类中判断要生产什么类型的对象。工厂方法模式则把这部分工作交给了客户端。每一种类对象都有自己的工厂,客户端根据自己的不同需要生成不同工厂,然后在生产自己需要的对象。工厂方法模式相对简...

2018-10-25 15:27:20 132

原创 设计模式之装饰模式(C++)

设计模式之装饰模式装饰模式,动态地给一个对象添加一些额外的职责(不一定重要的功能,只是偶然一次执行),就增加功能来说,装饰模式比生成子类更为灵活。其UML图如下:ConcreteComponent定义了一个具体的对象,ConcreteDecorator类是用来装饰ConcreteComponent的。在Decorator类内由一个Component的引用实际是指向ConcreteCompon...

2018-10-25 15:20:58 130

原创 设计模式之策略模式(C++)

设计模式之策略模式策略模式定义算法家族,分别封装。它们之间可以相互替换,让算法变化,不会影响到用户。优点:适合类中的成员方法为主,算法经常变动;简单了单元测试(因为每个算法都有自己的类,可以通过自己的接口单独测试)。缺点:客户端需要做出判断。其UML图如下:策略模式和简单工厂模式非常相似。具体来讲有个细微的区别就是,简单工厂模式需要根据传递过来的条件判断创建什么样的对象。而策略模式是直接传...

2018-10-25 15:17:24 162 1

原创 设计模式之简单工厂模式(C++)

设计模式之简单工厂模式(C++)简单工厂模式,主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。优点:适用于不同情况创建不同的类时。缺点:客户端必须要知道基类和工厂类,耦合性差。需要根据不同的需求创建不同的类。添加类的时候需要更爱工厂类。以四则运算为例,其UML图如下:在客户端中给简单工...

2018-10-25 15:13:24 633

原创 数据结构(排序,冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序,C++)

冒泡排序冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,知道没有反序的记录为止。冒泡排序是一种比较简单的排序方法,实现代码如下:// 交换两个下标所指的值template<typename T>void swap(T *ptr, int i, int j){ T temp = ptr[i]; ...

2018-07-24 19:44:11 137

原创 数据结构(树,二叉搜索树,平衡二叉树 C++实现)

树树(Tree)是n(n>=0)个结点的有限集合。n = 0时称为空树。在任意一颗非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n > 1时,其余结点可分为m (m > 0)个互不相交的有限集 T1T1T_1 、 T2T2T_2 、 …… 、 TmTmT_m ,其中每一个集合本身又是一个树,并且称为根的子树(SubTree),如下图所示:树的结点...

2018-07-22 16:31:22 1172

原创 数据结构(list、vector、queue、stack C++实现)

最近在复习数据结构的内容,模仿了stl中的list、vector、queue和stack.当然是精简版的了,只写了最基本的功能。这里要注意一点,模板类的类声明和定义要在同一个文件内,最好是在头文件内。因为模板类和模板函数在使用的时候才会被实例化,所以编译器需要知道所有的实现代码,然后去实例化各种数据类型的类或者函数。所以如果把类定义放在单独的源文件中的话,编译器找不到相关定义。list...

2018-07-05 11:47:19 519

原创 OpenCV直方图(直方图、直方图均衡,直方图匹配,原理、实现)

1 直方图灰度级范围为 [0,L−1][0,L−1][0,L-1] 的数字图像的直方图是离散函数 h(rk)=nkh(rk)=nkh(r_k) = n_k , 其中 rkrkr_k 是第kkk级灰度值,nknkn_k 是图像中灰度为 rkrkr_k 的像素个数。在实践中,经常用乘积 MNMNMN 表示的图像像素的总数除它的每个分量来归一化直方图,通常 MMM 和 NNN 是图像的行和列的位数。...

2018-06-21 14:32:34 2183

原创 MFC:树形控件

api解释 函数名称 功能 CTreeCtrlDlg(CWnd* pParent = NULL); 构造函数 void InitTreeFile(); 初始化树形控件,如果复制或用其他对象初始化时需要调用 BOOL SetTreeRoot(const CString strPath); 设置根目录 void SetUnwantedStr...

2018-06-15 21:55:48 921

原创 网站搭建:从0到1搭建网站

1 网站基本概念网站说白了就是把一些东西放到哪里供其他人访问,并提供了一些可以交互的接口的地方。如果要实现这样一个地方首先,需要一个能放东西的地方这就是服务器。其次,我们要找到这个地方,然而有很多这样的地方,所以我们就需要给很多这样的地方标号,然后按照标号来找到这些地方,并访问。所以就有了IP地址,每个服务器都有一个唯一的IP地址,这样我们可以通过IP地址找到服务器。最后,IP地址都是一堆数字...

2018-06-01 21:27:40 18180 9

原创 C++类中的一些细节(重载、重写、覆盖、隐藏,构造函数、析构函数、拷贝构造函数、赋值函数在继承时的一些问题)

1 函数的重载、重写(重定义)、函数覆盖及隐藏其实函数重载与函数重写、函数覆盖和函数隐藏不是一个层面上的概念。前者是同一个类内,或者同一个函数作用域内,同名不同参数列表的函数之间的关系。而后三者是基类和派生类函数不同情况下的关系。1.1 函数重载正如上文说的函数的重载是指类内部,同名不同参数列表函数之间的关系。如下:void show();void show(int);void...

2018-05-26 17:28:16 1625 1

原创 串口使用和CSerial类

1 串口通信的基本原理串口通信中无论是写入串口还是读取串口,都是对缓冲区操作的。可以理解为写串口就是向输出缓冲区写入内容,读取串口就是从输入串口缓冲区读取内容。但是何时打开串口,何时发送数据,何时接受数据都是未知的。所以在串口通信时一般是一个主动一个被动。通信双方有一定的协议,就是事先协商好的数据格式。接收方接收到数据后,返回一个应答标志,告诉发送方已经接收到数据了。如果接收错误则返回接收错误...

2018-05-25 09:31:50 3117 6

原创 C++中类中常规变量、const、static、static const(const static)成员变量的声明和初始化

C++类有几种类型的数据成员:普通类型、常量(const)、静态(static)、静态常量(static const)。这里分别探讨以下他们在C++11之前和之后的初始化方式。c++11之前版本的初始化在C++11之前常规的数据成员变量只能在构造函数里和初始化列表里进行初始化。const类型的成员变量只能在初始化列表里并且必须在这里进行初始化。static类型只能在类外进行初始化。st...

2018-05-24 14:14:32 621

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