- 博客(41)
- 资源 (1)
- 收藏
- 关注
原创 C++构造函数的调用顺序
基类的析构函数应该用virtual修饰,不然的话程序输出如下,也就是说派生类的析构函数是没有被调用的。同样的派生类中的成员对象也没有被析构。的时候,如果我们改成。
2024-10-05 22:16:25
291
原创 使用MySQL WorkBbench 连接远程服务器上的mysql教程(包含踩过的坑)
最近在学习MySQL,想要装一个可视化程序,但是希望把脏活累活留给服务器,于是自己电脑上安装了一个MySQL Workbench作为Client。下面记录一下配置的过程。
2024-06-23 21:56:59
723
原创 设计模式——享元模式
享元模式是一种,它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多的对象。享元模式就是利用共享技术有效地支持大量细粒度的兑现。一个对象的常量数据通常被称为,其位于对象中,其他对象只能读取但不能修改其数值。而对象的其他状态常常能被其他对象“从外部”改变,因此称为。享元模式建议不在对象中存储外在状态,而是将其传递给依赖于它的一个特殊方法。程序只在对象中保存内在状态,以方便在不同情形下重用。
2024-06-20 18:06:38
621
原创 设计模式——中介者模式
虽然将一个系统分割成许多类对象可以增加程序的复用性,但是对象之间的相互连接又降低了程序的复用性。大量的连接使得一个对象不可能在没有其他对象支持的情况下工作,系统表现为一个不可分割的整体,类之间的关系千丝万缕,对系统进行任何大的改动都会并比较困难。Colleague叫做抽象同事类,而ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其他同事的情况,但是它们都认识中介者对象。Mediator是抽象中介者,定义了同事对象到中介者对象的接口。
2024-06-19 22:02:24
862
原创 设计模式——命令模式
用户直接面对的是Invoker类,也就是服务员,在这里面可以实现命令队列,实现增加命令与删除命令的方法,实现下单的方法,里面调用相应的Command对象的Execute方法。假设在餐厅点餐的场景,ConcreateCommand类将具体的服务员/厨师receiver与相应的Action动作绑定起来。对用户而言,不需要知道点的菜是怎么做的,谁做的,只需要下命令就好啦。
2024-06-19 11:19:32
464
原创 设计模式——桥接模式
在学习面向对象的过程中,可能会陷入一个误区,只要可以用,都用上继承,就好比因为有了新锤子,看什么东西都像是钉子了。事实上,继承可能会带来一些麻烦。比如对象的继承关系是在编译阶段就定义好的,所以无法在运行时改变从父类继承的实现。子类的实现与其父类有非常紧密的依赖关系,父类的变化必然导致子类的变化。当需要复用子类的时候,如果继承下来的实现不适用于解决新的问题,则父类必须重写或用更合适的类替换。
2024-06-18 20:18:48
601
原创 设计模式——迭代器模式
当我们要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,应该考虑使用迭代器模式,另外当需要对聚集对象有多种方式遍历时,也可以考虑迭代器模式。, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。迭代器模式为遍历不同的聚集结构提供了诸如开始、下一个、是否结束、当前哪一项等统一的接口。提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象中的内部表示。现在高级语言已经将这个模式用在语言本身,学习价值大于使用价值。
2024-06-18 14:32:52
652
原创 设计模式——组合模式
组合模式将对象组合成树形结构以表示“部分——整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。,可以使用它将对象组合成树状结构,并且能像使用独立对象一样使用它们。什么时候要使用组合模式?
2024-06-17 20:34:56
178
原创 设计模式——备忘录模式(memento)
Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻的内部状态,并且可以使用备忘录恢复内部状态。备忘录模式是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。Caretaker(管理者)只能看到备忘录的窄接口,只能将备忘录传递给其他对象。Memento(备忘录):负责存储Originator对象的内部状态,并且防止除了Originator的其他对象访问备忘录。,允许在不对外暴露实现细节的情况下保存和恢复对象之前的状态。备忘录模式是一个行为设计。
2024-06-17 17:13:25
598
原创 设计模式——适配器模式
当系统的数据和行为都正确,但是接口不符合的时候,应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。请注意, 这种方式仅能在支持多重继承的编程语言中实现, 例如 C++。当双方都不太容易修改的时候,就要考虑使用适配器模式进行适配。适配器实现了其中一个对象的接口, 并对另一个对象进行封装。类适配器模式通过多重继承对一个接口与另一个接口进行匹配。适配器模式包含两种类型:类适配器模式和对象适配器。
2024-06-16 17:42:19
518
原创 设计模式——状态模式
在任何一个特定状态中, 程序的行为都不相同, 且可瞬间从一个状态切换到另一个状态。不过, 根据当前状态, 程序可能会切换到另外一种状态, 也可能会保持当前状态不变。这些数量有限且预先定义的状态切换规则被称为转移。为了能根据当前状态选择完成相应行为的方法, 绝大部分方法中会包含复杂的条件语句。修改其转换逻辑可能会涉及到修改所有方法中的状态条件语句, 导致代码的维护工作非常艰难。,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像是改变了自身所属的类一样。, 然后将所有状态的对应行为抽取到这些类中。
2024-06-16 15:24:12
585
原创 设计模式——观察者模式(发布/订阅模式)
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使得它们能够自动更新自己。,允许你定义一种订阅机制,可在对象事件发生时通知多个“观察”该对象的其他对象。
2024-06-15 20:25:24
726
原创 设计模式——建造者模式(生成器模式)
而ConcreteBuilder是具体的建造者,实现Builder接口,构造和装配各个部件,Product是具体的产品。当我们需要创建一些复杂的对象,这些对象内部构建间的顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。用了建造者模式,那么用户就只需要指定需要构建的类型就可以得到它们,而具体构造的细节和过程不需要知道。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图。概括地说,Builder是为创建一个Product对象的各个部件指定的抽象接口。
2024-06-12 19:15:13
854
原创 设计模式——模板方法模式
当我们要完成在某一细节层次一致的一个过程或者一系列步骤时,但是其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法来处理。,在超类中定义一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。继承的实现应该让重复代码尽可能上升到父类去,而不是每个子类都去重复实现。
2024-06-05 20:16:06
383
原创 设计模式——原型模式
所有的类对 克隆方法的实现都非常相似。该方法会创建一个当前类的对象, 然后将原始对象所有的成员变量值复制到新建的类中。原型模式是一种创建型设计模式,使你能够复制已有对象,而又不需要使代码依赖他们所属的类。模式为所有支持克隆的对象声明了一个通用的接口,这个接口中仅包含一个clon方法。容易想到的是遍历原始对象的所有成员变量, 并将成员变量值复制到新对象中。* 必须要知道对象所属的类才能创建复制品,也就是说,代码必须要依赖该类。* 有时我们只知道对象所实现的接口,而不知道其所属的具体类。
2024-06-05 17:42:13
271
原创 设计模式——工厂方法模式
(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。也就是之前的每个case分支都由一个工厂子类来实现。简单工厂模式的最大优点在于工厂类中包含必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于当客户端来说,去除了对具体产品的依赖。具体实例化哪个类呢?还是需要进行选择判断的,之前的选择判断是发生在简单工厂的内部, 而现在这部分判断是由客户端实现的。但是这个模式我们每次增加一个产品类,就需要在工厂类中增加一个case分支,也就是说我们不但。
2024-06-04 19:31:57
311
原创 设计模式——装饰模式
动态地给一个对象添加一些职责,就增加功能而言,装饰模式比生成子类更加灵活。,允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。
2024-06-02 20:06:17
125
原创 设计模式——策略模式
策略模式:定义了算法家族,分别封装起来,他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的客户。比如有A1、A2、A3三个算法,抽象出类A,抽象基类A作为类C的成员变量。使用类C操控类A继承体系的共有对外暴露接口。
2024-05-31 15:20:28
224
原创 设计模式——简单工厂
以简单工厂类为接口,工厂类根据不同输入参数创建具体的对象,实现界面和业务的解耦(界面需求改变和业务需求改变不互相影响)对业务进行封装,利用继承使程序容易扩展,利用多态,用工厂类来实现对象实例的创建维护。
2024-05-31 14:17:29
330
原创 代码随想录1刷--day9 动态规划
动态规划,英文:Dynamic Programming, 简称DP,如果某个问题有很多重叠子问题,使用动态规划是最有效的。动态规划中每一个状态一定是由上一个状态推导出来的。完全背包问题与01背包问题的区别在于,同一个物品是可以被多次选择的,在前面01背包问题中提到,对背包容量是从大到小遍历,这就是为了防止同一个物品被多次选择。理论基础:有N件物品和最多能背重量为W的背包,第i件物品的重量为weight[i],得到的价值为value[i],因此在完全背包问题中,只需要将对背包容量的遍历也变成从小到大即可。
2024-02-26 18:27:13
1232
1
原创 代码随想录1刷--day8贪心
做题的时候,只要想清楚 局部最优 是什么,如何推导出全局最优,其实就够了。贪心的思想是局部最优推导出全局最优。que如果使用链表,效率会更高一些。如果要使用贪心的思想。
2024-02-21 14:05:31
451
原创 代码随想录1刷--day6 二叉树
如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。:是一个有序树,若左子树并不为空,则左子树上所有结点的值均小于它的根结点的值。若右子子树不为空,则右子树上所有结点的值均大于它的根结点的值;
2024-01-23 16:06:23
1076
1
原创 代码随想录1刷-day5,栈和队列
栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。不像是set 或者map 提供迭代器iterator来遍历所有元素。栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑了。
2024-01-13 19:39:40
417
1
原创 代码随想录1刷-day3哈希表
哈希表也叫散列表,是根据关键码的值而直接进行访问的数据结构。std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。
2024-01-09 18:33:38
419
原创 OSError: [Errno 22] Invalid argument:
OSError: [Errno 22] Invalid argument:
2022-08-15 16:04:23
1258
原创 【自学C】用选择法对10个整数排列
从待排序数列中选出最大的放在首位,两数交换位置#include<stdio.h>int main(void){ int max,buf; int num=0; int a[10] = { 3,18,32,76,89,102,23,43,78,99 }; for (int i = 0; i < 10; i++) { max = a[i]; for (int j =...
2022-02-21 10:32:25
355
原创 【自学C】用筛选法求100以内的素数。
筛选法求100以内的素数#include<stdio.h>int main(){ int a[2][100]; for (int i = 0; i < 100; i++) { a[0][i] = i + 1; a[1][i] = 1; //把标志位都置1,1表示是素数,0表示不是素数 } a[1][0] = 0; //先把1标志为非素数 for (i...
2022-02-21 10:28:29
487
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人