OpenCV C++记录(一):基于MinGW的环境搭建
g++环境搭建
暂时采用VsCode与g++环境做基础测试,g++编译器采用mingw。
现在发现sourceforge好像没有挂载mingw下载了,或者我找不到入口,还是找到一个项目可以下载:
mingw下载,一般的C++项目posix或win32都无所谓,其差别在于多线程环境,但是OpenCV建议线程模式是posix,那就听劝,我下载的是2022.8.22的x86_64-12.2.0-release-posix-seh-rt_v10-rev0.7z,其他版本自行甄别。
解压,将文件夹的bin目录加入环境变量,Vscode搜C++/C配置Ui,配置对应的编译器路径(为了生成c_cpp_properties.json),搜task选择编译器任务(为了生成task.json),就能得到VsCode编译C++环境。(这部分以前没有接触过的建议CSDN查详情)。
验证:cmd输入g++ -v会输出对应编译器信息,或者验证VsCode是否能够正常编译代码。
OpenCV环境
对mingw和VsCode而言OpenCV需要自己用cmake编译,而如果是Visual
Studio则 ...
设计模式(一):观察者模式
观察者模式
观察者模式是一种一对多的行为型设计模式,面向的需求是观察者A对B的变化高度敏感,B发生变化时需要及时做出处理。涉及的角色有:
抽象通知者/抽象被观察者(Subject):将任意数量的观察者保存在一个容器中,提供一个接口增删观察者;
具体通知者/具体被观察者(Concrete
Subject):在内部情况发生变化后,向注册过的所有观察者发生通知;
抽象观察者(Observer):定义更新接口,在通知者变化时能够通知自己;
具体观察者(Concrete
Observer):具体实现更新接口,在通知者状态变化时做出处理行为;
特点
通知者/被观察者只有一个,观察者可有多个,观察者关心通知者的变化;
信息传递是单向的,通知者发送消息,观察者接受信息;
信息通过类似回调函数的机制进行传输,通知者状态变化调用更新函数,无需观察者定期轮询;
缺点:
通知者逐个调用观察者函数接口,当对象很多时通知效率和实时性变低;
当观察者和观测目标存在循环依赖,系统无法正常使用;
观察者模式没有机制表明观察对象具体的变化,只是知道对象发生变化。
模 ...
C++ 11 新特性总结(二):匿名函数、function&bind
C++11匿名函数
本文记录了匿名函数基本使用,并且引入函数指针、回调函数相关知识,介绍如何简洁地在C++11后使用function、bind等,在普通、成员函数实现回调,并且解决以往在仿函数、匿名函数函数指针无法实现问题。
定义一个匿名函数: 1auto add = [](int a,int b)->int{return a+b;};
左侧是自动推导类型和函数名,右侧结构是: 1234[捕获外部变量](参数列表)->返回值类型{函数体}//其中"->返回值类型均可省略",因为匿名函数的返回值可以直接推导,因此:auto add = [](int a,int b){return a+b};
捕获外部变量
匿名函数的基本结构和普通函数都是类似的,例如参数列表、函数体、函数名等,优化了自动推导类型,需要理解的只有这个外部变量的捕获,因为匿名函数的产生,C++函数更容易写出嵌套写法,因此有了捕获外部变量的问题,常见的是来自外层函数的局部变量等。
基本含义标识是: 1234567891 ...
MySQL数据库学习笔记(五):MySQL数据类型与约束条件
MySQL数据类型
整型
整数类型
占字节数
范围
TINYINT
1
SMALLINT
2
MEDIUMINT
3
INT、INTEGER
4
BIGINT
8
整型可选属性
1. MySQL5.7以下属性:ZEROFILL
MySQL5.7及之前版本的整型带位宽显示,表示负数(含符号位)占的位宽长度,当输出整数需要统一位宽时(不足位宽以0填充高位,超出位宽则不影响),可以使用ZEROFILL保留字修饰数据(此时类型字段转变成UNSIGNED无符号)。
12salary int,id int(5) ZEROFILL -- 123输出00123,123456仍然输出123456; 但MySQL在8.0以上已经不建议使用位宽显示。
2. 无符号UNSIGNED
使用UNSIGNED修饰表示其是无符号数,对应范围应该是0——2^{占位数}-1,例如TINYINT对应0——255;
1id TINYINT UNSIGNED -- 或者其他int类型
...
MySQL数据库学习笔记(四):数据库/表的DDL与数据的DML
此前仅介绍了最常用的数据的查询操作,属于数据的DML(数据操作语言),此外还有增删改操作,同属于DML。此外需要先了解数据库、表的结构定义,也即数据库、表的增删改,属于DDL(数据定义语言)。DDL直接决定数据库、表、索引、视图等结构,不能回滚(或备份回滚),而DML是针对数据的增删改查,可以回滚(关闭自动commit)。
数据库的DDL
数据库的创建
数据库、表、字段都有命名规则,数据库、表名长度不能大于30个,变量不能超过29个,且只能包含63种字符(大小写字母52种,数字0到9,下划线_),且命名不能重复,使用保留字需要着重号;
创建一个数据库
当同名数据库存在不会重复创建、不会报错,以字符集utf8(低版本MySQL可能默认非utf8,建议显式指定)
1CREATE DATABASE IF NOT EXISTS mytest1 CHARACTER SET 'utf8';
查看数据库创建信息
1SHOW CREATE DATABASE mytest1;
输出 123CREATE DATABASE `mytest1` #名称/*!40100 ...
数据结构算法题目(六):优先队列专题
优先队列
优先队列是相对于普通队列而言的,普通队列是一种FIFO结构,优先队列能够按照元素的优先级进行排序,使优先级高的元素先出队。C++提供了一种数据结构priority_queue来定义优先队列,可见其在数据结构和算法上是有用的,例如排序、数据压缩、prim/Dijstra优化算法等。
优先队列可以使用数组、链表、二叉堆实现,二叉堆的出队、入队复杂度是O(logn),因此一般选择二叉堆作为优先队列底层实现,本文旨在记录手写一个二叉堆(大根堆、小根堆)实现优先队列底层基本操作,包含调整、构建二叉堆、排序、插入、删除等,在数据结构与算法(三):查找与排序算法基本实现了前三种操作。
大小根堆(大小顶堆)
在堆排序文章基本描述了两种结构,为了给数组排序,通过i、2i+1、2i+2数组位置元素进行讨论,结构上是一种树的重构,大根堆是根结点>=子结点,小根堆是根结点<=子结点,增序排序使用大根堆,增序排序是小元素下滤的过程,最后留在根结点的是最大的元素,再与最后的小结点交换,继续递归下滤。降序排序则是大元素下滤的过程,留在根结点的是最小元素。排序实际上是不断排除最大/最小元 ...
MySQL数据库学习笔记(三):单行函数与多行函数
函数
大量的MySQL数据处理函数(取自尚硅谷公开资料)。
1. 数值函数
函数名
作用
ABS(x)
返回x的绝对值
SIGN(X)
返回X的符号。正数返回1,负数返回-1,0返回0
PI()
返回圆周率的值
CEIL(x),CEILING(x)
无论正数负数,向大于x一侧最近整数取整
FLOOR(x)
无论正数负数,向小于x一侧的最近整数取整
LEAST(e1,e2,e3…)
取最小值
GREATEST(e1,e2,e3…)
取最大值
MOD(x,y)
返回X除以Y后的余数
RAND()
返回0~1的随机值
RAND(x)
返回0~1的随机值,其中x的值用作种子值,相同的X值会产生相同的随机数
ROUND(x)
四舍五入,只保留整数
ROUND(x,y)
x四舍五入,保留y位小数
TRUNCATE(x,y)
返回数字x截断为y位小数的结果
SQRT(x)
返回x的平方根。当 ...
数据结构算法题目(五):动态规划问题的一维压缩算法
之前放在数据结构算法题目(二):回溯、贪心、动态规划与图论略显臃肿,现在单独拎出来,记录了动态规划的一维压缩问题,有一些问题二维解法更加直观(大部分),但是有些解法一维解法更加简便(例如组合总和Ⅴ),而且一维解法性能往往更高,希望能加深理解。
二维解法理解参考上文或卡哥原文,本文基本不会记录从0进行二维递推。
规律
一维化的遍历顺序是有基本规律的,例如遍历顺序是如何的、是否需要记录上一层值,本文涉及的问题主要有以下:
当前值来自左边和正上方,从上到下、从左往右更新,注意第一列初始条件是否适合一维化。(机器人走方格图的不同路径问题)。
当前值来自正上方dp[i-1][j]和左上方dp[i-1][j-n],例如01背包问题:从上往下、从右往左遍历。
为什么01背包是从右往左遍历:一直的写法是遍历种类i,i每循环一次,代表dp[j]更新一次,代表i个物品自由组合,和二维dp数学意义一致;遍历j代表遍历背包容量,要从右往左遍历,是因为j大,代表背包容量大,j较小的值得到的最大价值一定是j值大的最大价值的子集问题。例如j=2和j=4,j=2的最大价值组合,也一定包含在j= ...
MySQL数据库学习笔记(二):多表查询与子查询
表间数据关系
一个数据库可以有很多表,表和表之间数据记录可能存在联系,MySQL定义了若干种关系,包括一对一、一对多、多对多和自我引用。
一对一(少用):两张表主键完全一对一,例如学生的成绩表、学生的身份证表,二者主键(学生)一一对应,没有额外的对象。
一对多(常见):一张表的对象作为另一张表的主键,或称另一张表多个外键指向当前表的主键。例如部门表和员工表,客户和订单表、分类和商品表。(心中默念:一个部门有多个员工,一个员工不能多个部门;一个客户多个订单,一个订单不可能多个客户......就是一对多)
多对多:默念不过关就是多对多。
自我引用:本表中创建一个外键,外键指向本表的主键。例如现在数据库记录了若干个回复评论的人,现在创建一个"回复对象"字段(外键),那么回复对象一定指向原来回复评论的人(主键),就是一种自我引用关系。
逐表查询与笛卡尔积错误
假设现在具有一对多关系的部门表和员工表,现在需要通过员工姓名,查找其部门名称;首先查询员工表通过姓名查询部门id,从部门表通过部门id查找部门name:
1234567SELECT department_idFRO ...
MySQL数据库学习笔记(一):概述与基本SELECT语句
数据库相关概念
数据库(Database,DB):本质是一个文件系统,保存了一系列有组织的数据。
数据库管理系统(Database Management
System,DBMS):操作和管理数据库的大型软件,用户通过此访问和管理数据库数据。
结构化查询语言(Structure Query Language,SQL):数据库交互语言。
关系型与非关系型数据库
RDBMS
RDBMS(RDBMS,Relational~):最古老的数据存储形式,使用二维表格的形式(行、列)来存储数据。
优点:支持复杂查询和事务处理(加锁等)、数据以表格形式存储,表间可以建立关系(多表查询)。
缺点:扩展性较差、大数据处理性能较弱,难以存储非结构化数据。
常用关系型数据库:MySQL、Oracle、SQLites等
非关系型数据库
键值型数据库:按Key-Value形式存储,Key是唯一标识符,查找速度极快。但是不支持条件过滤,如果不清楚具体数据位置,就要遍历所有的键,消耗性能,经典的使用场景是作内存缓存。最流行的键值型数据库——Redis。
其他:文档数据库、搜索引擎数据库(倒排索 ...