自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(92)
  • 资源 (4)
  • 收藏
  • 关注

原创 map的下标操作符

操作符的实现:乍一看,return后面很复杂,现在我们将它一步步拆解,首先根据键值和实值创建一个元素,value_type(k,T()),再将该元素插入map中insert(value_type(k, T()))此时需要注意,map的取下标符号主要有两个功能即分别是左值和右值,如下代码所示:作为左值的情况,便是想为map增添新元素,当输入的key与原有map中的key不相等的情况下便插入,此时insert(value_type(k, T()))的返回值为pair...

2022-06-15 17:31:36 1253 1

原创 课外扩展-红黑树的删除操作

讲解红黑树的删除操作

2022-06-15 10:38:48 362

原创 RBtree

红黑树课程的笔记

2022-06-13 09:32:35 368 2

原创 (课外扩展)红黑树左右旋

左旋:以某个节点作为旋转点,其右子节点变为旋转节点的父节点,右子节点的左子节点变为旋转节点的右子节点,左子节点保持不变。右旋:以某个节点作为旋转点,其左子节点变为旋转节点的父节点,左子节点的右子节点变为旋转节点的左子节点,右子节点保持不变。如上图便是左旋的过程,将pr拉上去之后p下去。P做为pr的左节点之后断开rl(因为二叉树),因为rl也需要连接父节点,故最终rl做为p的右子节点。通过代码来理解左右旋的过程:/** * 围绕p左旋 * pf

2022-05-27 17:30:37 168

原创 薄膜干涉数据处理

首先记录一下关键变量, Absolute_phases为绝对相位差(就是上张图片和下张图片之间的相位差),min_xiangweicha 为最小绝对相位差,sum_total_xiangweicha为最小相位差总和(计算线性)。数据处理分为有无跨条纹两个过程,首先是无跨条纹的时候将最小绝对相位差放在A列,最小相位差总和放在B列,彩色共聚焦数据放在C列,用B,C列拟合出一条直线(薄膜干涉测量点和彩色共聚焦测量点若共线最直接的反应就是将产生一条线性非常好的拟合线)通过图获得直线的拟合方程,再将B

2022-05-27 15:55:12 347

原创 (课外扩展)2-3-4树和红黑树的关系

二叉树:查找前驱节点:小于当前节点的最大值。 查找后继节点:大于当前节点的最小值。(注:中序排序才有前驱节点和后继节点)二叉树的删除:叶子节点直接删除,因为没有子节点。 只有一个子节点的用子节点替代(本质上就是找前驱节点和后继节点,左节点为前驱节点,右节点为后继节点)。 有两个子节点的需找到替代节点(替代节点就是前驱节点或者后继节点,两个节点都可以)。如下图所示:如果我们要删除2节点,2节点的前驱节点为1.5后继节点为2.5,因此这两个节点均可以替代2节点。替代之后二叉树...

2022-05-26 21:31:44 147

原创 7、deque容器及stack和queue容器

容器deque是一个(分段)连续空间,在表现上是连续,实际上是分段。deque的迭代器分别有四个指针,cur,first,last,node,node指针指向控制中心,即map(map的组成原理是vector数组)。当cur达到了first或last的时候(first和last表示这段空间的首尾),通过map中的指针来指向下一段缓存区。start iterator是为了指明开始的一段缓存区 ,finish指向结束缓存区。接下来看一下deque源码(注意BufSiz):现列出deque的一个经...

2022-05-19 10:42:14 224

原创 6、vector深度探析

vector数据安排与操作和array相似。两者的区别在于array是静态空间一但确定大小就不能改变,要换大小只能有程序员去声明新的array空间,将旧空间的变量挨个赋值过去。而vector是动态空间,随着放入的元素增多,它的内部机制会自行扩充空间来容纳元素。首先来看看vector的源码...

2022-05-07 21:31:14 543

原创 5、迭代器设计原则和Iterator traits的作用与设计

迭代器的设计原则在上一节4、list深度探索_努力的小带土的博客-CSDN博客讲解list的时候,观察仔细的小伙伴一定注意到了,下面代码中五个typedef是迭代器中必不可少的组成部分。template<class T, class Ref, class Ptr>struct __list_iterator{ //所有的迭代器都要有这5个typedef typedef bidirectional_iterator_tag iterator_category;//(1) type

2022-05-02 20:58:37 460

原创 4、list深度探索

list的数据结构list不仅是一个双向链表,而且是一个环状的双向链表,因此它只需要一个指针,便可以完整的表现整个链表:template <class T, class Alloc = alloc>class list{protected: typedef __list_node<T> list_node;public: typedef list_node* link_type; typedef __list_iterator<T, T&, T

2022-05-02 15:33:15 907

原创 3、关联容器测试(multiset,multimap,set,map,unordered_multiset.......)

衔接上章https://blog.csdn.net/qq_42138448/article/details/124259469,本章主要内容还是讲解容器。关联容器主要优势是查找,但我们安插的时候,是按照顺序来安插,因此会稍微慢一点。multiset测试代码:#include <set>#include <iostream>#include <cstdlib>#include <ctime>namespace stl03{ void

2022-04-23 11:47:40 807

原创 2、容器的结构与分类,array容器的测试,vecotr容器的测试,以及其他顺序容器的一些细节

容器的结构与分类:首先介绍一下顺序容器:Array 是数组,确定了开始位置和结束位置,同时不能超出它的内存。Vector 确定了开始位置,但可以一直向后添加新的空间去存放元素。Deque 开始位置能够扩充并且结束位置也能够扩充List 双向链表,相比于Forward-List占用的内存更大,因为一个元素对应两个指针。Forward-List 单向列表,看下面的小图可知开始位置是确定的。关联容器:(一般用于查找)Set 中key和value是一样的,通过红黑树来编写。M

2022-04-18 21:06:29 952

原创 1、 STL的六大部件、c++11 遍历for循环以及auto

六大部件:分配器,容器,仿函数,算法,迭代器,适配器。它们之间互相有关系,容器是通过分配器来分配内存的。下例代码演示了六大部件如何操作:容器中值得注意的是:所有容器都是前闭后开区间,即c.begin()指向第一个元素,而c.end()指向的是最后一个元素中的下一个位置。因此若想要通过常规for循环遍历容器则方法为for(;ite != c.end();ite++)。现c++11给出一个更好的遍历方式,同时为了避免申明像Container<T>::iterator这样较为复

2022-04-17 16:18:05 991

原创 模板类,具体化

在申明模板类的开头应该使用:template<typename Type>,关键字template告诉编译器将要定义一个模板,Type是一个通用类型说明符,在使用模板时,将使用实际类型代替它,如(string或Int)。模板类的成员函数申明应该为:template<typename Type> bool Stack<Type>::push(),和普通函数不同之处便为函数限定符从Stack::改为Stack<Type>::。值得注意的是,模板类的应该和模板类的申

2022-04-13 20:51:34 403

原创 傅里叶变换

简答的理解,将频率为3的周期信号,通过不同的速度缠绕到圆上,在其他位置,该圆的质心均在原点,如下图所示:但是在速度为3 cycle/second的时候缠绕质心会很明显的偏向右侧,如下图所示:上述例子只是对单频率信号来讲解的,当我们把频率为2beats/second 信号与频率为3beats/second信号结合起来,在圆上进行缠绕,当缠绕速度为2cycle/scond时质心同样右偏在缠绕频率为3cycle/second的时候质心再次右偏上述所描述的一些列操作过程,便可将一系列..

2022-03-23 10:37:12 475

原创 多重继承(虚基类)

存在基类Worker,其中包含名字信息name(string)以及编号信息id(int),现有Singer和Waiter类均继承于Woker类,即 class Singer:public Worker{.....} ;和 class Waiter:public Worker{.......};。假设再由Singer和Waiter派生出SingingWaiter类即class SingingWaiter:public Singer,public Waiter{.....};因为Singer和Waiter.

2022-03-22 21:48:46 523

原创 使用using重新定义访问权限

在使用保护派生和私有派生时,基类的公有成员函数,将成为保护成员或私有成员。假设要让基类方法在派生类外可用,则此时就用到了using重新定义访问权限,假设存在以下类:class Student : private string, private valarray<double>{...public: using valarray<double>::min; using valarray<double>::max; ...};上述申明是的min()和

2022-03-20 20:53:12 377

原创 抽象类(简单描述)

使用一个通俗且易理解的方法来讲纯虚类,假设有动物类,但动物包含很多属性,比如牛可以算动物,牛的食物是草,但老虎也算动物,它的实物却是肉。在比如圆和椭圆,在数学定义中圆是属于特殊的椭圆,若我们按照定义去取椭圆为基类,会发现有很多不需要的点,比如椭圆存在长轴,短轴,同时椭圆旋转角度不一样,它的形状便不一样,这些对于圆来说都是不需要的,因此简单的将圆继承于椭圆显然不合适,因此便发明了抽象类。纯虚类的申明,首先依靠于纯虚函数,virtual void food() = 0; 便为纯虚函数,即在虚函数申明之后再在虚.

2022-03-10 20:26:18 1192

原创 (virtual)虚函数

虚函数用在多态公有继承中,假设存在Brass类和BrassPlus类,且BrassPlus公有继承于Brass类,BrassPlus将针对自己的类属性,对Brass类部分公有函数进行更改,此时便需要申明virtual。如下例代码所示:class Brass{ private: string fullName; long acctNum; double balance; public: // 默认构造函数 Brass(string fn = "None", long

2022-03-07 08:57:21 245

原创 初始化列表

假设存在类A代码如下所示/******A.h******/class A{ private: const int n; string a ; public: A(int,string);}/******A.cpp*****/ A(int temp1,string temp2){ n = temp1; a = temp2;}该代码存在一定的问题,原因出在成员n身上,因为n是常量成员,所以应该在初始化类对象的时候就对它进行初

2022-03-01 21:26:31 601

原创 自建类的赋值问题

潜复制和深复制以及复制构造函数_努力的小带土的博客-CSDN博客续潜复制及复制构造函数。关于自建类的赋值问题假设存在类Tperson,如下所示:(主要用到的成员变量为_name 和address)class Tperson{private:char* _name ;char* address ;// len1 和 len2分别存储_name和address的字符长度int len1 ;int len2 ;.........public:.........}我们肯定希望该类

2022-02-26 15:53:58 154

原创 类的静态成员变量以及静态成员函数

类静态成员的作用:假设存在多个string对象,即string A ;和 string B ; 若string类存在静态成员static c,则针对于该变量A,B均共享同一个c,其实可以等同于在一个家庭中你和你的父母,女朋友共享同一个腾讯视频会员账号。类静态成员的使用:如下述代码,在类A中申明了静态变量a,此时不能进行初始化,是因为类申明只描述如何分配内存,但并不分配内存,类分配内存是在原文件创建对象后进行分配。// A.h A的头文件class A {private : stati

2022-02-24 22:32:50 793

原创 自建类与标准类型之间的转换

1、自建类转换为标准类首先任何接受唯一一个参数的构造函数都可以作为变量类型转换函数,即将该参数所在的类型转换为自定义类的类型。若将与该参数相同类型的对象赋值给自建类对象,那么C++将会隐式的调用构造函数。假设存在一个String类,它包含一个将char*值作为唯一参数的构造函数...

2022-02-22 21:49:16 232

翻译 c++生成随机数

rand()函数是在0 - RAND_MAX中来生成一个随机数的,一般生成区域随机数的方式都为取模,即如下代码所示:v1 = rand() % 100; // v1 in the range 0 to 99v2 = rand() % 100 + 1; // v2 in the range 1 to 100v3 = rand() % 30 + 1985; // v3 in the range 1985-2014在使用随机数函数rand()之前,一般使用srand(ti

2022-02-21 10:39:47 2446

原创 介绍友元函数

友元函数的介绍现给出一个这样的例子,当我们只能使用成员函数进行操作的时候,假设存在一个类class Time{public: // 在类申明中写的函数都是内联函数 Time() { hour = 0; minutes = 0; } Time(int h, int m) :hour(h),minutes(m){; } // 放大倍数 Time operator*(double)const;private: int hour; int minutes;};它具有一个放大倍数的

2022-02-20 12:11:47 652

原创 作用域内枚举

传统的枚举,其中两个枚举中定义的枚举量可能会发生冲突。假设有一个处理鸡蛋和T恤的项目,其中包含类似的代码。enum egg {small,medium,large,jumbo}enum t_shirt{small,medium,large,jumbo}这将无法通过编译,因为egg中的small 和 t_shirt中的small位于相同的作用域中,这会引发冲突。解决方案:创建枚举量作用域为类的枚举enum class egg {small,medium,large,jumbo}enum c

2022-02-19 11:24:03 189

转载 在构造函数中使用new时应注意的事项

1、如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete。2、new和delete必须相兼容。new对应于delete,new[]对应于delete[]。3、若有多个构造函数,则必须以相同的方式使用new,要么都带中括号,要么都不带。4、应定义一个复制构造函数,通过深度构造函数,通过深度复制将一个对象初始化为另一个对象。类似下面代码:String::String(const String & st){num_string++;len = st.len;

2022-02-13 22:08:00 449

原创 类作用域常量

在创建类作用域内的常量时,你可能以为这样可行:class A{private: const int Months = 12 ; double consts[Months] ;}其实这是个错误用法,因为类只是提供对象的创建方式,并不能创建对象,因此在A对象没有被申明前,Months是不会通过编译的,因此consts数组不知道Months是什么。目前有两种方式可以解决这个问题:第一种方式申明枚举常量class A{private: enum {Months = 12}...

2022-02-13 22:02:47 194

原创 成员函数的内联方法

定义于类声明中的成员函数都将自动成为内联函数,类声明中常将短小的函数作为内联函数,也就是说在下面代码中set_tot()函数为内联函数。class A{ private: int a; int b ; public : int set_tot() {return a*b;}}这段代码同理于下段代码:class A{ private: int a; int b ; public : int set_tot();}inli

2022-02-08 21:32:07 421

原创 通过cmd手动输入**argv编译程序

在编译pcl,拟合NURBS曲面代码时遇到一个问题,就是如何输入int main(int argc, char* argv[])中的argv,已知有两种方法,一种是在属性设置里面进行输入,还有一种是使用cmd指令,下图给出详细的cmd指令:拟合结果如下所示:...

2022-02-06 21:49:45 296

原创 定位new运算符

动态分配地址往往将被随机放在堆中,c++提供了一个新的方法,以便程序员可以定位放入动态变量。以下代码对动态定位运算符进行说明:#include <iostream>using namespace std;// 创建外部链接性的数组char stuff[200];// 创建内部链接性常量,有const 和 有static 是一个样的,// 但限定该变量不能改变const int N = 5;int main(){ /*检验定位new运算符**/ int* TY

2022-01-29 11:03:21 746

原创 C++函数模板

编写代码时,若只是参数类型发生改变,核心算法并没有变,此时便能使用模板来自动生成其他类型参量的函数。以下例子给出一个swap模板函数,通过该模板函数在程序内部自动生成swap(char&,char&),及swap(int&,int&),注:模板并不创建任何函数,它只是告诉编译器如何定义函数。#include <iostream>#include <string>using namespace std;// 模板函数申明template &

2021-12-19 21:38:32 565

原创 函数返回数组的方法

返回数组的实质便为返回指针,那么我们应当注意,不能返回局部变量的地址。如下述代码所示:int *fun1(){ int temp[arrlen]; for (int i = 0; i < arrlen;++i) { temp[i] = i; } return temp;}这段代码将会造成内存泄漏,原因是它返回了临时变量的数组。正确的返回方式如下所示:// 第一种方法int* returnarray(int U[]){

2021-11-25 21:20:40 15834 2

原创 函数指针(浅)

与数据变量相似,函数也有地址,函数地址是存储函数机器语言代码内存开始的地址。接下来从三个方面来讲解函数指针。1、获取函数的地址获取函数地址很简单,只要使用函数名即可。即think()是函数,则think是该函数的地址,若想将函数作为参数来传递则必须传递函数名。一定要区分传递的是函数的返回值,还是函数名。process(think); // 传递的是函数名process(think()); // 传递的是函数返回值2、声明函数的指针声明的函数指针应指定函数返回值与函数的特征标如下例代码

2021-11-04 20:28:02 83

原创 函数递归(浅)

函数递归即函数自己调用自己,注意在C++中不允许,main()进行递归。那有同学就会问,函数的递归这不就陷入了死循环嘛?答案是对的!因此我们需要给定一个判定条件,迫使调用链断裂,例如void类型的递归函数recurs()的代码如下:void recurs(argumentlist){ statements1 if(test) recurs(arguments) statements2}对于上述递归函数,只要test为true 则每个recurs()函数都将执行s

2021-10-31 16:27:23 83

原创 二维数组与函数

二维数组在函数中的表现形式同一维数组一样,都是以指针的形式进行表述,那么以二维数组为参数的函数是什么样的形式呢?// 假设现有数组int data[3][4] = {{1,2,3,4},{9,8,6,7},{2,4,6,8}};// 则int total = sum(data,3);说明data是一个数组名,数组中包含三个元素,各元素本身均是一个数组,由4个int组成,故函数原型表达如下:int sum(int (*ar2)[4],int size);// 或者int sum(i.

2021-10-30 21:06:11 539

原创 数组与函数

当你想在函数中使用数组的时候,第一时间的想法,唉直接将数组作为参量嘛~,简单。void fillArray(int arr[size]);当运行的时候便傻眼了,hhhhh。其实函数中的参数列表中是没有数组变量的,当我们需要使用函数调用数组的话,被调用的对象只能是数组地址,即以下两种形式。void fillArray(int arr[],int size);void fillArray(int* arr,int size);特别注意:int* arr 与 int arr[] 只在函.

2021-10-30 20:57:24 357

原创 读取数字循环

int n ;cin >> n;总所周知,这段代码为输入一个整数,假设我输入了字符'q'那么结果又会如何呢?这种类型不匹配的情况将发生4种情况(同时发生):n的值保持不变; 不匹配的输入将被留住输入队列中 cin对象中的错误标志点将被置位 对cin的调用将返回false(这为cin放在判断语句中设立了条件)cin返回False意味着可以使用非数字输入来结束数字输入循环。非数字输入将导致cin置位错误标志点意味着必须重置错误标志位才能继续读取输入。接下来看一段程序例子,对上面四.

2021-10-07 21:44:28 139

原创 continue在while和for循环中的区别

二刷primerPlus的时候发现了一个很有趣的细节,大家都知道continue的作用是跳过本次循环的剩余部分而直接开启下次循环。那么在for循环中,continue将跳转到更新表达式,然后跳到测试表达式处。而在while循环中,continue将直接跳转到测试表达式处。记录一下这个有趣的现象!...

2021-10-05 22:19:52 875

原创 C++编写准确延时

说到编写延时,很多人想当然的使用循环去遍历一个变量,比如下例程序:long wait = 0;while(wait < 1000)wait++;但这类程序并没有考虑编译器的计算速度,因此该程序在某些编译器上处理的快然而在某些编译器上则处理的慢。故C++提供了一种准确定时的方法即使用<ctime>头文件中的函数。这个函数名叫做clock() 返回当前时间,但返回时间不一定是秒,故在该函数里面定义了clock_t作为返回别名,来统一管理。在该函数中还有一个常量CLOCK_PER

2021-09-24 21:58:07 1213 1

Hough_cope.zip

本设计是从我的本科毕业设计中摘取的一个部分,该设计主要完成的功能有,基础的图像处理系统,打开电脑前置摄像头,能够捕捉出现在前置摄像头视野中的圆形物体,并给其标定圆心,同时显示该圆的半径。

2020-08-15

煤气泄漏监测系统设计.doc

本论文是煤气检测系统设计的研制,主要完成: (1) 对煤气检测整个系统进行了整体规划; (2) 对煤气检测系统进行硬件设计和软件流程设计,分为主程序设计,A/D转换控制程序的设计,数据处理,浓度显示程序设计、声光报警子程序设计等; (3) 软件的调试,功能仿真; (4) 画出煤气检测系统的电路原理图。

2020-03-29

基于51单片机的自动门系统.zip

自动门系统课程设计(内附protues仿真图,以及程序代码) 具体的功能要求如下 两个传感器,里外各一个,不论哪一个检测到都电机正转门打开,过两秒电机反转门关闭,如果里面检测到的就出门的加1处面检测到的就进门的加1

2020-03-29

PID温度控制。.zip

任务:利用单片机和可控硅电路实现水温控制系统,将测量温度值显示于四位数码管上,通过可控硅控制加热器件,并且能够设置温度值的功能。 要求:(1)查阅相关文献,熟悉课题背景、任务; (2)深入学习51系列单片机原理及C语言并且会用Keil软件进行编程; (3)学习可控硅电路、DS18B20温度传感器和数码管的工作原理; (4)测量范围0~99.99℃,精度±0.5℃; (5)学会利用Protel99se或DXP软件进行原理图绘制,并且能够利用Protues仿真软件对其进行仿真; (6)焊接并完成作品调试。

2020-03-29

空空如也

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

TA关注的人

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