自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(96)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 ESP32烧录简易流程

ESP32烧录流程

2022-08-11 21:35:54 3645 1

原创 UE4 关卡HUD显示方法两种

关卡HUD显示方法两则。

2022-07-03 00:28:23 1213

转载 C++实现线程池

#ifndef THREAD_POOL_H#define THREAD_POOL_H#include <condition_variable>#include <functional>#include <future>#include <memory>#include <mutex>#include <queue>#include <stdexcept>#include <thread>#i

2021-09-07 15:57:57 355

原创 git指令

基础命令git add 文件名/.(全部文件)git commit -m "注释"git push origin master(分支名)git push -f origin master #强制覆盖远程仓库git branch #查看本地分支git branch -r #查看远程分支git branch -M main#当前分支重命名为maingit checkout (branchname) #切换到branchname分支#git remote用于在远程仓库的操作#本句意为将本地仓

2021-07-18 16:12:36 171

原创 RocksDB的Compaction : Leveled Compaction 和 Universal Compaction

文章目录Compaction算法LeveledTieredRocksDB的CompactionLeveled Compactionwhich level to compactsubcompactionUniversal CompactionCompaction Picking Algorithm前置条件1、由Space Amplification触发的压缩2、由Individual Size Ratio触发的压缩3、由 number of sorted runs 触发的压缩4、由 age of data 触

2021-06-14 23:43:34 2484

转载 多版本并发MVCC

事务隔离级别SQL标准的事务隔离级别包括:读未提交 (read uncommitted) :一个事务还没提交时,它做的变更就能被别的事务看到。读提交 (read committed) :一个事务提交之后,它做的变更才会被其他事务看到。可重复读 (repeatable read) :一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据时一致的。当然可重复读隔离级别下,未提交变更对其他事务也是不可见的。可串行化(serializable): 对同一行记录,当出现不同事物的读写冲突时,是通过

2021-06-06 23:18:18 112

原创 数据库 杂记

1、悲观锁、乐观锁悲观锁:这种借助数据库锁机制,在修改数据之前先锁定数据,再修改的方式被称之为悲观并发控制。悲观锁有共享锁和排他锁。乐观锁:乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。比如CAS。2、布隆过滤器(Bloom Filter)直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。

2021-06-05 23:41:05 316 3

原创 数位DP:求区间中满足“某种条件”的数的总数

使用场景给定一个闭区间[L, R],求这个区间中满足"某种条件”的数的总数量。(Ans[L, R] = Ans[0, R] - Ans[0, L-1])例题Windy数(BZOJ1026)https://ac.nowcoder.com/acm/problem/20268定义不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。比如5, 36, 192都是Windy数, 10, 21不是Windy数。 求[L,R]范围内有多少个Windy数。 1<=L,R<=2e9思

2021-05-28 22:57:56 1026

原创 操作系统杂记

阻塞 和 挂起阻塞是进程的一种状态,而挂起是行为。线程的五个状态:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。阻塞进程的阻塞是指使一个进程让出处理器,去等待一个事件,如等待资源、等待I/O完成、等待一个事件发等,通常进程自己调用阻塞原语阻塞自己,所以,是进程自主行为,是一个同步事件。当一个等待事件结束会产生一个中断,从而,激活操作系统,在系统的控制之下将被阻塞的进程唤醒,如I/O操作结束、某个资源可用或期待事件出现。进程的阻塞和唤醒显然是由进程切换来完成。挂起当出现了引起挂起的事件时系

2021-05-23 12:11:52 145

原创 《高性能MySQL》读书笔记(1~6章)

第1章 MySQL架构与历史MySQL最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理(Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。这种处理和存储分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式。1.1 MySQL逻辑架构顶层服务层并非MySQL独有,大多数基于网络对外提供服务的中间件都有这一层,主要是连接处理、授权认证、安全等。第二层是MySQL的服务器层,大多数核心服务功能都在这一层,包括解析、

2021-05-08 15:21:36 964 1

原创 malloc原理分析:ptmalloc2

文章目录多线程:主分配区和非主分配区结构chunkbinfast binsunsorted binsmall binslarge binsmmaped chunktop chunkLast remainder流程分配初始化malloc流程内存回收流程如何避免内存暴增?glibc中malloc采用的是ptmalloc2内存池管理方式,使用边界标记法将内存划分成很多块,从而对内存的分配与回收进行管理。多线程:主分配区和非主分配区为了支持多线程,ptmalloc使用两类分配区:主分配区main_area和

2021-03-25 23:47:39 719

原创 HTTPS加密原理

文章目录对称加密与非对称加密对称加密非对称加密HTTPS加密证书预置和申请TLS握手首先需要理解对称加密与非对称加密。对称加密与非对称加密对称加密对称加密又叫做私钥加密,即信息的发送方和接收方使用同一个密钥去加密和解密数据。对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密,常见的对称加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。其加密过程如下:明文 + 加密算法 + 私钥 => 密文解密过程如下: 密文 + 解密算法 + 私钥 =>

2021-03-25 15:10:03 172

原创 基于muduo的简单静态WebServer

https://github.com/836662398/MyWebServerMyWebServerIntroduction基于muduo网络库的C++ 高性能简单静态web服务器。对muduo进行了一些优化:添加了心跳检测;尽量使用C++标准库,减少了代码量;简化了定时器实现,使用堆而不是基于红黑树的set;分别实现 epoll ET/LT两种模式(位于不同branch);…此外,日志模块使用了spdlog库,单元测试使用了gtest库。Envoirment

2021-03-19 21:06:22 790

原创 《Linux多线程服务端编程:使用muduoC++网络库》学习笔记

boost库安装:apt-cache search boost搜到所有的boost库然后:sudo apt-get install libboost-all-dev安装相应的库第一章 线程安全的对象生命期管理1.1 当析构函数遇到多线程C++多线程对象的销毁可能会碰到竞态条件,解决办法是使用shared_ptr。1.1.1 线程安全的定义1.1.2 MutexLock与MutexLockGuard#include<bits/stdc++.h>#include<b

2021-02-02 21:36:34 2219 1

转载 马踏棋盘 回溯/贪心

转自公众号:树屋编程直接用递归回溯很慢,可以通过加入贪心来加快计算速度:用贪心算法的思想来解决在棋盘如何选择下一个节点的问题,就是计算马儿的哪个下一节点对应的下一个节点(即下下个节点)的总数最少,就将哪个下一节点视为最优。(尽量选择出口最少的点,就能在最短时间内到达较深处,就能让计算速度尽量快)#include <bits/stdc++.h>using namespace std;// 每个点最多可以朝8个方向跳const int DIRECTIONS = 8;struct

2021-01-30 23:42:04 129

原创 《Effective Modern C++》笔记

绪论一种有启发性地判断一个表达式是左值的方法是检查是否可以取得该表达式的地址。如果可以取地址,它基本上就是一个左值。如果不行,通常来说是一个右值。这种方法之所以说复用启发性,是因为他让你记得,表达式的型别与它是左值还是右值没有关系。形参只能是左值,但是作为其初始化依据的实参即有可能是右值也有可能是左值。...

2021-01-27 20:49:05 793 1

原创 C++多线程日志库spdlog使用

#include "spdlog/sinks/rotating_file_sink.h"#include "spdlog/spdlog.h"class LOG {public: //配置日志文件、写入模式 LOG() { //日志模块名、日志文件最大大小、滚动文件数量(日志太多的时候,当前文件重命名_1,_2,_3.再写新的文件) auto logger = spdlog::rotating_logger_mt("log", "log/Srio.txt", 2 * 1024 * 1024

2021-01-14 19:37:18 4040

原创 CMake笔记

相关命令#运行当前目录下的cmake文件cmake . #运行父目录下的cmake文件,并在当前目录生成相关文件,通常位于build文件夹cmake ..#执行makefilemake#删除make出的elf文件make cleanCMake教程简例# CMake 最低版本号要求cmake_minimum_required (VERSION 2.8)# 项目名称project (echo)# 指定生成目标,包含所有源文件add_executable(echo main

2020-12-29 12:16:58 544

转载 有限状态机

转载自公众号:树屋编程在编程的时候,经常需要根据一个当前状态和各种可能的输入来实现不同的逻辑以及维护状态的变化,一般用if…else或者swith…case来实现,这其实就是状态机的思想。掌握一些关于状态机的理论知识和工具,能够更好更快地写出状态机的代码,尤其是当状态和输入较多的时候。本文从简单的例子开始,介绍状态机的一些知识,然后再介绍各种不同的C++实现。先来看一个非常简单的面试题怎么用状态机来实现:有一个ASCII字符串,其中包含数字和非数字,请找出其中所有的连续的数字.比如说对于字符串:ab

2020-12-20 20:25:04 2907 1

转载 C++STL读写锁、普通锁(shared_mutex、mutex)效率对比

#define READER_CNT 8#define LOOP_COUNT 5000000 #include <iostream>#include <mutex> // For std::unique_lock#include <shared_mutex>#include <thread> class shared_mutex_counter {public: shared_mutex_counter() = default; u

2020-12-18 20:41:40 1612 1

原创 《TCP/IP详解 卷1》12-17章TCP笔记

第12章 TCP:传输控制协议(初步)12.1 引言通信媒介可能会丢失或改变被传递的消息。——信息理论(information theory)& 编码理论(coding theory)如何使信息在通信信道中避免出错:使用差错校正码(某些比特的冗余)。尝试重新发送(自动重复请求,Automatic Repeat Request,ARQ)。12.1.1 ARQ和重传考虑多跳通信信道,有这些差错种类:分组丢失比特差错分组重新排序分组复制最直接处理分组丢失、比特差错(无

2020-12-15 23:10:35 1442

原创 Python学习笔记

函数参数1、定义默认参数要牢记一点:默认参数必须指向不变对象!2、可变参数在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码

2020-12-08 16:20:02 1338

原创 《Linux内核设计与实现》读书笔记

第一章 Linux内核简介1.3操作系统和内核简介内核有时候被称作是管理者或者是操作系统核心。通常一个内核由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。对于提供保护机制的现代系统来说,内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。这种系统态和被保护起来的内存空间,统称为内核空间。相对的,应用程序在用户空间执行。它们只能看到允许它们使用的部分系统资源,并且只使

2020-12-01 20:24:42 2122 1

原创 《设计模式的艺术》读书笔记

面向对象设计原则表1 7种常用的面向对象设计原则设计原则名称定 义使用频率单一职责原则(Single Responsibility Principle, SRP)一个类只负责一个功能领域中的相应职责★★★★☆开闭原则(Open-Closed Principle, OCP)软件实体应对扩展开放,而对修改关闭★★★★★里氏代换原则(Liskov Substitution Principle, LSP)所有引用基类对象的地方能够透明地使用其子类的对象★★★★★

2020-11-09 19:29:35 828

转载 C++内存泄漏、数组越界……检测工具:Sanitizers

g++ gcc自带的sanitizers可用于检测内存泄漏、数组越界、线程竞态条件、未初始化等问题,暂时只支持Linux。用法:https://blog.csdn.net/weixin_41644391/article/details/103450401CMAKE中的用法:Google sanitizersSanitizers are open-source tools for dynamic code analysis designed by Google. CLion integrates w

2020-11-03 14:53:19 4832

原创 C++单例模式:饿汉式、懒汉式

1 动机对于一个软件系统的某些类而言,我们无须创建多个实例。比如Windows的任务管理器,通常情况下,无论我们启动任务管理多少次,Windows系统始终只能弹出一个任务管理器窗口,也就是说在一个Windows系统中,任务管理器存在唯一性。这样设计的原因:1.重复对象会造成资源浪费,根本没有必要显示多个内容完全相同的窗口;2.如果弹出的多个窗口内容不一致,问题就更加严重了。为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操

2020-10-26 23:48:50 930

原创 QT+Opencv+MinGW配置(免编译)

步骤:github上有编译好的文件,直接下载即可:https://github.com/huihut/OpenCV-MinGW-Build注意,版本位数(64/32)一定要和mingw编译器的位数(64/32)对应。下载后解压,将下面的文件路径添加到环境变量中(如果有环境变量中已有其他版本opencv,最好当前版本路径移到最上方)。3.添加如下语句到qt项目的pro文件中:(注意是‘/’,不是反斜杠‘\’)INCLUDEPATH += ...(文件解压路径)/OpenCV-Mi

2020-10-13 16:35:33 1915 2

原创 《Effective C++》 笔记

导读被声明为explicit的构造函数通常比其non-explici兄弟更受欢迎,因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。**除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。**我鼓励你遵循相同的政策。copy构造和copy赋值的区别:如果一个新对象被定义(例如以上语句中的w3),一定会有个构造函数被调用,不可能调用赋值操作。如果没有新对象被定义(例如前述的"w1=w2"语句),就不会有构造函数被调用,那么当然就是赋值操作被调用。函数Pass

2020-10-11 21:33:02 741

原创 C++11智能指针用法

shared_ptr和unique_ptr都支持的操作:shared_ptr创建默认初始化:保存空指针shared_ptr<T> p1;创建方式:shared_ptr<T> p1(T* ptr);//构造函数,示例如下shared_ptr<T> p1(new T());shared_ptr<T> p2 = make_shared<T>(args);shared_ptr<T> p3(p2); //拷贝构造,会增加p2

2020-10-05 20:16:36 743

原创 C++ 访问控制与继承

C++的三大特性之一——封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合。主要通过访问限定符:public/private/protected实现。三种访问权限public限定符被public限定符所修饰的成员变量和函数可以被类的函数、子类的函数和对象、友元函数,也可以由类的对象来访问,即可以使用成员运算符(.或->)来访问。这里的友元函数,可以是该类的友元函数,也可以是该类的友元类的成员函数。private限定符被private限定符修饰的成

2020-10-04 23:19:20 184

原创 《UNIX网络编程》 卷1 笔记

第五章5.6正常启动显示详细的网络状况:netstat -anp-a或–all 显示所有连线中的Socket。-n或–numeric 直接使用IP地址,而不通过域名服务器。-p或–programs 显示正在使用Socket的程序识别码和程序名称.5.8 POSIX信号处理1.如果一个信号在被阻塞期间产生了一次或多次,那么该信号被解阻塞之后通常只递交一次,也就是说Unix信号默认是不排队的。2.signal函数不同系统不同实现,最好用sigaction(符合POSIX标准)自定义自己的si

2020-10-02 20:55:13 531

原创 Linux常用工具记录

grep递归搜索:grep -r实现OR:grep pattern1\|pattern2 filenamegrep -E 'pattern\|pattern2 filename' //(-E表示使用正则)实现AND:(同时出现pattern1和pattern2)grep -E 'pattern1.*pattern2' filename 实现NOT: grep -v 'pattern1' filenamenetstat-s 显示每个协议的统计-t 显示TCP协议的连接情况-

2020-10-02 20:49:55 161

原创 QT自定义QGraphicsRectItem

PS:添加自定义类时需要继承QObject,来获得信号与槽功能。//myrectitem.h#ifndef MYRECTITEM_H#define MYRECTITEM_H#include <QObject>#include <QGraphicsItem>#include <QGraphicsRectItem>#include <QMenu>#include <QAction>#include <QGraphicsScen

2020-09-21 10:33:45 1564

原创 QT记录

1.加载图片,使图片在label上显示,并且自适应尺寸void Widget::on_buttonRead_clicked(){ QImage image; QString path = QFileDialog::getOpenFileName(this,"open","../"); if(path.isEmpty() == false){ if( image.load(path) ) { ui->label->

2020-09-12 15:23:26 173

原创 有环无向图删除冗余边形成生成树 类问题

题目类型:N个点M条边的无向图,删除边使无向图连通无环(生成树)。【思路】并查集合并函数返回是否连通的bool类型,然后遍历每条边,合并边的两端点。例题一class Solution {public: int fa[1005]; void init(int n) { for (int i = 1; i <= n; i++) fa[i] = i; } int get(int x) { if(fa[x] =

2020-09-06 13:22:03 1113

原创 求组合数 :DP、逆元+快速幂

要求:求 Cmn%pC_{m}^n \% pCmn​%p ,p为素数(经典p=1e9+7)方法一:DPC[n][m]=CnmC_{n}^mCnm​公式Cnm=Cn−1m−1+Cn−1mC_{n}^m=C_{n-1}^ {m-1}+C_{n-1}^{m}Cnm​=Cn−1m−1​+Cn−1m​证明:班级中有n个人,选出m个人开除,有两种选法:班长不开除,从剩下的人中开除m个人开除班长,从剩下的人中开除m-1个人const int MOD = 1e9 + 7;int C[1005][1005

2020-08-30 16:02:28 227 1

原创 LINUX环境编程杂记

1.可重入函数、异步信号安全、线程安全重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。,常见的情况是,程序执行到某个函数foo()时,收到信号,于是暂停目前正在执行的函数,转到信号处理函数,而这个信号处理函数的执行过程中,又恰恰也会进入到刚刚执行的函数foo(),这样便发生了所谓的重入。此时如果foo(

2020-08-28 10:46:07 214

原创 线段合并问题

使用length数组维护下标i元素所在的满足要求的区间(连续为1的区间)的长度,只需维护所有1区间两端端点即可。当步骤i的1出现时,下标为x=arr[i],找到该索引x的左右两个下标x-1,x+1的length数组值(即所在1区间的长度),合并区间,通过原区间长度找到x-1所在区间的左端点和x+1所在区间的右端点,维护新长度。因为可能遇到边界,所以默认在ivec两端各加一个哨兵0。使用哈希表记录长度为len的1区间的数量。class Solution { public: int f.

2020-08-23 13:15:44 1506

原创 C++STL sort源码分析

STL的sort算法:当区间长度小于阈值(通常为5~20,STL取16)时,直接采用插入排序,因为插入排序的常系数比较小,数据量小时有不错的效果。当区间长度大于阈值时,采用内省式排序(IntroSort),其行为在大部分情况下几乎与三数取中quick sort完全相同。直到下面两种情况停止:当递归深度过深(递归深度>2*log2(len) ),意味着分割行为有恶化为二次行为的倾向时,能够自我侦测,转而改用Heap Sort,使效率维持在O(nlogn)。当区间长度小于阈值时,停止排序退出in

2020-08-13 20:22:10 1265

原创 C++迭代器适配器:反向迭代器、插入迭代器、iostream迭代器

适配器是标准库中的一个通用概念。容器、迭代器和函数都有适配器(C++11出现了lambda函数、function类模板、bind函数,几乎取代了函数适配器)。本质上,适配器是一种机制,能使某种事物的行为看起来像另外一种一样。栈、队列、优先队列都属于容器适配器。本文主要介绍迭代器适配器。迭代器适配器主要有三类:逆向迭代器,插入迭代器,流类迭代器。插入迭代器插入迭代器有三种类型,差异在于元素插入的位置:back_inserter( Container& c ),在容器尾部插入,只能对有push

2020-08-13 19:32:14 380

OpenCV-MinGW-Build-OpenCV-4.1.0-x64.zip

编译完成的mingw版本opencv4.1.0直接用即可。使用说明:https://blog.csdn.net/qq_40586164/article/details/109054581

2020-10-13

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

TA关注的人

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