自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 问答 (1)
  • 收藏
  • 关注

原创 弄懂#if #ifdef #if defined

弄懂条件编译#if #ifdef 和#if defined

2022-08-02 15:44:31 2868 1

原创 设计模式总结一

目录设计模式总结过去我已经介绍了9种设计模式,下面对过往介绍的设计模式做一个复盘,力求用简洁的话描述每一设计模式并会给出模式结构。设计模式组件协作:设计模式之模板方法模式(Template Method)设计模式之策略模式(Strategy)设计模式之观察者模式(Observer)单一职责:设计模式之装饰模式(Decorator)设计模式之桥模式(Bridge)对象创建:设计模式之工厂模式(Factor Method)设计模式之抽象工厂模式(Abstract F

2022-06-06 12:00:00 302

原创 设计模式之Builder(建造者、构造者)模式

目录1.Builder模式解决的场景2.Builder模式2.1流式接口的builder1.Builder模式解决的场景将一个复杂对象构建和它的表示相分离,使得同样的构造过程可以创建出不同的对象。对象构建是指得到一个类对象它的表示我的理解就是初始化类对象的数据成员2.Builder模式2.1流式接口的builderBuilder 模式并非必须得要采用流式接口,但是这是一种典型的实现方法。对于 Builder 模式来说,一个重要的标志,尽管这并不是规定但却往往约定俗成,就是以一个 .bu

2022-05-19 12:00:00 558

原创 设计模式之抽象原型模式(Prototype)

目录前言Prototype设计模式1.模式动机2.示例13.模式定义4.模式结构5.深拷贝与浅拷贝6.模式总结前言在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下。所以老师讲解是按照这种顺序讲解。对象创建:通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。Prototype设计模式1.模式动机代替直接new的方式创建一个对象,并且创建的这个对

2022-05-11 12:00:00 265

原创 设计模式之抽象工厂模式(Abstract Factory)

目录前言Abstract Factory设计模式1.模式的应对场景2.案例1:数据库的connection、command依赖3.案例前言在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下。所以老师讲解是按照这种顺序讲解。对象创建:Abstract Factory设计模式1.模式的应对场景和工厂模式不同,它解决的是单一的对象创建工作。抽象工厂模式解决的是“一系列相互依赖的对象”的创建工作。设计模式之工厂模式(Factor Method)2.案

2022-05-09 12:00:00 1126

原创 设计模式之工厂模式(Factor Method)

目录前言Factor Mode1.动机前言Factor Mode1.动机省略…之后加我们以介绍观察者模式时的一个文件分割进度显示的例子为背景,介绍Factor Mode的使用场景。为了能聚焦要介绍的Factor Mode,下面只给出文件分割进度显示的部分代码,并把观察者模式的使用痕迹删除(可以不用去看或理解观察者模式,若想了解,可参考设计模式之观察者模式(Observer))。代码如下:#include <iostream>#include <list>#inclu

2022-05-05 11:41:26 623

原创 设计模式之桥模式(Bridge)

目录前言Bridge设计模式模式动机示例模式定义模式结构前言在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下。所以老师讲解是按照这种顺序讲解。单一职责:Bridge设计模式模式动机由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。所以Bridge模式的动机就是应对“多维度的变化”。看文字描述表枯燥,下面举几个例子:商城系统中的电脑分类:如电脑类型+电脑品牌,这是两个维度的变化。图形形状+颜色填充两种变化的

2022-05-03 12:00:00 1637

原创 设计模式之装饰模式(Decorator)

目录前言前言在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下。所以老师讲解是按照这种顺序讲解。单一职责:

2022-04-30 10:59:43 403

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

目录前言Observer1.使用场合2.示例1:文件分割进度显示3.示例24.GoF给出的模式定义5.模式结构6.要点总结前言在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下。所以老师讲解是按照这种顺序讲解。组件协作:Observer1.使用场合为某些对象建立一种“通知依赖关系”:即一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。场景举例:微信公众号,如果一个用户订阅了某个公众号,那么便会收到公众号发来的

2022-04-28 09:01:23 470

原创 设计模式之策略模式(Strategy)

目录前言Strategy1.使用场合2.案例13.案例2:4.模式定义5.结构6.要点总结前言在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下。所以老师讲解是按照这种顺序讲解。组件协作:Strategy1.使用场合简单说就是,就是可能今天调用"加法";明天可能调用"乘法";后天发现又需要"除法"了,所以代码需要加一个“除法”的算法。这其实就像多重if else的条件选择语句。2.案例1我们可以想想下面一种场景:不同国家有不同的税率,我们

2022-04-22 14:10:06 1064 1

原创 设计模式之模板方法模式(Template Method)

目录前言Template Method使用场合案例一:打开一个文件案例二前言在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下。所以老师讲解是按照这种顺序讲解。Template Method使用场合这里圈出的几个关键字需要着重理解。归纳一下:在一个稳定操作的过程。就是说实现某个功能的步骤固定。在稳定的前提下有变化。就是说虽然步骤固定,但是其中有几步是不确定的,需要以后确定具体做什么。案例一:打开一个文件我们在打开一个文件时,总是会有以下

2022-04-18 12:17:27 374

原创 simulink嵌入式代码生成

目录1.配置模型2.生成符合我们要求的代码和有效的管理数据更好的数据管理我们以下面的模型为例上述模型的功能是:把两个输入相加后乘一个系数,再输出。1.配置模型为了能完成生成嵌入式代码的功能,我们需要对此模型做一些配置。如下面的图:下面这两部是必须的:为了生成代码后可以看到代码,我们可以勾选生成报告(不勾不影响代码生成),如下:2.生成符合我们要求的代码和有效的管理数据做完了第1步的配置,就可以生成代码了。点击下图中的图标或ctrl+B由于我们在第1步中勾选了生成报告,所以会出现

2022-04-07 12:30:41 2315 2

原创 智能指针(shared_ptr、unique_ptr、weak_ptr)的使用

智能指针的使用shared_ptr创建一个智能指针shared_ptr的常用成员函数C++中的智能指针实现是通过一个类来管理实际上的指针,这个类要具备指针的基本操作。shared_ptr创建一个智能指针 std::shared_ptr<int> ptra = std::make_shared<int>(20); std::shared_ptr<int> ptra1(new int(20));二者的区别:前者std::make_shared 一次性为int对

2022-04-05 11:15:25 1497

转载 C++模板的特化(specialization)和偏特化(partial specialization)

C++模板的特化及偏特化类模板全特化:对类中的某个成员函数进行特化处理类模板的偏特化范围偏特化函数模板全特化:函数模板偏特化: 模板函数和模板类有的时候可能需要对传入的不同类型进行不同的处理,比如说有的模板传入int或double类型都可以处理,但是传入char型则会出错,这时就需要模板特化的方式。 类模板全特化:全特化即将模板类型里的所有类型参数全部具体指明之后处理,如下template<typena

2022-04-02 15:03:06 3612 2

原创 C++成员模板

成员模板普通类的成员模板模板类的成员模板成员模板是指类的成员函数是一个模板函数。其中类可以是一个普通的 类或者是一个模板类。普通类的成员模板一个简单的例子如下:#include <iostream>#include <memory>using namespace std;//Function-like classclass Debugdelete{public: //重载(),是一个fuction-like class template <typ

2022-03-29 12:00:30 1557

原创 C++之转换函数(convertion function)

目录一 类转换为其他类型二 double转换为Fraction本文介绍一下C++的转换函数,例子是基于侯捷老师的关于一个分数类的例子,然后加上我自己的一些理解。一 类转换为其他类型类转换为其他类型,这里的其他类型可以是任何类型,如int、double甚至是你定义的一个类,至于怎么写,就是设计的人的事情了。下面我以转换为double型为例,请看下面的例子:#include <iostream>#include <string>using namespace std;

2022-03-13 13:30:44 2532

原创 由常量成员函数引起的问题解决记录

目录写在前面正文开始写在前面最近在学习候捷老师的c++课程时,关于函数模板的话题,侯捷老师给了一个例子,是关于最小值函数模板类型是类的情况。为了深入理解,为此我自己写了个例子,没想到出了点问题,特此记录下问题的解决过程。正文开始先定义一个自己的取最小的函数模板myMin,入下:template<class T>const T& myMin(const T& a, const T& b){ return a < b ? a : b;}再定义一个类

2022-03-10 12:06:38 113

原创 C++友元(friend)解释

目录一.友元函数先看普通函数声明为友元函数:再看类成员函数声明为友元函数:最后说明二.友元类三.完整示例:四.同一个类(class)的类对象(object)互为友元友元是什么,说白了一句话,就是为了不受类的封装性的约束 ,好让我们可以访问类私有数据成员。语法上使用friend关键字。一.友元函数友元函数可以是普通函数或者类成员函数。先看普通函数声明为友元函数:如下所示:#include <iostream>#include <cmath>using namespac

2022-03-07 12:33:17 4981 1

原创 C++类内初始值的初始化形式

C++类内初始值的初始化形式一.不能用圆括号给类内初始值的原因二.=和花括号{}初始化的区别1.内置类型和类类型2.类模板先看初始化列表{}:再看=的初始化过程:==总结:==三.类内初始值的初始化列表{}方式C++11规定,可以为数据成员提供一个类内初始值。创建对象时,类内初始值用于初始化数据成员。像下面这样,cursor和height的类内初始值均为0。class Screen{private: int cursor = 0; int height = 0;};一.不能用圆括号给类内初

2022-01-21 12:21:51 4712

原创 C++之inline的使用

inline的使用一.普通函数inline1.关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。2.把内联函数的定义放在头文件中二.类的成员函数inline类的构造函数,析构函数的inline首先,明白一点:不是你指定函数inline就inline,关键看编译器是否认可。我们使用inline关键字指定inline函数仅仅是向编译器提的请求,编译器完全可以忽略这个请求。其次,inline机制一般用于规模较小(可理解为行数少)、流程直接(可理解

2022-01-17 12:14:42 4379 2

原创 C++之new错误时set_new_handler()函数和nothrow常量

一.C++11下的函数原型new_handler set_new_handler(new_handler new_p) noexcept;​其中,new_handler是一个函数指针,其定义如下 :typedef void (*new_handler)()。所以new_p为形参和返回值均为void的函数名二.使用方法1.一个简单的使用案例如下:#include <iostream>#include <new>using namespace std;void

2022-01-12 12:21:32 573

原创 指针数组与指向数组的指针 数组的引用

指针数组与指向数组的指针 数组的引用一.指针数组与指向数组的指针数组的引用区分数组引用和数组指针一.指针数组与指向数组的指针int arr[10]= {0};//下面定义一个指针数组:int *ptrs[10];//ptrs是含有10个整型指针的数组下面定义一个指向数组的指针:int (*Parray)[10] = &arr;//Parray是指向含有10个整数的数组的指针如何理解与区分二者:首先, 指针数组是一个数组,就像整型数组一样。整型数组的每个元素是整型数据,指针数

2022-01-10 12:12:44 347

原创 this和const成员函数。能const构造函数吗?(C++)

目录this引入总结thisconst成员函数this引入假设我们有这样一个类:class Sales_Data{public: string isbn() const { return BookNo; }private: string BookNo;};定义类对象total:Sales_Data total。那么total.isbn()是如何做到返回total的数据成员BookNo的?​实际上,类的成员函数有一个隐式的参数,这个隐式的参数就是this指针。所以,在类对象调用成员

2021-07-20 11:57:54 632

原创 数据结构之堆——C++实现大顶堆和小顶堆

大小顶堆的实现什么是大顶堆和小顶堆大小顶堆的底层实现代码实现小顶堆定义小顶堆类构造函数插入扩大堆数组容量删除析构函数代码实现大顶堆测试什么是大顶堆和小顶堆堆是一种完全二叉树。完全二叉树的定义:所有节点从上往下,从左往右的依次排列,不能有空位置,是为完全二叉树。下面是完全二叉树和不完全二叉树的示意图:大顶堆定义:父节点都大于左右子节点。小顶堆定于:父节点都小于左右子节点。二者示意图如下:大小顶堆的底层实现一般来说,定义二叉树都是定义一个节点类,节点类中包含本节点的数据元素和两个节点指针,分别

2021-07-07 12:28:18 5369 2

原创 数据结构——详解二叉查找树(BST)的删除操作

注意:此篇文章只是详细介绍文章数据结构——实现一个二叉查找树(BST)实现的二叉树的删除操作,所以一些类的定义并不在本文中。**删除节点分类**:删除的结点是叶子节点需要做两件事:断开和父节点的连接释放删除节点的内存由于这种情况很简单,不做说明,可参见代码。删除的结点不是叶子节点此时删除的节点必定有左子树或右子树或者两者兼具。以图1的二叉树为例,我们可以有两种做法。就以删除节点3为例,即可以将节点3左子树的最大值节点补在节点3的位置,也可以将节点3右子树的最小值节点补在

2021-07-06 12:29:04 3328 1

原创 C库函数string.h——字符串常用函数说明及使用注意

string.h常用函数strlen()strcmp()strcpy()strcat()memset()memcpy()和strncpy()二者的区别memcmp()和strncmp()二者的区别memmove()strlen()函数原型:size_t strlen(const char *str)说明:计算并返回字符串 str 的长度,直到空结束字符,但不包括空结束字符。size_t是一种无符号类型。举例:如char* str=“China”,strlen(str)返回5。​实例:#incl

2021-07-05 12:25:49 576

原创 数据结构——实现一个二叉查找树(BST)

文章目录1.BST的性质:2.BST的遍历BST(Binary Search Tree):二叉查找树,也叫二叉搜索树,或称二叉排序树Binary Sort Tree1.BST的性质:每一个元素都有一个键值,并且键值不允许重复左子树的所有节点的键值都小于根结点右子树的所有节点的键值都大于根结点左右子树都是一个BST树2.BST的遍历BST是一种特殊的二叉树,它的遍历方法和二叉树相同,分为前序遍历、中序遍历和后序遍历,这3种遍历的实现(递归和迭代)我在前面的文章已经介绍过了,有兴趣可以参考一

2021-07-02 12:22:26 639

转载 C++ cin详解

代码编译运行环境:VS2017+Win64+Debug。 文章目录 1.cin 简介2. cin 常用输入方法2.1 cin>> 的用法2.2 cin.get() 的用法2.2.1 cin.get() 读取一个字符2.2.2 cin.get() 读取一行 2.3 cin.getline() 读取一行 3. cin 的条件状态4. cin 清空输入缓冲区5.从标准输入读取一行字符串的其它方法5.1 getline() 读取一行5.2 gets() 读取一行 参考文献

2021-07-01 17:35:37 2139

转载 排列组合详解

在笔试题中看到的一个选择题 用1*3的瓷砖密铺3*20的地板有几种方式? 排列组合问题 排列和组合问题,其实是两种问题,区分它们的原则是是否需要考虑顺序的不同。排列问题,考虑顺序;组合问题,不考虑顺序。以下4个问题,哪个是排列,哪个是组合? Q1: 一套书共有...

2021-06-29 14:06:19 1507

原创 C++ string使用介绍(非常全面,详细)

目录string的初始化1.常见初始化方式string对象的操作1.用cin获取键盘输入的值2.用getline读取一整行4.比较string的大小5.两个string对象相加5.1 两个string对象相加5.2 string对象加上一个字符(或字符串)字面值如何获取和处理string中的每个字符1.使用下标运算符[]2.使用迭代器3.使用基于范围的for语句构造string对象的其他方法1拷贝数组2.拷贝string对象3.使用substr成员函数string对象的insert()迭代器insert下标

2021-06-28 12:34:04 39041 1

原创 二叉树的层序遍历

目录具体实现的代码1.树节点定义:2.层序遍历代码:实现区分不同层的节点方法1:使用一个队列方法2:使用两个队列完整的测试代码及测试结果二叉树的层序遍历就是从根节点开始,一层一层的显示节点数据,每一层都是从左往右。如下图所示,层序遍历的结构就为:‘*’->‘-’->‘C’->‘+’->‘B’->‘E’->‘F’。要想实现层序遍历,可以使用队列的数据结构。借用其先进先出的特点,每当访问到一个节点时,就将节点的数据打印并把左右子节点放入队列中。过程如下图具体实现的代

2021-06-24 12:27:26 1294

原创 二叉树的非递归(迭代)统一实现“前中后序遍历”详解

目录二叉树大家都非常熟悉,二叉树的遍历大家也不会陌生。用递归法来实现二叉树的“前中后序遍历”相对简洁,用几行代码就能实现,并且只需改变代码顺序就能实现3种遍历。与之相反,非递归(迭代)遍历方法实现“前中后序遍历”起来较为复杂,并且不太容易通过简单的交换代码的次序来实现3种遍历,当然,只是不太容易,并不是没有方法。下面就介绍统一的非递归(迭代)方法来是实现“前中后序遍历”。这个过程要使用栈的数据结构,这点想来不用多解释。树节点的定义如下:template<class T>class Tr

2021-06-22 12:18:28 308

原创 为什么无法从“int *”转换为“const int *&”?

本文将探讨为什么C++ 不允许将“int *”转换为“const int *&”。如果你只想知道结论,可以直接看总结部分;如果想知道我的探索过程,可以读完全文。无法从“int *”转换为“const int *&”原因总结:在用VS2013编译代码时,做了如下操作:int i = 42, *p = &i;const int *& tmp1 = p;结果编译报错,提示:无法从int* 转换为const int* &接着,我定义一个int* const &a

2021-06-21 12:15:41 2944 4

转载 C++基于范围的for循环:for(auto a:b)

C++基于范围的for循环总结for(auto a:b)用法:范围for(range for)语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是: 1. for (declaration : expression) 2. statement其中: expression部分是一个对象,必须是一个序列,比方说用花括号括起来的初始值列表、数组或者vector或string等类型的对象。这些类型的共同特点是拥有能返回迭代器的begin和end成员。 decl

2021-06-19 10:57:20 5514 1

原创 有auto为什么还要decltype ?详解decltype的用法

decltype用法auto和decltype推导类型的区别decltype用法:1.decltype变量2.==decltype表达式==2.1 表达式做右值2.2 表达式能做左值3. decltype 函数3.1 decltype(f())3.2 decltype(f)C++ 11 中decltype的主要作用auto和decltype推导类型的区别在中,我介绍了auto的用法及其实际编程中的应用,既然auto可以推导变量的类型,为什么C++11还引进decltype类型说明符呢?关于这一点,C++

2021-06-17 12:09:37 2523 1

原创 底层const顶层const到底是什么?

底层const顶层const总结:首先顶层const和底层const的说法和指针有很大的关系。指针本身是一个对象,但它又指向另一个对象,这就是指针的两种属性。对于指针本身是一个常量,即指针的指向是一个常量,也就说不能改变指针的指向,称其为顶层const属性;对于指针指向的对象是一个常量,即指针指向的地址的值是一个常量,也就是说不能改变指针指向内存的值,称其为底层 const属性。在代码表现上是:int* cosnt p1 = &a;//p1是顶层constcosnt int* p2

2021-06-16 13:16:38 4152 6

原创 二叉树的迭代法后序、中序遍历

递归法实现二叉树的后序遍历较为简单,本文将介绍模拟递归的过程,使用迭代法实现后序遍历和中序遍历的方法。后序遍历后序遍历的顺序为:左右中。以下面的二叉树为例,是不是可以先打印‘9’这个节点呢?显然不是,因为‘9’又是下一个子树的父节点,打印它之前必须先打印它的左节点。所以我们必须一直找到最左节点(1)。假设我们已经找到了最左节点,也就是‘15’,那么我们能打印吗?思考一下,我们是后序遍历,打印顺序为左右中,此时‘15’还有一个右节点‘4’,那么我们必须先打印‘15’的右节点‘4’。所以找到了最左节点后,

2021-06-15 12:37:34 316 1

原创 二叉树的迭代法前序遍历的两种方法

二叉树的迭代法前序遍历方法一:模拟递归法实现的递归过程方法二:按照“中左右”的遍历顺寻,将父节点和左右子节点入栈二叉树的前序遍历的顺序为:中左右。如下图,打印顺序为:’3’->’9’->’15’->’4’->’7’->’1’->’20’->’0’方法一:模拟递归法实现的递归过程递归的过程为:(1)每次在将左节点入栈之前,打印节点数据,直到最左节点为空。如打印节点’3’,然后再压入栈中;打印左节点’9’,然后再压入栈中。(2)取出栈中的节点最左结点’15

2021-06-10 12:26:17 725

原创 C++ STL::list常用操作及底层实现(下)——实现list其他常用操作(reverse、assign、front、back)

stl::list其他操作与实现1.reverse:反转链表2.assign:2.1 格式1 :void assign (size_type n, const value_type & val)2.1 格式2 :void assign (iterator first, iterator last)3. front和back3.1 front:返回链表头的数据;3.2 back:返回链表尾的数据4.list操作完整代码在前面两篇文章中,我们介绍了STL::list插入和删除的操作,并给出了实例以便理

2021-06-09 14:07:26 620 2

原创 C++ STL::list常用操作及底层实现(中2)——实现list常用操作之删除(erase、remove、pop_front、pop_back、clear)

list 常用操作及自底层实现1.erase():按链表迭代器删除1.1函数格式1:iterator erase (iterator position)1.2函数格式2:iterator erase (iterator first, iterator last)2.remove():按值执行删除操作3. pop_front、pop_back:删除链表头和链表尾的元素4. clear:清除链表所有元素5.完整代码(包括插入和删除)上一篇我们介绍了插入的常用操作,本文介绍删除的相关操作。1.erase():

2021-06-08 12:22:09 2156

空空如也

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

TA关注的人

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