设计模式
设计模式
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的代码编写经验。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式六大原则1、开闭原则(Open Close Principle)
开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则是面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则(Dependence Inversio ...
C++优先队列用法
C++优先队列用法优先队列是C++中STL的派生容器,它仅考虑最高优先级元素,队列遵循FIFO策列,而优先队列根据优先级弹出元素,优先级最高的元素首先弹出。
函数原型:priority_queue<Type, Container, Functional> m_queue;
Type:表示数据类型
Container:表示容器类型(必须是用数组实现的容器,比如vector,deque等)
Functional:表示比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
123456// 升序队列priority_queue <int, vector<int>, greater<int>> q;// 降序队列priority_queue <int, vector<int>, less<int>> q;//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函 ...
C++多线程编程
C++11多线程编程C++11 Thread线程库的基本用法
进程:运行中的程序,线程:进程中的进程
一个操作系统可以有多个进程,一个进程中可以有多个线程,线程的最大数量取决于电脑CPU的核数
导入头文件thread
创建线程 thread th(function, arg)
创建线程需要绑定一个函数,function表示已经定义的函数名,通过arg可以传入函数的参数,线程在std标准库当中
创建线程对函数加引用&和不加引用的区别
当线程需要执行的函数中需要使用引用传递参数时,在主线程中传入变量值,程序将无法通过编译,需要使用std::ref来确保引用传递
12345678910111213void threadFunction(int &x) { // 现在x确实是主线程中x的引用}int main() { int x = 0; // 编译报错 // std::thread t(threadFunction, x) std::thread t(threadFunction, std::ref(x) ...
C/C++中gcc/g++的参数详解
C/C++中gcc/g++的参数详解
参考链接:https://www.runoob.com/w3cnote/gcc-parameter-detail.html
GCC(GNU Compiler Collection)和G++分别是GNU(自由和开放源码的操作系统)的C和C++编译器。在执行编译的过程中,总共需要执行4步
预处理:预处理器(cpp:C Preprocessor)根据以字符#开头的命令,修改原始的C程序,即将头文件作为当前文件的内容插入到程序文本当中。得到另一个C程序,生成的文件为.i文件
编译:编译器(ccl)将预处理后的文本文件文件.i翻译成文本文件.s文件,即汇编语言
汇编:汇编器(as)将汇编语言翻译成能够供机器识别的机器指令,并保存在.o目标文件中,这是二进制文件
链接:链接器负责链接目标代码,生成可执行文件,如:main中调用的一个函数,则会把那个函数进行链接
基本编译参数
-o <file>: 指定输出的可执行文件名。如果不使用该参数,默认的输出文件名为a.out。
-c: 只编译并生成目标文件(.o文件),不进行链接。
-E: 只进行预处 ...
常见的排序算法
排序算法
输入:整数数组nums
输出: 按照升序排序
12345// 函数接口vector<int> sortArray(vector<int>& nums) { return nums;}
选择排序思想:每次选择数组当前数组中最小的元素,放置到数组当前未选定的最前的位置
时间复杂度:n^2
123456789101112vector<int> sortArray(vector<int>& nums) { int n = nums.size(); for(int i = 0; i < n-1; ++i){ for(int j = i+1; j < n; ++j){ if(nums[i] > nums[j]){ std::swap(nums[i], nums[j]); } } ...
CMU15445数据库学习笔记01-04
01-Relational Model & Relational Algebra数据库基本概念数据库管理系统:允许应用在数据库中存储、操作、分析数据信息的一种软件。通常的数据库管理系统(DBMS)支持通过一些数据模型(data model)定义、创建、查询、更新以及数据库的管理工作
数据模型(data model): 将存储的概念的高级抽象在数据库中,是数据库中描述数据的一种概念集合,能够表明数据的形状、属性等。
关系型数据模型:关系型数据库
非关系型模型Nosql:key/value、Graph、Document/Object
矩阵/向量/列表
分层、网络
模式(schema):是一个逻辑概念,用于组织数据库中的对象。模式中的对象通常包括表、索引、数据类型、序列、视图、存储过程、主键、外键等。
关系型模型(Relational Model)定义了一个数据库抽象层,用于如何替换表示关系以避免数据库维护的开销。
三大原则
存储数据库的简单数据结构
数据库的存储由数据库管理系统来实现,无需用户定义数据的存储形式,例如tree等
允许数据使用高级语言,数据库管理系统产生最优的执 ...
数据库-MySQL
数据库-Mysql
Mysql数据库的关键词:事务、存储引擎、索引、SQL优化、锁、日志、主从复制、读写分离、分库分表
数据库基础1、Mysql概述关系型数据库:建立在关系模型基础上,由多张互连接的二维表组成的数据库
特点:使用表存储数据,便于维护;使用sql语句操作,使用方便
MySQL数据模型
1、客户端通过与数据库管理系统进行连接
2、使用sql语句通过数据库管理系统对指定的数据库进行增删改查
3、一个数据库模型中可以对多个数据库进行管理,一个数据库中可以拥有多个表
// TODO数据库模型的图
2、SQLSQL分类
分类
全称
说明
DDL
Data Definition Language
数据库定义语句,定义数据库对象,数据库,表,字段等
DML
Data Manipulation Language
数据库操作语句,用于对数据库表中的数据进行增增删改
DQL
Data Query Language
数据库查询语句,查询数据库表中的记录
DCL
Data Control Language
数据库控制语句,创建数据库用户,控制数据库的访问权限
...
进程间的通信方式
进程间的通信方式每个进程的用户地址空间是独立的,一般情况之下,不同的进程是无法通过进程间各自的地址空间来进行互相访问,但是不同的进程所拥有的内核空间是共享的,因此如果不同进程之间需要进行通信必须要通过内核。
管道通信管道通信分为匿名管道和命名管道,通过名字可以区分,匿名管道是无法获取和控制的管道,命名管道是通过用户可以自己建立的管道。
管道智能进行半双工的通信,即数据传输是单向的,如果想要实现互相通信,就需要创建两个管道。
匿名管道
在linux中的|竖线就是一个管道,将管道符前的操作的输出作为管道符后的操作的输入
一个匿名管道的创建会使用到下面的系统调用
1int pipe(int fd[2]);
表示创建了一个匿名管道并返回了两个文件描述符,一个是管道读取端的描述符fd[0],另一个是管道写入端的描述符fd[1],匿名管道是特殊的文件,只存在于内存当中,不存在于文件系统中
管道实际上就是内核中的一串缓存,进程通过文件描述符来对这一串缓存进行读写操作
如果说需要实现多个进程之间的通信,可以使用fork操作来创建子进程,创建子进程时,子进程会同时复制父进程的文件描述符,两个进程便可 ...
C++使用zlib库来压缩文件
C++使用zlib库来压缩文件zlib压缩库提供内存压缩和解压缩功能,包括对未压缩的完整性检查数据,提供支持的压缩方法为:deflation,默认使用压缩数据格式为zlib格式。
zlib库支持读取和写入gzip(.gz)格式的文件,zlib格式旨在紧凑且快速,可用于内存和通信渠道。gzip格式设计用于文件系统上的单文件压缩,比zlib具有更大的头部以维护目录信息,并且使用与zlib不同且更慢的检查方法。
该库不安装任何信号处理程序。解码器检查压缩数据的一致性,因此即使在输入损坏的情况下,库也不应崩溃。
数据流结构12typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size);typedef void (*free_func)(voidpf opaque, voidpf address);
typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size);这个函数指针通常用于内存分配,允许用户自定义的内存分配函数
typedef void ...