- 博客(60)
- 收藏
- 关注

原创 全景影像的3D显示
全景影像是一种特殊的影像,它有360度的视角,但是在二维平面上观察时,其更像一个“拉开的拉链”,为了更好的显示全景影像,我们需要将其还原到球坐标系下,从而完成其360度的正常显示。 由于工作关系,需要在Qt平台下完成全景影像360度视角显示,经过研究,结合QOpenGLWidget+OpenGL可以实现,这里之所以不使用QGLWidget,是因为该控件已被废弃;其次,Qt平台虽然已经支持了openGL的相关API(QGLFunctions),但是由于发现需要使用的部分API在Qt中找不到(猜测可能是
2020-12-16 14:06:52
1509
2

原创 QThread使用
QThread使用的两种方式moveToThreadsubclass QThreadQthread同步优雅的取消线程QThread使用的两种方式 Qt提供了两种线程的使用方式,分别如下:moveToThread class Worker : public QObject { Q_OBJECT public slots: void doWork(const QString ¶meter) { QString result; .
2020-12-11 18:26:51
769

原创 设计模式综述
设计模式六大原则设计模式构建型模式工厂模式单例模式建造型模式原型模式结构型模式适配器模式桥接模式组合模式装饰模式外观模式享元模式代理模式设计模式对于软件设计的重要性不言而喻,每一个c++程序员都应该学习,但是设计模式又不是那种死记硬背的知识,更多的是需要我们能够在软件开发中磨炼;如果说设计模式中23种设计模式是术,那么六项基本原则就是道,术固然重要,但是更重要的是我们要从术中领悟道的存在,一旦领悟,设计模式将不止23种;六大原则开放封闭原则:对修改封闭,对扩展开放;例如使用抽象类派生扩展功能;单一
2020-11-03 11:41:17
366
原创 事件循环详解
事件循环postevent和sendevent事件过滤源码剖析int QCoreApplication::exec()int QEventLoop::exec(ProcessEventsFlags flags)bool QEventLoop::processEvents(ProcessEventsFlags flags)bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags)void QEventDisp.
2021-03-31 13:46:49
1945
原创 哈希表初探
文章目录散列函数的构造方法直接定址法除法散列法平方取中法处理散列冲突线性探测二次探测开链 哈希表主要是提供常数时间的基本操作。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。在哈希表中,散列函数实现地址映射,但是由于存在冲突问题,所以,又必须考虑散列冲突的处理。 散列函数:负责将某一元素映射为“大小可接受之索引”,这样的函数称为散列函数。散列函数的构造方法 如上图所示,散列函数的构造方法较多,下面就几种有代表性的进行总结。直接定址法 直接定址法的散列函数符合如下形式:
2021-03-30 14:56:01
171
原创 q、d指针详解
d、q指针的初始化d、q指针的使用d、q指针的优势d、q指针的初始化 以Qt中最常用的控件qlabe类的源码为例,研究Qt中Q_D指针的使用。 顾名思义,private代表私有的,QLabelPrivate也正如它的命名一样,其主要用于保存QLabel的私有成员以及函数。源码如下所示:class Q_AUTOTEST_EXPORT QLabelPrivate : public QFramePrivate{public: QLabelPrivate(); ~QLabelPr.
2021-03-24 18:03:47
2584
原创 派生类的构造
在c++的继承关系中,如果一个派生类构建,那么构建顺序将是从基类开始,然后再到派生类,但是存在一个问题,派生类中的this指针和基类中this是否相同呢?基于此,所以我进行了一个简单验证。代码如下:class A{private: int value : 1;public: A() { cout << "A address = " << (unsigned long long)this << endl; } void setA(in
2021-03-24 16:51:49
382
原创 分治算法浅析
分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 分治法所能解决的问题一般具有以下几个特征:该问题的规模缩小到一定的程度就可以容易地解决该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。利用该问题分解出的子问题的解可以合并为该问题的解;该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。 第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具
2021-03-19 14:07:41
426
原创 动态规划浅析
leetcode53:最大子序和leetcode62:不同路径leetcode300:最长递增子序列 动态规划要解决的都是一些问题的最优解,即从很多解决问题的方案中找到最优的一个。当我们在求一个问题最优解的时候,如果可以把这个问题分解成多个子问题,然后递归地找到每个子问题的最优解,最后通过一定的数学方法对各个子问题的最优解进行组合得出最终的结果。总结来说就是一个问题的最优解是由它的各个子问题的最优解决定的。 在动态规划中,一般有以下几个要素:状态转移方程。状态。最后一步。初始条件。.
2021-03-18 11:19:36
242
转载 回溯算法
回溯是啥 用爬山来比喻回溯,好比从山脚下找一条爬上山顶的路,起初有好几条道可走,当选择一条道走到某处时,又有几条岔道可供选择,只能选择其中一条道往前走,若能这样子顺利爬上山顶则罢了,否则走到一条绝路上时,只好返回到最近的一个路口,重新选择另一条没走过的道往前走。如果该路口的所有路都走不通,只得从该路口继续回返。照此规则走下去,要么找到一条到达山顶的路,要么最终试过所有可能的道,无法到达山顶。 回溯是一种穷举,但与brute force有一些区别,回溯带了两点脑子的,并不多,brute force一点
2021-03-04 09:50:48
161
1
原创 分页节点
动态调度技术分页数据库osg::PageLOD动态调度技术 如果数据庞大,那么是不可能一次性全部载入内存的,因此需要动态调度技术。 动态调度技术:在显示当前视域中的场景元素的同时,预判下一步可能载入的数据,以及那些短时间内不会被看到的数据,从而做出正确的数据加载和卸载处理,确保内存中始终维持优先的数据额度,并且不会因此造成场景浏览时重要信息的丢失或过于迟缓。 如果预加载数据过度,也会影响系统连贯,所以采用"数据进入视域后才进行加载"的策略,此时场景中的图像可能突然闪现。 数据的动态机载.
2021-02-25 16:15:50
419
原创 图
基本介绍相关术语图的实现图的搜索基本介绍 图是由一组顶点和能够将两个顶点相连的边组成的。如下图所示: 根据连接两个顶点边的不同,图可以分为以下两种:无向图:边仅连接顶点,没有方向。有向图:边不仅连接顶点,同时具有方向。相关术语相邻顶点:当两个顶点通过一条边相连时,我们称这两个顶点是相邻的,并且称这条边依附于这两个顶点。度:某个顶点的度就是依附于该顶点的边的个数子图:是一幅图的所有边的子集(包含这些边依附的顶点)组成的图;路径:是由边顺序连接的一系列的顶点组成环:是一条至.
2021-02-23 14:08:30
105
原创 OpenGL函数总结
glClearColor就是清空当前的所有颜色void glShadeModel ( GLenum mode)GL_SMOOTH:颜色渐变GL_FLAT:颜色单一参考链接glClearDepth设置深度缓存。参考链接void glEnable(GLenum cap)启用各种功能。参考链接glDepthFunc设置深度测试类型。参考链接glHint告诉系统对透视进行修正。参考链接...
2021-01-22 17:54:02
154
原创 静态库与动态库的基本介绍
静态库静态库的特点静态库的使用创建使用动态库动态库的特点动态库的使用创建使用静态加载动态加载 动态库与静态库的区别在于可执行程序生成时的链接阶段,如下图所示: 静态库静态库的特点 静态库具有以下特点:静态库对函数库的链接实在编译时期完成的。程序在运行时与函数库再无瓜葛,移植方便。浪费空间资源,因为所有相关的目标文件与涉及到的函数库都被链接合成一个可执行文件。如果静态库更新了,所有使用它的应用程序都需要重新编译、发布给用户。 其中第三点揭示了静态库的重要缺陷:如果静态库被多.
2021-01-04 17:41:39
274
原创 lambda函数详解
lambda函数的使用捕获列表常量性区别1常量性区别2lambda函数与仿函数lambda函数的常量性lambda函数与函数指针注意事项lambda函数的使用 lambda函数的完整形式如下:[capture](parameters) mutable->return-type{statement} 其中,[capture]:捕捉列表,捕捉列表可以捕捉上下文中的变量以供lambda函数使用。(parameters):参数列表,与普通函数列表一致,如果不需要传参,那么可以连()一起.
2021-01-02 21:53:38
8935
原创 运算符重载探究
意义使用限制非成员函数的运算符重载成员函数还是非成员函数?意义 因为简单的加减乘除符号不能满足我们的需求,例如如果我们要将两个类相加(可能只是针对类中的数据成员相加),常规的加法运算符显然时不能满足需求的;使用operator+( ); //重载加法运算符 需要熟悉一下使用重载运算符的基本用法:class Time{ Time operator+(const Time & t) const;};Time Time:operator+(const Time.
2021-01-02 11:57:46
155
原创 C++中IO类的基本解析
文件输入输出缓冲区 上图展示了C++中文件IO设计类的基本关系,从中我们可以看出,标准输入与文件输入类继承于同一个基类,标准输出与文件输出类继承于同一个基类。下面针对C++中IO类的一些特性进行介绍。 c++的输入与输出包括以下三个部分:对系统制定的标准设备的输入和输出,称为标准 I/O(设备);以磁盘文件为对象进行输入和输出,称为文件 I/O(文件);对内存中指定的空间进行输入和输出,称为串 I/O(内存); 其中标准I/O如下:cin :标准输入流,从键盘输入。cout.
2020-12-30 22:58:57
219
原创 函数对象简述
使用方式函数与函数对象函数指针与函数对象使用方式 函数对象,简而言之,就是类对于()运算符的重载,使我们可以像使用函数那样使用对象。示例如下:#ifndef TOOBIG_H#define TOOBIG_Htemplate<typename T>class TooBig{public: TooBig(const T &t) : cutoff(t) {} bool operator()(const T &v) {return v > cutof.
2020-12-29 13:05:24
117
原创 RTTI简述
RTTI的用途RTTI的使用typeiddynamic_cast与其他转换运算符RTTI的用途 得益于虚函数表,如果派生类实现了基类中的虚函数,通过基类指针或引用可以完成正确的函数调用。 但是也不得不考虑另外一种情况:如果某个派生类中实现了基类定义的虚函数以外的函数,此时,只有基类指针或引用,那么该怎样确认其是正确的派生类类型,从而完成派生类独有函数的调用呢?基于这种情形,因此C++提供了RTTI。RTTI的使用 目前C++支持RTTI元素包括:dynamic_cast和typeid(t.
2020-12-28 15:48:41
243
原创 std::function详解
std::function是一个函数包装器模板,最早来自boost库,对应其boost::function函数包装器。在c++11中,将boost::function纳入标准库中。该函数包装器模板能包装任何类型的可调用元素(callable element),例如普通函数和函数对象。包装器对象可以进行拷贝,并且包装器类型仅仅只依赖于其调用特征(call signature),而不依赖于可调用元素自身的类型。 一个std::function类型对象实例可以包装下列这几种可调用元素类型:函数、函数指针
2020-12-27 21:22:48
2760
原创 C++内存模型总结
自动存储类型静态存储类型外部链接性内部链接性无链接性动态存储类型 C++主要有三种存储类型:自动存储类型:在函数定义中声明的变量(包括函数参数),他们在函数执行时被创建,在函数执行完毕后被释放。静态存储类型:在函数定义外定义的变量和使用关键字static定义的变量,它们在程序运行的整个过程中都存在。动态存储类型:用new运算符分配的内存将一直存在,知道delete将其释放或程序结束为止。 从存储区域来看,三种类型分布如下: 简而言之:自动存储类型保存在栈,静态存储类型保存在BSS.
2020-12-27 17:57:25
208
原创 右值引用详解
##何谓右值 一个最简单判断左值、右值的方式是:等号左边的值即左值,等号右边的值即右值;但为了更加严谨,我们这样定义:能够取地址的,有名字的就是左值;反之,不能取地址,没有名字的就是右值。##右值引用的作用###为什么要有右值引用 我们知道,当类成员中存在指针成员时,使用复制拷贝构造,需要进行深拷贝,但问题在于:我们真的任何时候都需要深拷贝吗?首先来看一下下面的几个代码片段。片段1:String s;String p = s;... 上面无疑是需要深拷贝的,因为无论s,还是p...
2020-12-24 22:50:13
15714
5
原创 记网易面试总结
最近进行了一次网易的社招面试,目前结果未知,但是从网易面试中我还是有一些体会,总结如下:作为非计算机专业的程序员来说,如果要进大厂,数据结构与算法是一定要补的。适度刷下leetcode中的算法题,大厂都好这一口,不要不信邪,我就以身试法了一回。建立自己完善的知识框架,我们可以一点一点构建,不急于一时,但是一定要去做,这是一个长期的过程。在知道“是什么”的基础上,多问自己“为什么”,简而言之:除了会使用之外,还要探究原理。写到简历上的项目一定要无懈可击,尤其那些做过很久的项目由于时间原因,一定
2020-12-23 09:45:37
191
原创 虚函数表
虚函数表是实现多态的核心,所谓多态,就是“一个函数,多种实现”,当我们通过类指针或引用调用一个函数接口时,编译器在运行期间将会根据该指针或引用实际指向的对象来调用函数,而这就是通过虚函数表来实现的,换种方式说,虚函数表,完成了动态联编中寻找虚函数哪个执行代码块的任务; 现在来理一下编译器使用虚函数表的过程: 编译器在处理虚函数时,会为基类及相关派生类添加一个隐藏成员,这个成员是用来指向虚函数表的指针,对于每个对象而言,该指针是不同的,该指针指向的虚函数表也是不同的,如果我们把这个指针视作vpr,
2020-12-21 21:31:40
174
原创 类的构造、拷贝、赋值、析构函数
构造、拷贝、赋值、析构函数是类的四个特殊成员函数,其特殊之处在于,即使我们没有定义这些函数,编译器也会自动提供默认函数,但如果我们提供了这些函数的显式定义,那么编译器将不会再提供。这可能导致一些隐藏的问题,因此,我们需要对他们的实现进行充分的认识。##默认构造函数 假定有一个类Klunk,那么其默认构造函数定义如下:Klunk::Klunk(){} 编译器为我们提供了一个不接受任何参数,也不执行任何操作的构造函数,我们可以像下面这样调用:Klunk lunk; 但是这种不做任...
2020-12-21 19:53:10
337
原创 常见查找、排序算法的实现
查找二分查找排序冒泡排序选择排序快速排序 以下是部分常见排序查找算法的实现,后期会继续补充。查找二分查找static int binarySerach(int *array, int count, int key){ int left = 0; int right = count - 1; while (left <= right) { int mid = (left + right) / 2; if (array[mi.
2020-12-17 17:18:43
354
原创 原子操作与原子类型
多线程是并发编程中不可或缺的部分,而所谓原子操作,也就是指多线程中“最小的且不可并行化的”操作,如果一个共享资源的操作时原子操作的话,意味着多个线程访问该资源时,有且仅有一个线程在对这个资源进行操作。通常情况下,原子操作都是通过“互斥”来实现的,例如mutex。这种操作在开发当中使用相当频繁所以我们不做讨论。但是是否还有其他更便于使用的方式呢?c++11给出了答案,就是原子类型。 原子类型,是c++11中提供的一类数据类型,这种数据类型,不需要我们显式使用互斥锁,但是,编译器却可以保证原子类型...
2020-12-17 16:46:13
508
1
原创 Qt之信号槽机制详解
基本介绍基本使用注意事项基本介绍 毫无疑问,Qt的信号槽机制是Qt框架的核心机制之一,从本质上来讲,其实际是观察者模式。当某个事件发生后,继承于QObject的某个对象就会发出一个信号,如果有对象对此信号感兴趣,就可以连接(connect)过来,实现自己的槽函数,一旦信号发出,那么槽函数将会根据连接方式选择时机回调。基本使用 Qt中的信号槽机制是依赖于The Meta-Object System 实现的,根据Qt的assistant中所述,其基于三点实现:QObject为类提供了可以使用.
2020-12-11 15:01:16
989
原创 Qt中信号槽的连接方式
Qt::AutoConnection 如果信号发送者和接收者在同一线程,Qt::DirectConnection被使用,否则Qt::QueuedConnection被使用;Qt::DirectConnection 信号发送,信号槽立刻执行。Qt::QueuedConnection 事件循环返回接收者线程时,信号槽才会执行;Qt::BlockingQueuedConnection 和Qt::QueuedConnection基本相同,不同在于:它是阻塞的,即发出信号之后,线程将一直阻塞直到
2020-12-11 12:02:34
385
原创 费曼学习法简述
你真的已经对某个知识点足够深入了吗?还是只是停留在一个肤浅的阶段?不妨试试费曼学习法,让自己的思考更加深入。 费曼学习法,主要分为四个阶段: 下面针对这四个步骤进行详述。选择概念 选择一个你想学习的概念;讲授概念 你对面的是一个10岁孩童,试图向对方解释这个概念,并让对方完全听懂。在这个过程中,你将会对最基础的概念加以解释,但是如果无法解释清楚,那么注意:这就是你的漏洞。查漏补缺 很好,经过第二步,相比你已经发现有些东西其实你也了解的很肤浅,似懂非懂,那么重新把这个概念研究一
2020-12-11 10:52:15
546
原创 QDoubleValidator完善版
使用过QDoubleValidator的同学都知道,QDoubleValidator在Qt中实现并不完善,导致使用时存在bug,但是幸好,Qt提供了validate的虚函数,让我们可以重写它,以下是我实现的一个QDoubleValidator版本,暂时没有发现什么问题。//***********************QDoubleValidator.h*************************//#ifndef QTVEDITORDOUBLEVALIDATOR_H#define QTVE
2020-12-09 14:25:21
2180
原创 树综述
一直以来,树这个部分都是我知识结构中的一个漏洞,虽然平时工作中很少用到,但是我觉得还是有必要进行梳理、总结,完善自己的知识图谱。基本概念 树由节点和边组成,边是节点的有序对,一般分布在箭头两端。树的顶端节点,称为树的根。 对于一个边而言,尾部节点是箭头方向节点的祖先,后者是前者的子孙,需要注意:每个节点都是自身的子孙,如果我们要寻找的某个节点的子孙而不包括节点本身时,我们需要指明查找的是节点的特有子孙。 没有子孙的节点成为树叶。 树的节点个数要比边树多1,因为每个节点除了根节点外,都是
2020-12-08 15:54:50
764
原创 visual studio使用记录
vs引用第三方库vs引用第三方库 以配置opencv库为例:包含目录:用于设置头文件所在目录,对opencv而言,包含其include目录和include目录下的opencv、opencv2共三个目录。库目录:也就是静态库所在路径。附加依赖项:静态库名称,需要加后缀*.lib,由于库目录中已经设置了静态库所在路径,所以这里不需要再写绝对路径,如果有设置静态库,但是链接时找不到,那么一般就会报link错误。 除此之外,由于opencv库使用静态加载方式,所以除了静态库用于链接外,还.
2020-12-04 09:38:59
124
原创 函数模板初探
函数模板是一个相当大的群体,很难以一篇文章的形式将其彻底总结完,本节将总结一些函数模板的基本使用,至于更加高级的用法,可能在后面加以深入;函数模板的基本使用 如果一个函数,针对各种数据类型,如果其实现算法都大体相同,那么就可以使用函数模板; 其实从上面的使用场景可以看出,似乎我们也可以通过函数重载实现,但问题在于,如果有相当多的数据类型,那么可能要定义同样多类型的函数重载,这将会成为一项复杂的工程; 因此,当我们考虑使用函数模板时,如果涉及的类型较少,那么可以直接使用函数重载; 同样,
2020-12-03 22:59:11
106
原创 bind详解
bind与占位符绑定普通函数绑定成员函数绑定函数对象 如果你还在使用bind1st/bind2nd,那么恐怕已经out了,Boost提供了更强大的武器bind,用于函数对象的绑定; bind接受的第一个参数必须是可调用对象f,包括函数、函数指针、函数对象、成员函数,之后最多可以接受9个参数,参数的数量必须与f的参数数量相等,这些参数姜维作为f函数的参数。 bind会返回一个函数对象,它内部保存了f的拷贝,当发生调用时,之前参数将传给f函数完成调用。bind与占位符 bind与占位符可以.
2020-12-02 22:58:29
7885
原创 visual stdio报错集锦
error C2220: 警告被视为错误 - 没有生成“object”文件C++报错:The build tools for v141 (Platform Toolset = ‘v141’) cannot be found.
2020-12-02 10:21:07
340
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人