Clay's Blog
  • 🔍 搜索
  • 🏡 主页
  • 📒 记录
  • 📛 标签
  • 📁 归档
  • 📖 关于
主页 » 📒 记录

📚 学习

C++学习记录(3) 常量指针与指针常量

两个比较容易混淆的概念。 0. 记忆方法 const int * p; int * const p; int const * p; 这是常见的三种写法,按照从左至右的顺序记忆,按照从右至左的顺序理解。 记忆 只关注const 和 * 的先后先后顺序,const读做常量,*读做指针。 参考《Effective c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。 ...

2021-02-15    1334字    Clay    C++

单调栈与单调队列详解

1. 单调栈 1.1 可解决的问题 单调栈的使用场景时分有限,只处理一种典型的问题,叫做 Next Greater Element。 例如:在一个数组中,每个数左边(右边)第一个比它大(小)的数是什么。 1.2 详解 直接上例子解释它。 题目:给出一个原始数组 a[3, 4, 2, 7, 5],输出每个数左边第一个比它小的数,如果不存在则输出-1。 解释:第一个3左边没有数,答案是-1,4左边第一个小的数是3,2左边没有比2小的数,答案是-1,7左边第一个小的数是2,5左边第一个小的数是2,所以最后答案是[-1, 3, -1, 2, 2]。 ...

2021-02-09    2319字    Clay    数据结构与算法

C++学习记录(2) Lambda表达式(匿名函数)

Lambda表达式 Lambda表达式 形式 [capture](params) -> return-type{ function body } 说明 capture 需要捕获的外部变量列表(这里的外部变量不包括程序的全局变量,指的是匿名函数父作用域内的变量)。 如果这个匿名函数需要调用本匿名函数以外的变量,那么就需要在这个[ ] 中进行捕获,捕获包括捕获的变量名称和捕获的方式(值和引用)。 例如: [ ] 表示不捕获外部的任何变量 [=] 表示捕获外部的所有变量(父作用域内),是以值的方式捕获(不可修改)。 [&] 表示捕获外部的所有变量(父作用域内),是以引用的方式捕获(可修改)。 [=, &x, &y] 表示捕获外部的所有变量(父作用域内),其中x和y以引用的方式捕获,其他变量以值的方式捕获。 [&, x, y] 表示捕获外部的所有变量(父作用域内),其中x和y以值的方式捕获,其他变量以引用的方式捕获。 capture注意事项 如果不进行变量捕获,那么在匿名函数内,不可以使用外部变量。 捕获列表内,不允许重复捕获。比如 [=, a],=已经说明所有的变量(包括a)以值的方式捕获,后边的a又进行了一次说明,这是不允许的。 捕获任何非父作用域内变量或者程序的全局变量,都会出错。 [this]只能以值的方式捕获 ...

2021-01-28    607字    Clay    C++

C++学习记录(1) 重写、重载、重构三者区别

0. 重构 重构是对程序内部的架构的调整。 重构强调的是在不改变"软件外部可观察的行为"前提下,对内部结构进行调整,使得从程序的外部功能上看,没有任何变化。 如下例子: 重构前代码如下: #include <iostream> class child { private: public: child(){}; void func(){ std::cout << 123 << std::endl; } }; int main(int argc, char const *argv[]) { child a; a.func(); return 0; } 程序运行后,输出123. 重构后的代码如下: #include <iostream> class child { private: public: child(){}; void f1(){std::cout << 1;} void f2(){std::cout << 2;} void f3(){std::cout << 3;} void func(){ f1(); f2(); f3(); std::cout << std::endl; } }; int main(int argc, char const *argv[]) { child a; a.func(); return 0; } main函数执行的时候,依然是调用a的func方法,程序的输出也是123,对于外部来说没有任何改变,但是func内部的实现方式已经改变。 ...

2021-01-28    754字    Clay    C++

VS2017 OpenCV4.4.0使用Openvino加速dnn模块推理速度

Step0 准备文件 opencv-4.4.0.zip opencv_contrib-4.4.0.zip cmake-3.19.1-win64-x64_2.msi w_openvino_toolkit_p_2020.4.287.exe Step1 解压文件 安装cmake-3.19.1-win64-x64_2.msi和w_openvino_toolkit_p_2020.4.287.exe,都默认就好。 将opencv-4.4.0.zip解压到文件夹opencv440中 将opencv_contrib-4.4.0.zip解压到文件夹opencv440/opencv_contrib中 ...

2020-12-15    1165字    Clay   

扩展欧几里得算法详解及C++代码实现

0. 欧几里得算法 欧几里得算法用于求解两个数的最大公约数。代码如下: int gcd(int a, int b){ if(b == 0) return a; return gcd(b, a % b); } 当b为0时,结束递归,此时a即为a和b的最大公约数。 1. 裴蜀定理 定理内容: 如果a、b均是整数,则一定存在整数x和y,使得ax + by = gcd(a, b)成立。 我们可以再深层次的理解一下式子ax + by = gcd(a, b)的含义,也就是说,整数a和整数b进行线性运算,可以拼凑出他们的最大公约数。再想一想,是不是也可以拼凑出他们最大公约数的整数倍?是的,可以拼凑出他们最大公约数的在整数倍,只要x和y进行对应的放大或缩小就可以了。 那也就是说,只要等号右侧是gcd(a,b)的整数倍,就一定存在整数x和整数y。(注意这里,后边用扩展欧几里得求解线性同余方程时会用到) 注意定理中说的是一定存在整数x和整数y,但是并没有告诉我们如何找到x和y,扩展欧几里得算法可以找到整数x和整数y。 ...

2020-09-06    1719字    Clay    数据结构与算法

单片机AT指令操作GA6-B短信模块连接阿里云MQTT服务器(双向通信)

0. 前言 网上这种东西不太多,我也是看了不少资料弄出来了,觉得应该写点东西出来。 我用的板子不是arduino,用的是stm32,开发工具是Arduino IDE,因为Arduino IDE集成了较多的函数库,我们不用管底层的一些东西,都封装好了,写着方便一些。 当然,不管你板子是什么,这篇文章主要讲的不是板子的问题,而是如何通过串口的AT指令控制GA6-B这种支持GPRS的短信模块来实现MQTT协议,以及微信小程序显示单片机发布的数据。 ...

2020-04-30    5509字    Clay   

对快速幂代码的理解

模板代码: typedef long long ll; ll quick_pow(ll a,ll b){ ll res = 1; while(b > 0){ if(b & 1){ res *= a; } a *= a; b >>= 1; } return res; } 这里以a^10为例,说一下对快速幂代码的理解。 右下角的o表示这是十进制数 这里写错了,图片中不应该是o,应该d,d表示这是十进制数 ,b表示这是二进制数。可以得到以下的几个式子,都是逐步变换得出来的。 最后一个式子可以很好的理解模板代码,可以看到,等号右侧有4项,这4项的幂次是1010,也就是10的二进制表达的每一位。所以,这就要求出幂指数10的二进制的每一位,而且,最后一个式子中,幂次是0的项(第二项和第四项)其实是1,对结果没有贡献,那我们就可以考虑,求出幂指数10的每一位以后,进行判断,如果这一位是0,那就不予考虑了,如果是1的话,就把这一项乘到原有的结果中,也就是代码中的这几行 ...

2020-03-02    487字    Clay    数据结构与算法
« 上一篇 
© 2024 Clay's Blog Powered by Hugo & PaperMod