自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二叉树遍历-非递归方法

二叉树遍历-非递归方法二叉树遍历-非递归方法1. 使用迭代方法,不使用递归方法,实现一个二叉树的前序遍历1) 算法思想:使用堆栈辅助2) 实现程序如下:2. 使用迭代方法,不使用递归方法,实现一个二叉树的后序遍历1) 算法思想:使用堆栈辅助2) 实现程序如下:二叉树遍历-非递归方法1. 使用迭代方法,不使用递归方法,实现一个二叉树的前序遍历1) 算法思想:使用堆栈辅助创建一个堆栈和一个链表分别用来存储中间变量和结果,并且将root结点入栈。如果栈不为空,从栈顶出栈一个结点,记为结点n ,存入链表

2020-06-11 21:41:35 455

原创 Java IO 学习笔记

JAVA IO篇1.IO_File_API 使用1.IO_File_API 使用1.1 路径名称分隔符package sdu.io;import java.io.File;/* * 名称分隔符 \ separator */public class PathDemo01 { public static void main(String[] args) { // TODO...

2019-09-18 20:02:05 193 2

原创 单例模式 Singleton

保证一个类仅有一个实例,并提供一个该实例的全局访问点。单例模式的实例构造器可以设置为protected以允许子类派生。单例模式一般不要支持拷贝构造函数和Clone接口,它们有可能导致多个对象的实例,违背单例模式的初衷。如何实现多线程环境下安全的单例?注意双检查锁的正确实现。

2024-10-08 00:25:20 885

原创 postgreSQL中的高速缓存

​如下图所示,当一个postgreSQL进程读取一个元组时,需要获取表的基本信息(例如:表的oid、索引信息和统计信息等)及元组的模式信息,这些信息被分别记录在多个系统表中。通常一个表的模式信息在设定好后的变化频率很低,因此在对同一个表的多个元组操作时,每次都去读取系统表的元组来构建模式信息显然是没有必要的,这也会降低元组的操作效率。为了减少对系统表的访问,在每个进程的本地内存区。

2023-11-13 23:33:42 883

原创 PostgreSQL 14.3 源码安装调试

介绍PostgreSQL 14.3 源码安装,postgresql使用和vscode源码调试。more。

2023-11-12 13:18:55 603

原创 postgreSQL中的TOAST技术

如果一个表中有一个属性是可TOAST的,那么该表将会有一个可关联的TOAST表,其OID存储在表的基本信息(也就是pg_class中的元组)的reltoastrelid属性中。在向支持TOAST的属性中存储超过BLCKSZ/4字节(通常是2K)的数据时,TOAST机制才会被触发。直到 content 的长度为327680时(已远远超过页大小 8K),对应 TOAST 表中才有了数据,且长度都是略小于2K,这是因为 extended 策略下,先启用了压缩,然后才使用行外存储。categories: 数据库。

2023-11-12 13:16:54 860

原创 面向对象设计原则

设计模式金科玉律:复用!变化是复用的天地,面向对象的设计的最大优势是抵御变化。

2022-11-22 23:20:48 157 1

原创 LINUX-多线程同步

功能:销毁或者创建mutex功能:销毁mutex指针指向的锁对象。参数:mutex传入的锁常量初始化,此时可以使用init功能:给共享资源加锁参数:metux init 初始化的锁如果当前未锁,成功,该线程给加锁。如果已经加锁,阻塞等待!注意事项:加锁需要最小粒度,不要一直占用临界区。

2022-09-12 14:53:30 188

原创 LINUX编程-多线程

轻量级进程,本质仍然是进程,都是通过clone函数实现的。进程:独立的地址空间,拥有PCB,最小的资源分配单元线程:没有独立的地址空间,拥有PCB,最小的执行单元。

2022-09-04 23:43:28 136

原创 Iterator_trait总结

Iterator_traits总结

2022-08-28 15:37:37 355

原创 实现简单的List

实现简单的List

2022-08-25 23:52:00 99

原创 职责链模式 Chain of Resposibility

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。职责链模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个”,这个时候请求发送者与接受者的耦合有可能出现变化脆弱的症状,职责链的目的就是将二者解耦,从而更好地应对变化。应用了职责链模式后,对象的职责分派将更具有灵活性。我们可以在运行时动态添加或修改请求的处理职责。如果请求传递到职责链的末尾仍得不到处理,应该有一个合理的缺省机制。

2022-08-21 16:11:20 92

原创 迭代器模式 Iterator

提供一种方法顺序访问一个集合对象中的各个元素,而又不暴露(稳定)该对象的内部实现。迭代抽象:访问一个集合对象的内容而无需暴露它的内部表示。迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。(迭代器失效)

2022-08-21 15:09:44 287

原创 组合模式 Composite

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)。Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致地(复用)处理对象和对象容器,无需关系处理的是单个的对象,还是组合的对象容器。将“客户代码与复杂的对象容器结构”解耦是Composite的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的内部实现结构——发生依赖,从而更能“应对变化”。...

2022-08-19 00:11:00 88

原创 设计模式学习笔记-目录

设计模式学习笔记目录整理

2022-06-19 22:40:21 134

原创 Memento 备忘录模式

学习笔记,设计模式之备忘录模式

2022-06-19 22:21:25 150

原创 State 状态模式

1. 动机在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?enum NetworkState{ Network_Open, Network_Close, Network_Connect,};class NetworkProcessor{ NetworkState state;p

2022-05-29 21:51:00 90

原创 Mediator 中介者模式

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

2022-05-29 20:33:10 113

原创 Adapter 适配器模式

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

2022-05-22 22:46:42 168

原创 Proxy 代理模式

1. 动机在面向对象系统中,有些对象由于某种原因(对象的创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者、或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时,来管理、控制这些对象的复杂?增加一层间接层是软件开发中常见的解决方式。class ISubject {public: virtual void process();};class RealSubject : public ISubject {public: virtual vo

2022-05-19 22:49:01 939

原创 Facade门面模式

1. 动机上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?2. 门面模式定义为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这一系统更加容易使用(复用)。3. 门面模式模型图4. 总结要点从客户程序的角度来看,Facade模式简化了整个组件系统的接

2022-05-18 23:19:02 213

原创 ProtoType原型模式

1. 动机在软件系统中,经常面临着“某些结构复杂的对象”的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。如何应对这种变化?如何向“客户程序”隔离出“这些易变的对象”,从而使得“依赖这些易变对象的程序”不随着需求变化而变化。// 抽象类class ISplitter { public: virtual void split() = 0; virtual ~ISplitter() {}}// 抽象工厂class ISpliterFa

2022-05-17 23:47:20 128

原创 Abstract Factory 抽象工厂模式

1. 动机在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?下面以访问数据库为例,访问数据库具有connection、command和reader 的创建工作,同时数据库分为Oracle、mysql和DB2等种类。class EmployeeDAO {public: vector<Emp

2022-05-14 20:28:38 129

原创 Factory 工厂模式

1. 动机在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?例如解决如下问题:MainForm 类创建分配器时依赖具体的BinarySpliter类,发生了紧耦合。class MainForm : public Form {public: void ButtonClick() { ISplitter

2022-05-14 17:25:25 229

原创 Bridge桥模式

1. 动机由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?class Messager {public: virtual void Login(string name, string passwd) = 0; virtual void SendMessage(string message) = 0; virtual void

2022-04-11 23:54:06 357

原创 Decorator装饰器模式

1. 动机在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?以Stream流为例,实现文件流,内存流和网络流等主体业务,以及对这些主体业务进行扩展,一般的实现方式如下:// 业务操作class

2022-04-10 21:01:13 357

原创 Observer观察者模式

1. 动机在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。以一个文件分割器为例,主窗口点击文件分割按钮,可以将一个文件分割为多个。另外,在分割的过程中需要展示分割的进度。class MainForm : public Form {private:

2022-04-10 15:45:21 707

原创 strategy策略模式

1. 动机在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本 身解耦,从而避免上述问题?如下实例:enum TaxType{ CN_Tax, US_Tax, DE_Tax};class SalesOrder { TaxBase tax;public: double Calcula

2022-04-09 16:47:15 266

原创 分配器allocator和new重载

3. 分配器allocator和new重载3 分配器allocator和new重载3.3 分配器allocator详解3.4 自定义allocator3.5 未初始化内存复制分析3 分配器allocator和new重载3.3 分配器allocator详解分配器allocator实现容器算法时不同于new,它可以将对象内存分配和构造分离。allocator的使用如下所示:# include <iostream>using namespace std;class XData {

2022-04-05 21:14:36 956

原创 linux守护进程

概念:Daemon(精灵)进程,是linux中的后台服务进程,一般独立于控制终端,周期性地执行某种任务或者处理某种发生地事件,一般采用以d结尾地名字。Linux系统地一些后台服务器一般都是守护进程,它们一直运行着,不受登录注销地影响,没有控制终端,不和用户交互。创建守护进程模型会话:进程组的更高一级,多个进程组对应一个会话。进程组:多个进程在同一个组,第一个进程默认为进程组的组长。创建会话的时候,组长可以不创建,必须是组员创建创建会话的步骤:创建子进程,父进程被kill,子进程自当会长。守护进

2021-11-21 19:04:56 473

原创 信号 Signal

1. 信号的概念信号特点:简单,携带少量信息,满足特定条件发生信号机制:进程B发送给进程A, 内核产生信号,内核处理信号产生:按键产生 ctrl +z调用函数 kill abort定时器 alarm settimer命令产生 kill硬件异常,总线错误信号状态:产生递达未决(被阻塞)信号的默认处理方式:忽略执行默认动作捕获信号的4要素编号事件名称默认处理动作...

2021-11-21 17:50:50 263

原创 linux进程通信

IPC (interProcess Communication) 进程间通信,通过内核提供的缓冲区,进行数据的交换机制。IPC通信的几种方式:pipe 管道 最简单fifo 有名管道mmap 文件映射共享IO, 速度最快本地socket最稳定信号 携带的信号量最小共享内存消息队列1. 管道pipe管道通信优劣:优点:简单,相比信号和套接字实现进程通信简单很多缺点:1. 只能单向通信(半双工),双向通信需要建立两个管道?2. 只能用于父子、兄弟(有共同祖先)进程之间的通信。

2021-11-14 23:02:45 572

原创 linux进程控制

1. 创建一个子进程程序demo#include <sys/types.h>#include <unistd.h>pid_t fork(void); // 创建一个子进程pid_t getpid(void); // 获取当前进程的idpid_t getppid(void); // 获取当前进程父进程的idfork函数返回值:失败 返回 -1成功 两次返回  父进程返回子进程的 pid_t  子进程返回 0创建一个子进程的程序:#in

2021-11-13 22:56:05 773

原创 解决gdb没有core文件的问题

定位问题:1.用 ulimit -a 查看 core file size 项是否为 unlimited。如果不是,修改成unlimited (指令:ulimit -c unlimited)2.检查core产生路径是否正确, cat /proc/sys/kernel/core_pattern,如果路径不存在,则设置:echo “./core-%e-%p-%s” > /proc/sys/kernel/core_pattern...

2021-09-20 20:18:42 1309

原创 VSCode远程编译代码

1. 编译器调试安装安装gdb,gcc,g++yum install gdbyum install gcc-c++检查是否安装成功gcc --versiongdb --versiong++ --version安装cmake#安装wgetyum install -y wget#获取CMake源码包wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz#解压CMake源码包tar -zxvf cmake-2.8.10.

2021-08-14 17:58:40 885

原创 搭建Vscode开发环境

小白菜使用Vscode搭建C/C++环境一、Mingw编译器下载安装1. 下载2. 安装二、Vscode下载安装1. 下载2. 安装3. 语言设置4. 解决终端无法输入问题一、Mingw编译器下载安装1. 下载下载地址:https://nuwen.net/mingw.html2. 安装为了能让Vscode使用gcc和g++编译器,配置Mingw的环境变量验证是否安装成功二、Vscode下载安装1. 下载地址:https://code.visualstudio.com/微软开发、免费

2021-08-14 11:35:02 440

原创 解决github不显示图片问题

修改本地主机 hosts文件 C:\Windows\System32\drivers\etc\hosts本地主机的hosts文件用于存储域名解析。使用管理员权限打开文件,然后在文件末尾添加如下内容:#GitHub Start192.30.253.112 Build software better, together192.30.253.119 gist.github.com151.101.184.133 assets-cdn.github.com151.101.184.1

2020-11-29 19:32:49 120

翻译 网络优化(凸优化)-笔记1

网络优化-笔记11. 帕累托(Pareto)优化定义 A\mathcal{A}A 为在 R2\R^{2}R2 中所有 (x,y)(x,y)(x,y) 向量的集合,该集合可以通过系统模型 m∈Mm\in\mathcal{M}m∈M 获得:A={(x(m),y(m))∈R2:m∈M}\mathcal{A}=\{(x(m),y(m))\in R^{2}: m\in\mathcal{M}\}A={(x(m),y(m))∈R2:m∈M}。每一个 (x,y)(x,y)(x,y) 在集合 A\mathcal{A}A

2020-11-29 11:57:49 280

原创 2020-08-24

中缀表达式和后缀表达式1. 中缀表达式(栈实现综合计算器)请输入一个表达式:计算:722-5+1-5+3-3思路分析:通过一个index值(索引)来遍历我们的表达式;如果发现是一个数字,就直接入数栈;如果发现扫描到一个符号,就分如下情况;3.1 如果当前符号栈为空,就直接入栈;3.2 如果符号栈有操作数,就进行比较,如果当前操作符的优先级小于或则和等于栈中的操作符,就需要从数栈种pop出两个数,从符号栈种pop出一个运算符,进行运算,将得到的结果入数栈,然后将当前的操作符入符号栈;如果当

2020-08-24 16:55:48 87

原创 贪心算法

集合覆盖问题1. 问题描述假设存在下面需要付费的广播电台,以及广播台信号可以覆盖的地区。如何选择最少的广播台,让所有的地区都可以接受信号。广播台覆盖地区K1“北京”,“上海”,“天津”K2“广州”,“北京”,“深圳”K3“成都”,“上海”,“杭州”K4“上海”,“天津”K5“杭州”,“大连”2. 贪心算法思路遍历所有的广播电台,找到一个覆盖了最多未覆盖的地区的电台(此电台可能包含一些已覆盖的地区,但是没有关系)将这个电台加入到一个集合中

2020-06-24 15:40:08 100

空空如也

空空如也

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

TA关注的人

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