- 博客(158)
- 资源 (1)
- 收藏
- 关注
原创 【HeadFirst 设计模式】设计模式总结与C++案例
每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。上面这段话可以说是设计模式为什么会被总结归纳并值得学习的原因——“复用前人的经验”。你在软件开发过程中遇到的大部分问题,其实你的先辈都曾遇到过,并且已经做了归纳,你只需学习这些经验并实践之就能解决你眼前的困难。当然,你也可能选择无视它,自己尝试去解决,但最终的效果大概率差强人意,并且在此过程中也浪费了大量时间。
2024-10-28 22:07:44
1066
原创 【GIT】一文带你彻底了解 git rebase(图解+案例+实战)
git rebase,顾名思义即变基,不过这是一条多功能命令,既可以重建提交历史,还可以整合不同分支间的变更。本文将对相关功能进行介绍。文中的截图为使用创建的,不熟悉git的可以使用这个练习一下。
2024-10-24 23:57:55
17181
2
原创 【HeadFirst 设计模式】适配器模式的C++实现
这时,我们可以设计一个适配器类:该类继承自鸭子接口(因为这个类的作用就是将伙计变成鸭子),它的构造器接受一个待伪装者:即一个火鸡类的指针,由于继承了鸭子接口,它需要实现鸭子的quark和fly方法,为了实现伪装,不妨在quark方法中调用火鸡的咕咕叫方法,同理由于火鸡飞一次的距离只有鸭子的五分之一,那么在fly方法中可以让火鸡飞五次,通过这种方式实现伪装。可曾记得之前写过的鸭子游戏?正当你愁眉不展的时候,一只野生的火鸡出现在你的面前!火鸡也会叫,但是它的叫声和鸭子不同,它并不能呱呱叫,而只能咕咕叫;
2024-10-21 23:56:21
422
原创 【汽车电子】关于XCP协议开源实现XCPlite-5.3的分析与使用
该版本基于ASAM XCP Protocol Layer V1.4实现。DOWNLOADFREE_DAQALLOC_DAQALLOC_ODTWRITE_DAQ不支持8位和16位CPU,仅支持在32位或64位Linux和Windows平台上进行测试不支持Motorola字节序(大端)不符合misra规范ODT的总数限制为64KODT条目的总数限制为64K固定的DAQ+ODT 2字节DTO头固定的32位时间戳。
2024-10-15 15:33:09
1578
原创 【C++】详解模板类型推导
从这样的角度来看,C++的模板类型推导毫无疑问取得了巨大的成功:成百上千的程序员都在向函数模板传递实参,并拿到了完全满意的结果,而其中鲜有人能够将类型推导的过程阐述出来。依照按值传递形参的类型推导规则,此时ptr的const性会被忽略,param被推导成const char*,即一个指向可以改变的,指向一个const字符串的指针(或者说顶层const在值传递的过程中被消除),在推导过程中,ptr指向对象的常量性会被保留,但自身的常量性被忽略。在这种情况下,T的类型会被推导成实际的数组类型!
2024-10-15 01:42:15
908
原创 【GO】Go语言初探
C语言相对而言比较原始,C++语言又过于复杂,对于一部分人而言学习Go语言似乎变成了一件很有性价比的事情。而对于有C/C++基础的同学来说,学习Go语言就变得非常容易。Go语言,Go Language,简称Golang或Go,是一门由Google公司开发的静态类型、编译型的编程语言。其设计理念是提供一种直观、简洁、可靠的解决方案,以应对现代软件开发中所面临的挑战。
2024-10-10 23:05:55
1125
原创 【HeadFirst 设计模式】命令模式的C++实现
A公司想要生产一款万能遥控器:使用本公司遥控器,只需要设置好需要被控制的设备,比如电视,空调,电灯等,便可以实现遥控,从此摆脱找不到遥控器的情况!其他电器类的代码和实现已经相应的电器公司提供,你的任务是将这些代码融合进遥控器中,以实现遥控器的功能。
2024-08-15 21:18:52
563
原创 【HeadFirst 设计模式】单例模式的C++实现
在很多时候,我们期望代码在运行过程中只实例化一个实例,听起来似乎很简单,但是你不应该想着仅靠个人技术或者团队内的约定去完成这件事。因为这件事从本质上讲是类的设计者的责任,而不能依靠使用这个类的人靠个人技艺去保证单例。单例模式是有发展历程的。最开始的一段时间,当人们设计出单例模式之后,这一模式便被广泛的使用,但随后有一些资深的计算机科学家论证了当时的编程手段实际上无法保证单例,再后来一些编程语言甚至增加了一些关键字去弥补这个漏洞。
2024-08-15 20:36:56
481
原创 【HeadFirst 设计模式】工厂模式的C++实现
你发现你所有的竞争者都已经在他们的菜单中加入了一些流行风味的披萨,很明显,你必须要赶上他们,所以你也要将这些类型的披萨加进你的菜单中,而最近Greek Pizza卖的不好,所以你决定将它从菜单中去掉。既然我们想要根据不同的披萨店定制个性化的披萨,那就简单干脆一些,写出一个工厂父类,然后实现好几个具体工厂继承它,这样在创建的时候我们便能够动态的选择不同的工厂去制作披萨。在这个过程中,你发现加盟店的确是采用你的工厂创建披萨,但是其他部分,却开始采用他们自己根据当地人的口味做的一些改良:烘焙手法有些差异等等。
2024-08-14 23:26:51
730
原创 【HeadFirst 设计模式】装饰者模式的C++实现
购买咖啡时,可以要求在其中加入各种调料,例如:蒸奶(Steamed Milk)、豆浆(Soy)、摩卡(Mocha,也就是巧克力风味)或覆盖奶泡。星巴克会根据所加入的调料收取不同的费用。比如我们在基类中加上实例变量,这些布尔值代表是否加上该调料(牛奶,豆浆,摩卡,奶泡。因为扩张速度实在太快了,他们准备更新订单系统,以合乎他们的饮料供应要求。他们原先的类设计是这样的。我们的目标是允许类容易扩展,在不修改现有代码的情况下,就可以搭配新的行为?这样的设计具有弹性,可以应对改变,可以接收新的功能来应对改变的需求?
2024-08-14 20:24:07
525
原创 【HeadFirst 设计模式】观察者模式的C++实现
贵公司获选为我公司建立下一代Internet气象观测站!该气象站必须建立在我们专利申请中的WeatherData对象上,由WeatherData对象负责追踪目前的天气状况 (温度、 湿度、气压)。我们希望贵公司能建立一个应用,有三种布告板,分别显示目前的状况、气象统计及简单的预报。当WeatherObject对象获得最新的测量数据时, 三种布告板 必须实时更新。
2024-08-14 00:14:08
332
原创 【HeadFirst 设计模式】策略模式的C++实现
J o e 上班的公司做了一套相当成功的模拟鸭子游戏:SimUDuck。游戏中会出现各种鸭子,一边游泳戏水,一边呱呱叫。此系统的内部设计使用了标准的OO技术,设计了一个鸭子父类,并让各种鸭子继承此父类。现在,需求发生了变化,需要添加会飞并且会叫的鸭子,怎么做合适?
2024-08-08 21:30:37
723
原创 【HeadFirst 设计模式】C++案例笔记
每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。上面这段话可以说是设计模式为什么会被总结归纳并值得学习的原因——“复用前人的经验”。是的,它就像一本传世已久的武功秘籍,你在软件开发过程中遇到的大部分问题,其实你的先辈都曾遇到过,并且已经做了归纳,你只需学习这些经验并实践之就能解决你眼前的困难。当然,你也可能选择无视它,自己尝试去解决,但最终的效果大概率差强人意,并且在此过程中也浪费了大量时间。
2024-08-08 20:51:39
441
原创 一览函数式编程
函数式编程是一种编程范式,它将计算视为数学函数的求值过程。在函数式编程中,函数是一等公民,可以像其他值一样被传递、组合和操作。函数式编程强调不可变性和无副作用,即函数的执行不会改变程序状态或外部环境。这使得函数式编程更容易进行推理和测试,并且可以更好地支持并发和并行计算。不可变性是指在程序执行过程中,某个对象的状态不会发生改变。在函数式编程中,不可变性是一个重要的概念,因为它可以避免副作用和竞态条件等问题。在不可变性的约束下,函数的执行结果只取决于输入参数,而不会受到外部环境的影响。
2024-05-07 23:50:04
760
原创 【设计模式】单例模式的前世今生
在软件系统中,经常有一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性以及良好的效率。单例模式是一种设计模式,其核心目的是确保某个类在系统中只有一个实例,并提供一个全局访问点来访问这个实例。“确保某个类在系统中只有一个实例”——这个目的听起来似乎很简单,不要觉得荒谬,某些特定的情况下,我们的系统中确实只需要某个类的一个实例就可以了,这样既能满足实际使用场景,又能减少内存开销,避免资源的多重占用,提升性能。
2024-05-06 18:53:06
1094
原创 关于提高自己技术能力的几点思考
但是这里面还有一个问题,就是知识库与自己所面对的现实问题的匹配问题, 有可能知识库的知识是错的,也有可能现实问题没有抓住核心矛盾,没有看清它的本质。现在想想这两种方式确实是符合认知逻辑的,了解到知识,结合实际使用场景,举一反三,带来提升, 这是理论指导实践, 第二种,先碰到了问题,事先没有解决经验,去摸索尝试,最后解决了问题,能力边界又扩张了一些,这是个实践总结理论。多看行业案例,先看场景与开始条件,然后根据自己的想法写下可能的因素和产生的结果,最后根据实际的结果偏差,来校正自己思维的出入。
2024-04-18 22:47:08
625
原创 【C++】为什么需要CMake?
include 命令实际上只是将对应hpp中的文件原封不动的粘贴到#include所在位置,从这个角度而言,假如你的工程文件里有10个hpp,10个cpp,现在我们想砍掉所有的hpp文件,砍掉之后只剩下10个cpp文件,看上去我们的文件减少了,非常好,但是由于去掉了头文件,我们不得不做一些复制粘贴的工作:比如A.cpp中需要用到A.hpp中的add函数,由于砍掉了头文件,所以现在需要将hpp的声明原封不动的抄过来,还行,简简单单。前三步走完都不会报错,直到遇到链接,才会报错,因为找不到add函数的实现。
2024-04-13 23:12:39
4386
4
原创 【读后感】程序员修炼之道——通向务实的最高境界
最近读了一本书——《程序员修炼之道》,颇有感悟。你别被这个名字吓到了,程序员的修炼之道,听起来很悬,其实非常实用。这本书,就是一个清单手册,有100条,每一条都是一个使用原则。如果你去读的话可能都不相信这是程序员写的,字里行间透露着幽默感。就比如其中有一节的标题是“我的源码被猫吃了”,这不是告诉你程序员养猫会咬坏键盘,其实是说,如果某一天你不小心把代码删掉了,别着急找借口甩自己的猫,而是要积极的寻找替代方案,这样幽默感在书里到处都是。我读的是第二版。这本书的出版日期是2020年4月,第一版是在20年前出版的
2024-04-12 22:33:56
656
原创 Mac OS 搭建C++开发环境【已解决】
安装VSCode,gcc编译工具,cmake,git,配置完成相关环境,成功编译运行相关项目。
2024-02-24 20:21:17
16978
9
原创 【C++】操作符替代名
需要注意的是,操作符替代名是一种文本替换机制,编译器在预处理阶段将替代名替换为相应的操作符。因此,替代名不会改变实际的操作符行为,仅仅是提供了一种更直观的表示形式。在上面的示例中,我们使用#define定义了一个名为ADDITION的替代名,它表示加法操作符+。在使用操作符替代名时,需要小心避免与现有的C++关键字或标识符冲突,并确保替代名的命名规范和语义准确性,以避免代码理解上的混淆和错误。上面的示例中,我们为位运算符&定义了一个替代名BITWISE_AND,然后在主函数中使用该替代名进行按位与操作。
2024-02-01 10:42:35
527
原创 【算法】LRU算法
它的弊端很明显,如果Cache的数量少,问题不会很大, 但是如果Cache的空间过大,达到10W或者100W以上,一旦需要淘汰,则需要遍历所有计数器,其性能与资源消耗是巨大的。双链表LRU的原理: 将Cache的所有位置都用双链表连接起来,当一个位置被命中之后,就将通过调整链表的指向,将该位置调整到链表头的位置,新加入的Cache直接加到链表头中。这样,在多次进行Cache操作后,最近被命中的,就会被向链表头方向移动,而没有命中的,则向链表后面移动,链表尾则表示最近最少使用的Cache。
2024-01-09 10:00:36
685
原创 【C++】十大排序算法
首先找出元素的最大最小值,然后统计每个元素i出现的次数,然后放入数组i中,数组中存放的是值为i的元素出现的个数。如果是升序排序,则每次选择最小值就行,这样已经排好序的部分都是生序排序选择排序是不稳定的,比如说(55231这种情况,两个5的相对顺序会变)基数排序的思想是,从个位依次开始排序,首先按照个位的大小排序,将改变的序列按照十位开始排序,然后一次往后……4)从I开始向后搜索,即由前开始向后搜索(I=I+1即I++),找到第一个大于 key 的A[i],A[i]与A[j]交换;
2024-01-09 09:41:38
1244
原创 C++为什么提供std::move函数?
有时候某个变量的生命周期编译器不可预见,但是我们自己是可以知道的,因此对于这些生命周期很短的变量我们为了节省效率就可以使用move函数。但如果黄金量很大,移动的成本就会非常高。另一种方式就是大家的黄金都存在银行里,张三买李四的黄金,无非就是账户里的黄金数发生个变化,实体黄金不移动,这样效率就高很多。codereview的时候就发现了这个事情:本质上上述代码,把vecRow中的所有元素都复制了以便然后放到mapTable中,白白的重新创建了一遍所有行数据,又把不再需要的vecRow释放掉了。
2024-01-05 11:43:20
541
原创 【C++】一文理清override,overload,overwrite
在平时的工作交流中,有很多C++程序员对它们的概念模糊不清,经常误用或者混用这3个概念,所以在说明override说明符之前,我们先梳理一下三者的区别。
2024-01-04 09:37:38
2305
原创 浅谈C++中如何重载前置++/--与后置++/--
其实,前置++与后置++的功能”先加后用“与”先用后加“已经为这两种操作符的实现指明了路线:既然是先加后用,那加完之后的和最后使用的应当是同一样东西,所以应当返回引用。同理,”先用后加“说明应当先把原来的值保存起来,再将其加1,但是最后还是应当返回其原来的值,因为是”先用后加“嘛。另外,你还应当注意,这里保存完原来的值之后,直接调用了前置++去实现加1,这种操作很好的实现了复用,应当被提倡。于是,为了填平这个语言上的漏洞,只好让后置式有一个int自变量,在其被调用的时候,编译器默默为该int指定一个0值。
2023-11-27 18:51:10
986
原创 浅谈STL中的分配器
分配器是STL中的六大部件之一,是各大容器能正常运作的关键,但是对于用户而言确是透明的,它似乎更像是一个幕后英雄,永远也不会走到舞台上来,观众几乎看不到它的身影,但是它又如此的重要。作为用户,你几乎不用关心它的底层是怎么实现的,甚至也很少有能使用到它的机会。这里简单聊一下我对它的认识。
2023-11-25 14:49:27
1070
原创 【C++】详解EBO:空基类优化
看侯捷的STL课时,常常听他抱怨STL 4.9版本的一些做法实在令人费解,听得多了难免有些疑问,难道真的是这样吗?怎么会逆历史潮流向后倒退呢?于是开始去找STL团队背后这样做的原因。
2023-11-11 18:06:49
488
原创 【C++】详解 void*
void*类型的指针其实本质就是一个过渡型的指针状态,必须要赋予类型(强制类型转换)才能正常使用。void *的范围较大,所以强制转换,使其进行范围缩小。只能单向类型转换。void*可以转化成其他类型,但是有类型的不能转化成void*。在函数调用过程中的使用作为输入输出参数也非常好用,可以灵活使用任意类型的指针,避免只能使用固定类型的指针。
2023-11-08 16:53:48
1456
原创 【读后感】《浪潮之巅》- 吴军
作为 IT 行业必读书籍,浪潮之巅(第四版)(上下册)豆瓣评分高达 9.1 分,常年占据 IT 图书热卖榜榜首。该书作者吴军博士是一位成功的投资人和 IT 行业专家。吴军博士著有《数学之美》《大学之路》《文明之光》《智能时代》《见识》《态度》和《全球科技通史》等多部畅销书,并多次获得包括文津奖、中国好书奖、中华优秀出版物在内的图书大奖。人生很渺小,就像浮萍一样。当浪潮来的时候,人是躲不了的,你只能顺势而为。换言之,人要接受一切的可开放性,但是无论在任何的情境中,要有自己的定海神针。
2023-10-24 17:12:54
360
原创 【设计模式】Head First 设计模式——构建器模式 C++实现
Builder 模式主要用于“分步骤构建一个复杂的对象”。在这其中“ 分步骤 ”是一个稳定的算法,而复杂对象的各个部分则经常变化变化点在哪里,封装就在哪里 — Builder 模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动在Builder 模式中,要注意不同语言中构造器内调用抽象方法的差别。
2023-09-02 17:27:54
1062
原创 【C++】一文详解lambda表达式用法及发展历程
以上介绍了lambda表达式的语法、使用方法以及原理。总的来说lambda表达式不但容易使用,而且原理也容易理解。它很好地解决了过去C++中无法直接编写内嵌函数的尴尬。虽然在GCC中提供了一个叫作nest function的C语言扩展,这个扩展允许我们在函数内部编写内嵌函数,但这个特性一直没有被纳入标准当中。当然我们也并不用为此遗憾,因为现在提供的lambda表达式无论在语法简易程度上,还是用途广泛程度上都要优于nest function。
2023-09-02 14:11:19
1535
原创 【C++】一文解析std::binary_function、std::bind1st、std::bind2nd、std::bind
STL中有一个叫做“适配器”的概念,它指的是某些函数可能定义了两个形参,但是某些算法需要的函数却有时候需要一个形参,那么就需要对其进行适配,将原本只需要两个参数的函数转变成需要1和参数就能正常运行的函数。就像你为你的笔记本充电,能直接一根火线一根零线直接接在你的电脑上吗?肯定也是需要一个适配器将国内标准电压转化成笔记本需要的额定电压。“适配器”就是由此而来。
2023-09-02 10:55:03
922
原创 【C++】C++中的谓词
以上几个示例展示了谓词的几种常用实现方法,对于find_if等其他类似的函数都可以使用这种方式。另vector中的元素可以泛化成为类,不局限与特定的数据类型,只需要在重载函数中明确其比较方式即可。
2023-09-01 13:49:49
1059
原创 【设计模式】Head First 设计模式——抽象工厂模式 C++实现
设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。
2023-08-31 15:41:51
862
原创 【设计模式】Head First 设计模式——工厂方法模式 C++实现
设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。
2023-08-31 14:25:07
1079
原创 【设计模式】Head First 设计模式——桥模式 C++实现
设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。
2023-08-30 16:55:32
1036
原创 【设计模式】Head First 设计模式——装饰者模式 C++实现
设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。
2023-08-28 16:17:01
669
原创 【设计模式】Head First 设计模式——观察者模式 C++实现
主题对象(出版者)管理某些数据,当主题内的数据改变,就会通知观察者(订阅者)。
2023-08-28 15:37:14
740
模板函数特化是否有存在的意义?
2023-11-24
侯捷C++中的函数传const T&真的实用吗?
2023-10-16
TA创建的收藏夹 TA关注的收藏夹
TA关注的人