自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 将两个已排序的数组进行合并,同时去除重复数字,要求不能使用已有排序函数,比如sort,需要自己实现

分析:比如已排序的数组是从小到大,元素为整数。首先我们定义一个容器vector用来保存输出结果,按照顺序从小打大依次访问两个数组的元素,将较小的数字插入到一个vector中,同时数组下标加1;去除重复数据,我们可以在插入的时候判断,只有比最后的元素大的值才可以插入。需要注意的是,可能一个数组已经结束了,另一个数组中还有元素,那么需要把剩余元素逐一插入。因为插入数据这个动作比较频繁,而且需要判断,建议单独写个小函数实现。

2023-07-30 21:59:22 293

原创 计算整数M的N次方,输出结果

M为2-10的整数,结果可能超过long long 所能保存的最大值

2023-07-30 21:25:27 397

原创 富途网络面试经验——C++

1、记录目的本文旨在提升自身技术水平,发现自身不足,并了解大厂和中小型公司面试要求上的区别,不会涉及具体工作内容,如涉及到公司机密,请联系删除。(估计不会涉及,因为面试没有通过,有点遗憾,感触有一些,相信会进一步激励自己加强学习侧重点)一些客套话和礼仪、基本自我介绍、语速就不谈了,本文重在学习和总结技术。2、一面(常规基础知识)(1)STL基础:说一下vector和list的区别以及各自的优缺点?答:存储方式:vector是线性存储,在内存中是连续的存储空间;而list..

2021-04-13 20:25:05 1436

原创 23种设计模式代码整理

struct Point{ int x; int y;};struct Line{ Point p1; Point p2; Line() { //... }};class Circle{ Point p; float r;public: void DrawCircle() { //... }};class Tricle{ Line m_l...

2021-04-13 14:27:26 547

原创 虚函数表:基类的构造函数声明不能为virtual,而基类析构函数一般设置为virtual

1、引子:虚函数表和虚函数指针先回顾一下,虚函数表和虚函数指针是什么?我们知道C++为每一个包含虚函数的类维护一个虚函数表,每个对应的类对象都有一个隐式的虚函数表指针vptr先看一个例子:假设我们有一个基类Base,有成员函数f(), g(), h() 。其中f()和g()是虚函数(当然这里可以定义为纯虚函数,但这样就不能生成类对象了),h()为非虚成员函数。class Base{public: virtual void f(){}//虚函数 virtual void

2021-03-10 10:15:43 905 2

原创 C++ 11 内容总结

核心語言的執行期表現強化右值引用和move语义在C++03及之前的标准,临时对象(称为右值"R-values",因为它们通常位于赋值运算子右侧)无法被改变,在C中亦同(且被视为等同于const T&)。尽管如此,在某些情况下临时对象仍然可能会被改变,但这种表现也被视为是一个有用的漏洞。C++11增加一个新的非常数引用(reference)型别,称作右值引用(R-value reference),标记为T &&。右值引用所绑定的临时对象可以在该临时对象被初始化之后做修改.

2021-01-26 17:04:51 770

转载 C++20已发布!

1、Constraints and concepts (约束和概念)在类模板和函数模板编程中,主要用于对模板参数的结束和限制,这种约束和限制发生在编译期,编译错误不再那么晦涩难懂了。在模板编程中,可以限制模板参数的类型或具用某种特性,如:可以限制为整型、数值型、bool 型、或必须支持 hash 特性、或某个类的派生类型等。在 C++20 中 Concepts 是非常重要的概念,模板编程终于有了质的提升。ConceptsConcepts 是 requirements 的具名集合,conce

2021-01-25 14:24:27 534

转载 C++ STL中Map的按Key排序和按Value排序

map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value。假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择。 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key;该学生的成绩用int类型,作为value。这样一来,我们可以根据学生姓名快速的查找到他的成绩。 但是,我们除了希望能够查询某个学生的成绩,或许还想看看整体的情况。我们...

2021-01-25 11:17:19 633

原创 C++多线程thread用法

1、多线程相关的类C++11 新标准中引入了五个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。<atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。<thread>:该头文件主要声明了 std::t

2021-01-23 18:02:09 6015

原创 类的static成员咋用?和普通成员变量之间怎么访问?

1、记录原因之前一直捋不清普通成员和静态成员之间怎么访问,经常忘记,最近学习设计模式的单例模式时,顺便重温《C++ Primer》static关键字,有了一些新的理解,可能不完全正确,如果有误,望读者提出。2、C++ primer上的介绍我们通过再成员声明之前3、重点4、总结...

2021-01-15 16:49:15 3623

原创 C++11标准:Lambda表达式讲解

1、定义解析 Lambda表达式,顾名思义,它是一个表达式,和常规函数表达式不同的是它是“匿名”的,也就是没有函数名的表达式(简称匿名表达式)。2、Lambda的一般表达形式capture list :捕获列表,是lambda所在的函数中定义的局部变量的列表(通常为空)parameter list:参数列表return type:返回类型function body:函数体说明:(1)外观来看,和普通函数类似的是,Lambda表达式具有一个返回类型,一个参数列表...

2021-01-15 08:56:40 263

原创 函数指针是啥?

我们知道普通变量申明后,编译器就会自动分配一块适合的内存。函数也是同样的,编译的时候会将一个函数编译好,然后放在一块内存中。(上面这段说法实际很不准确,因为编译器不会分配内存,编译好的代码也是以二进制的形式放在磁盘上,只有程序开始运行时才会加载到内存)如果我们把函数的首地址也存储在某个指针变量里,就可以通过这个指针变量来调用所指向的函数了,这个存储函数首地址的特殊指针就叫做函数指针。比如有一个函数int func(int a);我们如何申明一个可以指向 func 的函数指针呢?int .

2021-01-09 14:18:38 196

原创 二十五、设计模式-总结

2020-12-22 19:56:36 28

原创 十四、设计模式-代理模式(Proxy)

1、动机 在面向对象系统中,某些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。 如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的一种解决办法。2、代理模式的定义 为其它对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。3、示例代码 ISubject为主体接口,RealSubject为具体主体类,C...

2020-12-21 17:32:04 37

原创 二十四、设计模式-解释器模式(Interpreter)

1、“领域规则”模式简介 在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。 对应典型模式有:Interpreter2、动机 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。 在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的...

2020-12-18 13:49:20 62

原创 二十三、设计模式-访问器模式(Visitor)

1、动机 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的改变,将会给子类带来很繁重的变更负担,甚至破坏原有设计。 如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上各个类动态添加新的操作,从而避免上述问题?2、Visitor模式定义 表示一个作用于某对象结构中各个元素的操作。使得可以在不改变(稳定)各个元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。3、举例假设我们有...

2020-12-17 16:25:07 113

原创 二十二、设计模式-命令模式(Command)

1、“行为变化”模式简介 在组件构建过程中,组件行为的变化常常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。 典型模式有:(1)Command (2)Visitor2、动机 在软件构建过程中,“行为请求者”和“行为实现者”通常呈现一种紧耦合。但在某些场合——比如需要对行为进行“记录、撤销/重做(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。 在这...

2020-12-14 19:49:34 66

原创 二十一、设计模式-责任链模式(Chain of Responsibility)

1、动机 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少的带来发送者和接受者的紧耦合。 如何使请求的发送者不需要指定具体的接受者?让请求的接受者在运行时决定来处理请求,从而使二者解耦。2、责任链模式定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。3、举例假设请求有如下三种类型:处理请...

2020-12-14 09:57:42 36

原创 二十、设计模式-迭代器模式(Iterator)

1、动机 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多个集合对象上进行操作”提供了可能。 使用面向对象技术将这种机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。(因为C++中STL的出现,包含迭代器,这种模式在C++中已经不实用了)2、迭代器模式定义 提供一种方法顺序访问一个集合对象中的各个元素,而不...

2020-12-08 11:12:30 30

原创 十九、设计模式-组合模式(Composite)

1、“数据结构”模式简介 常常有一些组件在内部具有一些特定的结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定的数据结构封装到内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。 典型的有:(1)Composite (2)Iterator (3)Chain Of Resposibility2、动机 软件在某些情况下,客户代码过多的依赖对象容器复杂的内部实现结构,对象容器内部实现结构(...

2020-12-08 10:37:51 28

原创 十八、设计模式-备忘录模式(Memento)

1、动机 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的细节。 如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。2、备忘录模式定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以在以后将该对象恢复到原先保存的状态。3、举例 写一个类Memento用来保存某...

2020-12-08 10:32:30 101

原创 十七、设计模式-状态者模式(State)

1、“状态变化”模式简介 在组件构建过程中,某些对象的状态经常面临变化,如何对这些状态进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。 常见的两种“状态变化”模式:State、Memento2、动机 在软件构建过程中,某些对象的状态如果改变,其行为也会随之发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就不同。 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入...

2020-12-07 17:57:22 40

原创 十六、设计模式-中介者模式(Mediator)

1、动机 在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。 在这种情况下,我们可以使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好的抵御变化。2、中介者模式定义 用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖->运行时依赖),从而使其耦合松散(管理变化),从而...

2020-11-28 17:43:23 35

原创 git常用命令与详解

1、git与SVN区别:说一下自己的理解,git是分布式版本管理系统,每个PC都是一个独立且完整的版本库,一个人工程的丢失不会造成太大影响,只需远程下载即可,只要提交到远程,大家都可以查看与更新,每一笔提交都会有记录,安全性较高,适用于互联网上多人协作共同维护,甚至没有网络,个人都是可以编辑的,linux上操作较方便;svn是集中式,对网络要求较高,一般适用于局域网,比如一家公司的同一办公区,大家的每一笔提交集中到中央服务器上,因为是局域网,故速率较高,缺点也很明显,如果中央服务器报废,维护就麻烦很

2020-11-21 14:47:48 295

原创 十三、设计模式-门面模式(Facade)

1、“接口隔离”模式介绍 在组件构建过程中,某些接口直接直接的依赖常常会带来很多的问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。 常见有:Facade、Proxy、Adapter、Mediator2、系统间耦合的复杂度对比看一下Facade要解决的问题,就是要把一些关联度高的放在一起,外部仅通过Facade接口来访问,而不是直接访问,从而避免使用混乱3、动机 上述A方案问题在于组件的客户和组件中...

2020-11-21 10:09:34 152

原创 十五、设计模式-适配器模式(Adapter)

1、动机(1)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放到新的环境中应用,但是新环境要求的接口是这些现存对象不满足的。(2)如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?2、我们身边的适配器3、适配器模式定义 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。4、结构图5、示例...

2020-11-21 09:51:51 43

原创 五、设计模式 - 装饰者模式(Decorator Method)

1、“单一职责”模式介绍 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的责任是划清责任。 该职责包含两种设计模式:Decorator和Bridge2、动机 在某些情况下,我们可能会“过度的使用继承来扩展对象的功能”,由于继承对类型引入的静态特质,使得这种方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀 如何是“对...

2020-11-17 19:59:07 41

原创 四、设计模式 - 观察者模式(Observer Method)

1、动机 在软件构建过程中,我们xu要为某种对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好的抵御变化。 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系,从而实现软件体系的松耦合。2、show me the code(注:伪码的形式)假设我们现在有一个需求:把一个上G的资料分割成几个1百兆的文件,txtFilePath代表文件路径,txtFie...

2020-11-05 19:19:37 40

转载 linux命令大全(仅供学习,非商业用途)

系统信息arch 显示机器的处理器架构(1)uname -m 显示机器的处理器架构(2)uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)hdparm -i /dev/hda 罗列一个磁盘的架构特性hdparm -tT /dev/sda 在磁盘上执行测试性读取操作cat /proc/cpuinfo 显示CPU info的信息cat /proc/interrupts 显示中断cat /proc/meminfo...

2020-10-15 17:21:27 658

原创 十二、设计模式-享元模式(FlyWeight)

1、动机 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。 如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面相对象的方式来进行操作?2、举例 比方说我们现在有一种很常见的需求——编辑文档,它可能需要使用多种格式,比如汉字用宋体,字母用楷体,标题用黑体等。如果我们对每个字符都加一个格式,显然需要创建大量对象,是否可以把它们分类,不同类型字符对应不同格式,然后存到模板...

2020-10-08 15:51:23 24

原创 十一、设计模式-单例模式(Singleton)

1、性能对象模式简介 面向对象很好地解决了“抽象”的问题,但是必不可免的要付出一定的代价。对于通常情况来讲,面向对象的成本大多数可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。 典型“性能对象”模式有两种:Singleton(单例模式)、Flyweight(享元模式)2、动机 在软件系统中,经常有这样一些特殊的类,必须保证他们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 如何绕开常规的构造器,提供一种机制来保证一个类...

2020-09-27 12:52:01 43

原创 十、设计模式-构建器模式(Builder)

1、动机 在软件系统中,有时候面临这“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法相对稳定。 如何应对这种变化呢?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求的改变而改变?2、举例 假设我们现在要建一个房子,初始化可能包括窗户、墙壁、门等各个部分的构建工作,如下图:这里插个话题,有一...

2020-09-27 11:35:36 228

原创 九、设计模式-原型模式(ProtoType)

1、动机 在使用某些对象的时候可能会改变它的状态或需要创建多个一样的对象,我们希望留一个原始的作为“备份”,这个备份仅供clone2、举例一个用于创建对象的抽象类:具体类:3、模式定义 使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象4、结构图5、要点总结(1)ProtoType同样用于隔离类的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”(2)ProtoType模式对于“如何...

2020-09-25 16:11:33 35

原创 八、设计模式-抽象工厂(Abstract Factory)

1、动机 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,犹豫需求的变化,往往存在更多系列对象的创建工作。 如何应对这种变化?如何绕开常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?2、show me the code 假设我们需求访问数据库做一些操作,先简单写一个(如下图),创建的对象包含数据库连接、SQL命令和读取:同时数据库需要使用底层接口,我们后面需要继承过来,这里先粘...

2020-09-25 16:11:17 25

原创 七、设计模式-工厂方法(Factory Method)

1、对象创建模式简介 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。 常见几种对象创建模式有:Factory Method、Abstract Factory、Prototype、Builder2、动机 在软件系统中,经常面临创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。 如何应对这种需求变化?如何绕开常规的对象创建方法(new)...

2020-09-25 16:11:00 24

原创 六、设计模式-桥模式(Bridge Method)

1、介绍 作为“单一职责模式”的另一种经典模式,桥模式和装饰者模式有着类似的功能,桥模式类似于装饰者模式的一种扩展,它是用于解决当变化朝不同方向扩展时的一种处理方式2、举例 现在我们实现一个基本通信功能,消息对象Messager(抽象类),包含接口登录(Login)、发送信息(SendMessage)、发图片(SendPicture)、播放声音(PlaySound)、画图(DrawShape)、输出文本(WriteText)以及连接(Connect)等功能。 ...

2020-09-25 16:10:35 129

原创 三、设计模式 - 策略者模式(Strategy Method)

1、动机 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一种负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题。2、下面以各个国家税率算法为例来讲解:枚举TaxBase表示计算税率算法各个国家,SaleOrder表示业务,CalculateTax表示税率计算的方法(下面简称“税法”)。一段代码放在静态环境中是看不出问题的,现在我们把问题放在时间轴上...

2020-09-25 16:09:11 78

原创 二、设计模式 - 模板方法(Template method)

一、动机(什么时候考虑使用模板方法) 在软件构建过程中,对于某一项业务,它常常具有稳定的整体操作结构,但各个子步骤却有很多变化的需求,或者由于固有的原因(比如框架和应用之间的关系)而无法和任务的整体结构同时实现。 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或晚期实现需求?举个例子:如图所示,在实际开发过程中,平台是一个比较稳定的结构,但是应用开发却是经常随着需求在改变,开发过程中要调用到平台库的东西,这就导致几个问题:(1)应用开发人员也需要写...

2020-09-25 16:08:42 29

原创 一、设计模式:总述

1、面对对象设计的目的:提高复用 变化是复用的天敌,面向对象设计最大的优势在于:抵御变化(注意:不是消除变化,而是隔离变化,将变化“赶”到一个区域)2、重新认识面向对象 (1)理解隔离变化 从宏观层面来看,面向对象的构建方式根能适应软件的变化,能将变化所带来的的影响减为最小。 (2)各司其职 从微观层面讲,面向对象的方式更强调各个类的“责任” (3)对象是什么 从语言实现层面来看,对象封装了代码和数据 从规...

2020-09-25 16:08:15 95

原创 C++中直接初始化和拷贝初始化

一、Primer中的说法首先我们来看看经典是怎么说的:“当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象”还有一段这样说,“通常直接初始化和复制初始化仅在低级别优化上存在差异,然而,对于不支持复制的类型,或者使用非explicit构造函数的时候,它们有本质区别:ifstream file1("filename"

2020-09-11 17:10:39 403

空空如也

空空如也

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

TA关注的人

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