策略模式 定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 OO(Object Oriented)面向对象 基础:抽象、封装、多态、继承 原则: 找出应用中可能需要变化之处,把它们独立出来。 针对接口编程,而不是针对实现编程。 多用组合,少用继承。 观察者模式 定义了对象间的一对多依赖,这样一来,当一个对象改变时,它的所有依赖者都会收到通知并自动更新。 主题(可观察者)用一个共同的接口来更新观察者。 观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口。我们可以独立地复用主题或者观察者,改变主题或者观察者其中一方,不会影响另一方。 可以从被观察者处推(push)或者拉(pull)数据。(推的方式更好) 有多个观察者时,不可以依赖特定的通知次序。 Java有多种观察者模式的实现,包括通用的java.util.Observable,但要注意它是一个类,限制了它的使用和复用。如果有必要,可 继续阅读 >>


李猛 18/04/18 23:21:50
首先解释一下什么是拷贝控制 ?其实就是拷贝构造函数、赋值操作符和析构函数这三种函数 . 那么如何编写这三个函数就叫做拷贝控制了. 1.整体需求 : 总共设计两个类: 1.一个是Message,代表电子邮件消息(或者其它) 2.一个是Folder ,代表消息目录 用生活中最一般的想法去思考,每一个消息目录中可以有许多消息(也可以有相同消息) , 每一条消息也可以出现在多个目录中 如下图所示 : 2 .程序架构设计 : 1. 记录Message在哪个Folder 中,记录Folder中有哪些Message ? 在 Message 中保存一个它所在的 Folder 的指针的set 集合 .(也就是说每一个Message中都有一个set集合) 同样的,在 Folder 中保存一个它包含的Message 的指针的set 集合 . 2. 删除一条 Message 时如何处理 ? 当我们删除一条 Message 时 ,我们需要考虑的是如何去删除其他目录中的 继续阅读 >>


刘生玺 18/04/18 21:23:13
https://github.com/lzj112/C-Plus-Plus/tree/master/%E8%BD%AF%E4%BB%B6%E6%9D%AF/Merkle_Tree_test1 作者:weixin_36888577 发表于 2018/04/18 21:19:10 原文链接 https://blog.csdn.net/weixin_36888577/article/details/79997040 阅读:14 继续阅读 >>


吕子健 18/04/18 21:19:10
代码编译运行环境:VS2012+Debug+Win32 模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程。对于函数模板而言,模板实例化之后,会生成一个真正的函数。而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始化。模板的实例化分为隐式实例化和显示实例化。 对函数模板的使用而言,分为两种调用方式,一种是显示模板实参调用(显示调用),一种是隐式模板实参调用(隐式调用)。对于类模板的使用而言,没有隐式模板实参和显式模板实参使用的说法,因为类模板的使用必须显示指明模板实参。各个概念请勿混淆。 1.隐式实例化 1.1模板隐式实例化的定义 这是相对于模板显示实例化而言。在使用模板函数和模板类时,不存在指定类型的模板函数和模板类的实体时,由编译器根据指定类型参数隐式生成模板函数或者模板类的实体称之为模板的隐式实例化。 1.2函数模板隐式实例化 函数模板隐式实例化指的是 继续阅读 >>


吕子健 18/04/17 21:09:39
jsoncpp 一. json基础 类型: 1. Json::Value为主要数据类型; 2. Json::Reader将文件流或字符串创解析到Json::Value中,主要使用parse函数;3. Json::Writer:与JsonReader相反,将Json::Value转换成字符串流等,Writer类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:son::FastWriter(将数据写入一行,没有格式),Json::StyledWriter(按json格式化输出,易于阅读) 二. 解析json 1. 从内存解析json void f() { Json::Value root; Json::Reader reader; char str[] = "{\"name\" : \"liushall\", \"age\" : 20, \ \"files\" : [\"1.json\", \"2.json\ 继续阅读 >>


王良 18/04/15 23:47:04
这个需求比较奇怪,要求实现Sum和MagaSum函数,实现以下功能 Sum(1) =>1 Sum(1,2,3) =>6 MegaSum(1)() =>1 MegaSum(1)(2)(3)() =>6 实际上Sum就是Python自建的sum函数,它支持变参,变参怎么实现,自然是*args,所以很容易写出雏形: Sum def Sum(*args): count = 0 for i in args: count+=i return count 第二个函数就有点皮了,它要求有参数的时候,返回的值是一个函数的引用,无参数的时候,返回的是结果。 要实现可以有或无参数,那么首想到的是Python的默认参数。我们可以默认参数值是None,当主动传入参数时,返回一个函数的引用,否则,返回结果。这里用到了Python可变类型作为函数参数时的一些特性。代码如下: def Sum(*args): s = 0 for i i 继续阅读 >>


李余通 18/04/15 20:50:14
一. 静态多态 1. 何为静态多态? 又称编译期多态,即在系统编译期间就可以确定程序将要执行哪个函数。例如:函数重载,通过类成员运算符指定的运算。 2. 示例代码 函数重载示例: class A { public: A() {} A( int x ) {} void f() {} void f( int x ) {} }; class B { public: B() {} void f() {} void f( int x ) {} }; 以上,类A中两个A()是函数重载,两个f()是函数重载,类B同理。 二. 动态多态 1. 何为动态多态? 动态多态是利用虚函数实现运行时的多态,即在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会跳转到哪一个函数。 动态多态是在虚函数的基础上实现的,而实现的条件有: (1) 在类中声明为虚函数 (2) 函数的函数名,返回值,函数参数个数,参数类 继续阅读 >>


王良 18/04/15 19:00:38
需要虚析构函数的原因: 首先看一下这段代码: #include <iostream> using namespace std; class A { private: int *a; public: A() { a = new int; cout << "A::A() is called.\n"; } ~A() { delete a; cout << "A::~A() is called.\n"; } void print() { cout << "A::print() is called.\n"; } }; class B : public A { private: int *b; public: B() { b = new int; cout << "B::B() is called.\n"; } ~B() { delete b; cout << "B::~ 继续阅读 >>


王良 18/04/15 11:40:39
1.进程调度的功能 记录系统中所有进程的状态、优先数和资源的需求情况 确定调度算法。决定将CPU分配给哪个进程及多长时间 分配处理机给进程 2.进程调度方式 非抢占式 :直到进程完成或因为某时间而不能运行时,才将CPU分配给其他进程 。通常用在批处理系统中。主要优点是简单、系统开销小 抢占式 :当一个进程正在执行,系统可以基于某种策略剥夺CPU给其他进程。剥夺的原则有:优先权原则、短进程优先原则和时间原则。主要用于分时系统和实时系统,以便及时响应各进程请求 3.引进进程调度的时机 正在执行的进程正确完成/由于错误终止运行(陷阱和中断) 执行的进程提出I/O请求,等待其完成 分时系统中,进程时间片用完 按照优先级调度时,有更高的优先级进程变为就绪时(抢占方式) 发生阻塞(执行的进程执行了wait、阻塞原语和唤醒原语时) 4.进程调度算法的评价准则 1)面向系统的调度性能准则 吞吐量 处理及利用率 各个设备的均衡利用 2)面向用户的调度性能准则 周转时间 响应时 继续阅读 >>


吕子健 18/04/14 22:18:09
既然是队列那么先要包含头文件#include <queue> 优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的 定义:priority_queue<Type, Container, Functional> Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆 一般是: //升序队列 priority_queue <int,vector<int>,greater<int> > q; //降序队列 priority_queue <int,vector<int>,less<int> > 继续阅读 >>


吕子健 18/04/14 10:58:07