将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
设计原则:
不会变化的是创建两个方法,变化的是怎么创建,于是抽取基类和两个创建方法
聚合了会发生变化的基类
实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113#include <iostream>#include <string>// Product classclass Pizza {public: void setDough(const std::string& dough) { m_dough = dough; & ...
聚合查询聚合函数
count 计算记录数
sum 求和
avg 求平均
max 最大
min 最小
求行数12SELECT COUNT(*)FROM Product;
使用distinct删除重复值12SELECT COUNT(DISTINCT product_type )FROM Product;
分组GROUP BY123SELECT product_type,COUNT(*)FROM ProductGROUP BY product_type;
使用where时,select的语句执行顺序为:
from->where->group by->select
GROUP BY 不能使用别名
使用GROUP BY 不能出现聚合键以外的别名
where中不能使用聚合函数
为聚合结果指定条件HAVING子句1234SELECT product_type,COUNT(*)FROM ProductGROUP BY product_typeHAVING COUNT(*) = 2;
HAVING 能够使用的三种情况:
常数
聚合函数
GROUPBY指定的类名 ...
最近听完了张志伟的西方哲学史的课,准备借助网上资料整理一下西方哲学史的脉络结构
古希腊哲学苏格拉底之前的哲学家米丽都学派米丽都学派(Milesian school)是西方哲学史上最早的一派哲学流派,大约成立于公元前6世纪,它起源于古希腊的爱奥尼亚地区,其中心在米利都城市(今土耳其的米拉斯)。米丽都学派的哲学家们是最早尝试用自然原理而非神话来解释世界的人,他们被认为是西方哲学和科学的先驱。
泰勒斯
水是万物之源
阿那克西曼德
泰勒斯的学生,提出了“无限”是万物之源
阿那克西美尼
空气是万物之源,空气可以变化出火、水、土
毕达哥拉斯学派毕达哥拉斯
勾股定理
核心思想是万物皆数,万物都可以用数学来解释和理解
爱菲斯学派赫拉克利特
世界是一个不断变化和流动的过程
世界是由对立面统一构成的
爱利亚学派巴门尼德
创始人
存在是不可变,永恒的,唯一的存在是“一”,感官是骗人的,要通过理性思考来追求真理
原子论德谟克利特
创始人
他认为世界是由无数个不可再分的、永恒不变的微小粒子组成的,这些粒子被他称为“原子”。原子具有不同的形状、大小和运动方式,它们通过碰撞和组合形成了世界上的一切物质 ...
Select语句基础列的查询12SELECT product_id,product_name,purchase_price FROM Product;
查询所有的列1SELECT * FROM Product;
为列设置别名使用AS关键词设置别名:
12SELECT product_id AS id,product_name AS name,purchase_price AS priceFROM Product;
使用汉语别名需要使用双引号
从结果中删除重复行使用distinct:
12SELECT DISTINCT product_typeFROM product;
选择记录使用where
123SELECT product_nameFROM productWHERE product_type = '衣服';
where要紧跟在from之后
注释1234-- 单行注释/* 多行注释 第二行*/
算数运算符和比较运算符算数运算符12SELECT product_name,sale_price,sale_price*2 AS "sale_p ...
有些解题方法其实很常规但是一直做不好,准备专题做一些题目,这一轮做二分法专题
这篇博客用于记录这个专题的学习
简介以在一个升序数组中查找一个数为例,每次考察当前数组的中间部分,如果刚好是要找的,那就结束搜索过程,如果中间元素小于所查找的值,那么左侧更小,只需要右侧查找,反之只需要去左侧查找。
二分查找
在一个已知的有序数据集上进行二分查找
二分答案
答案有一个区间,在这个区间中二分,直到找到最优答案
二分查找前提条件:数组有序
待查数组需有序,搜索区间两端闭;
while 条件带等号,否则补丁打不及。
if 相等便返回,其他杂事可不提;
mid 必须加减一,因为区间两端闭。
while 结束就GG,凄凄惨惨返-1;
如果元素有重复,相等返回需注意。
最简单的二分查找搜索一个数,存在返回索引不存在返回-1
123456789101112131415int check(vector<int>& num,int t){ int left = 0; int right = num.size()-1; while(left<=ri ...
安装本书使用的是postgre数据库,跟MYSQL使用的SQL语句格式基本一样。
遇到的问题:
Navicat破解的时候要断网
Navicat最好使用版本16以上,否则连接数据库会出错
准备操作
创建数据库
1CREATE DATABASE shop;
创建表
123456789CREATE TABLE Product(product_id CHAR(4) NOT NULL,product_name VARCHAR(100) NOT NULL,product_type VARCHAR(32) NOT NULL,sale_price INTEGER ,purchase_price INTEGER ,regist_date DATE ,PRIMARY KEY(product_id));
上面的表中,第一列是列名:
命名规则:
只能使用半角英文字母、数字和下划线作为名称
名称必须以半角英文字母开头
名称不能重复
第二列是数据类型,也是必须的:
数据类型表示数据的种类,包括数字型、字符型和日期型等
学习SQL语句时,我们只需要学习几种基本的数据类型:
INTEGER
整数类型 ...
我们定义了抽象产品A和B以及它们的具体实现类。然后,我们定义了抽象工厂和具体工厂1和2,每个具体工厂都实现了创建产品A和B的方法。在主函数中,我们使用具体工厂1和2创建了产品A和B。
跟简单工厂模式不一样的是,工厂也变成了多个工厂,即举个例子,肯德基和麦当劳都可以做不一样的炸鸡汉堡。
实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102#include <iostream>// 抽象产品Aclass AbstractProductA {public: virtual void operationA() = 0;};// 具体产品A1class ConcreteProductA1 : public Abstr ...
思路工厂模式是一种创建型设计模式,它提供了一种将对象的创建逻辑封装在一个单独的类中的方式。工厂模式通过定义一个公共的接口来创建对象,而不是直接在客户端代码中使用new关键字来实例化对象。这样做的好处是,客户端代码与具体的产品类解耦,使得代码更加灵活、可扩展和可维护。
工厂模式通常包含以下几个角色:
抽象产品(Abstract Product):定义了产品的接口,所有具体产品类都必须实现这个接口。
具体产品(Concrete Product):实现了抽象产品接口的具体产品类。
工厂(Factory):负责创建产品对象的类,它包含一个创建产品的方法,根据传入的参数或条件来决定创建哪种具体产品。
客户端代码通过调用工厂类的方法来创建产品对象,而不需要直接实例化具体产品类。这样,当需要创建不同类型的产品时,只需要修改工厂类的创建方法,而不需要修改客户端代码。
优点
将产品的创建和使用解耦,客户端代码只需要关心产品的接口,而不需要关心具体的产品类。
可以通过工厂类的创建方法来集中管理产品的创建逻辑,使得代码更加灵活和可维护。
可以通过工厂类来隐藏具体产品的实现细节,提高代码的安全性。
实现 ...
定义是一种可以代替平衡树的数据结构,可以看做是并联的有序链表。跳跃表通过概率保证平衡,而平衡树采用严格的旋转来保证平衡,因此跳跃表比较容易实现,而且相比平衡树有着较高的运行效率。下面实现的最大level为16.
操作
插入
查找
删除
这里是一个单向链表,其实也可以维护一个双向的链表
实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135#include <iostream>#include <vector>#in ...
前言决定开坑leveldb的学习,还是借助up主的博客学习,轻松一点,借鉴的是硬核课堂的文档。
LevelDB是一款写性能十分优秀的可持久化的KV存储引擎,其实现原理是依据LSM-Tree(Log Structed-Merge Tree),由Google开源。
设计思路对于普通机械磁盘,由于写操作需要磁盘旋转和磁道寻址,顺序写的性能要比随机写的性能好很多。比如对于15000转的SAS盘,4K写IO,顺序写在200MB/s左右,而随机写性能可能只有1MB/s左右,LevelDB的设计正是利用了磁盘的这个特性。
LevelDB是依据LSM-Tree的原理实现的,写性能极高。
LSM原理介绍LSM-tree 是专门为KV存储系统设计的,Key-Value类型的存储系统最主要的两个功能:
put(key,value):写入一个Key-Value ;
get(key):给定一个 key 查找 value。
从名字上来看,LSM树由两部分组成,分别为Log Structed 和Merge Tree。
“Log Structed”是日志结构的意思,而我们常说的日志就是软件系统输出的执行信息,其 ...