- 博客(27)
- 收藏
- 关注
原创 全景影像的3D显示
全景影像是一种特殊的影像,它有360度的视角,但是在二维平面上观察时,其更像一个“拉开的拉链”,为了更好的显示全景影像,我们需要将其还原到球坐标系下,从而完成其360度的正常显示。 由于工作关系,需要在Qt平台下完成全景影像360度视角显示,经过研究,结合QOpenGLWidget+OpenGL可以实现,这里之所以不使用QGLWidget,是因为该控件已被废弃;其次,Qt平台虽然已经支持了openGL的相关API(QGLFunctions),但是由于发现需要使用的部分API在Qt中找不到(猜测可能是
2020-12-16 14:06:52 1305 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 687
原创 C++中IO类的基本解析
文件输入输出缓冲区 上图展示了C++中文件IO设计类的基本关系,从中我们可以看出,标准输入与文件输入类继承于同一个基类,标准输出与文件输出类继承于同一个基类。下面针对C++中IO类的一些特性进行介绍。 c++的输入与输出包括以下三个部分:对系统制定的标准设备的输入和输出,称为标准 I/O(设备);以磁盘文件为对象进行输入和输出,称为文件 I/O(文件);对内存中指定的空间进行输入和输出,称为串 I/O(内存); 其中标准I/O如下:cin :标准输入流,从键盘输入。cout.
2020-12-30 22:58:57 192
原创 函数对象简述
使用方式函数与函数对象函数指针与函数对象使用方式 函数对象,简而言之,就是类对于()运算符的重载,使我们可以像使用函数那样使用对象。示例如下:#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 90
原创 RTTI简述
RTTI的用途RTTI的使用typeiddynamic_cast与其他转换运算符RTTI的用途 得益于虚函数表,如果派生类实现了基类中的虚函数,通过基类指针或引用可以完成正确的函数调用。 但是也不得不考虑另外一种情况:如果某个派生类中实现了基类定义的虚函数以外的函数,此时,只有基类指针或引用,那么该怎样确认其是正确的派生类类型,从而完成派生类独有函数的调用呢?基于这种情形,因此C++提供了RTTI。RTTI的使用 目前C++支持RTTI元素包括:dynamic_cast和typeid(t.
2020-12-28 15:48:41 211
原创 std::function详解
std::function是一个函数包装器模板,最早来自boost库,对应其boost::function函数包装器。在c++11中,将boost::function纳入标准库中。该函数包装器模板能包装任何类型的可调用元素(callable element),例如普通函数和函数对象。包装器对象可以进行拷贝,并且包装器类型仅仅只依赖于其调用特征(call signature),而不依赖于可调用元素自身的类型。 一个std::function类型对象实例可以包装下列这几种可调用元素类型:函数、函数指针
2020-12-27 21:22:48 2636
原创 C++内存模型总结
自动存储类型静态存储类型外部链接性内部链接性无链接性动态存储类型 C++主要有三种存储类型:自动存储类型:在函数定义中声明的变量(包括函数参数),他们在函数执行时被创建,在函数执行完毕后被释放。静态存储类型:在函数定义外定义的变量和使用关键字static定义的变量,它们在程序运行的整个过程中都存在。动态存储类型:用new运算符分配的内存将一直存在,知道delete将其释放或程序结束为止。 从存储区域来看,三种类型分布如下: 简而言之:自动存储类型保存在栈,静态存储类型保存在BSS.
2020-12-27 17:57:25 185
原创 右值引用详解
##何谓右值 一个最简单判断左值、右值的方式是:等号左边的值即左值,等号右边的值即右值;但为了更加严谨,我们这样定义:能够取地址的,有名字的就是左值;反之,不能取地址,没有名字的就是右值。##右值引用的作用###为什么要有右值引用 我们知道,当类成员中存在指针成员时,使用复制拷贝构造,需要进行深拷贝,但问题在于:我们真的任何时候都需要深拷贝吗?首先来看一下下面的几个代码片段。片段1:String s;String p = s;... 上面无疑是需要深拷贝的,因为无论s,还是p...
2020-12-24 22:50:13 15535 5
原创 记网易面试总结
最近进行了一次网易的社招面试,目前结果未知,但是从网易面试中我还是有一些体会,总结如下:作为非计算机专业的程序员来说,如果要进大厂,数据结构与算法是一定要补的。适度刷下leetcode中的算法题,大厂都好这一口,不要不信邪,我就以身试法了一回。建立自己完善的知识框架,我们可以一点一点构建,不急于一时,但是一定要去做,这是一个长期的过程。在知道“是什么”的基础上,多问自己“为什么”,简而言之:除了会使用之外,还要探究原理。写到简历上的项目一定要无懈可击,尤其那些做过很久的项目由于时间原因,一定
2020-12-23 09:45:37 160
原创 虚函数表
虚函数表是实现多态的核心,所谓多态,就是“一个函数,多种实现”,当我们通过类指针或引用调用一个函数接口时,编译器在运行期间将会根据该指针或引用实际指向的对象来调用函数,而这就是通过虚函数表来实现的,换种方式说,虚函数表,完成了动态联编中寻找虚函数哪个执行代码块的任务; 现在来理一下编译器使用虚函数表的过程: 编译器在处理虚函数时,会为基类及相关派生类添加一个隐藏成员,这个成员是用来指向虚函数表的指针,对于每个对象而言,该指针是不同的,该指针指向的虚函数表也是不同的,如果我们把这个指针视作vpr,
2020-12-21 21:31:40 145
原创 类的构造、拷贝、赋值、析构函数
构造、拷贝、赋值、析构函数是类的四个特殊成员函数,其特殊之处在于,即使我们没有定义这些函数,编译器也会自动提供默认函数,但如果我们提供了这些函数的显式定义,那么编译器将不会再提供。这可能导致一些隐藏的问题,因此,我们需要对他们的实现进行充分的认识。##默认构造函数 假定有一个类Klunk,那么其默认构造函数定义如下:Klunk::Klunk(){} 编译器为我们提供了一个不接受任何参数,也不执行任何操作的构造函数,我们可以像下面这样调用:Klunk lunk; 但是这种不做任...
2020-12-21 19:53:10 301
原创 常见查找、排序算法的实现
查找二分查找排序冒泡排序选择排序快速排序 以下是部分常见排序查找算法的实现,后期会继续补充。查找二分查找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 331
原创 原子操作与原子类型
多线程是并发编程中不可或缺的部分,而所谓原子操作,也就是指多线程中“最小的且不可并行化的”操作,如果一个共享资源的操作时原子操作的话,意味着多个线程访问该资源时,有且仅有一个线程在对这个资源进行操作。通常情况下,原子操作都是通过“互斥”来实现的,例如mutex。这种操作在开发当中使用相当频繁所以我们不做讨论。但是是否还有其他更便于使用的方式呢?c++11给出了答案,就是原子类型。 原子类型,是c++11中提供的一类数据类型,这种数据类型,不需要我们显式使用互斥锁,但是,编译器却可以保证原子类型...
2020-12-17 16:46:13 444 1
原创 Qt之信号槽机制详解
基本介绍基本使用注意事项基本介绍 毫无疑问,Qt的信号槽机制是Qt框架的核心机制之一,从本质上来讲,其实际是观察者模式。当某个事件发生后,继承于QObject的某个对象就会发出一个信号,如果有对象对此信号感兴趣,就可以连接(connect)过来,实现自己的槽函数,一旦信号发出,那么槽函数将会根据连接方式选择时机回调。基本使用 Qt中的信号槽机制是依赖于The Meta-Object System 实现的,根据Qt的assistant中所述,其基于三点实现:QObject为类提供了可以使用.
2020-12-11 15:01:16 935
原创 Qt中信号槽的连接方式
Qt::AutoConnection 如果信号发送者和接收者在同一线程,Qt::DirectConnection被使用,否则Qt::QueuedConnection被使用;Qt::DirectConnection 信号发送,信号槽立刻执行。Qt::QueuedConnection 事件循环返回接收者线程时,信号槽才会执行;Qt::BlockingQueuedConnection 和Qt::QueuedConnection基本相同,不同在于:它是阻塞的,即发出信号之后,线程将一直阻塞直到
2020-12-11 12:02:34 351
原创 费曼学习法简述
你真的已经对某个知识点足够深入了吗?还是只是停留在一个肤浅的阶段?不妨试试费曼学习法,让自己的思考更加深入。 费曼学习法,主要分为四个阶段: 下面针对这四个步骤进行详述。选择概念 选择一个你想学习的概念;讲授概念 你对面的是一个10岁孩童,试图向对方解释这个概念,并让对方完全听懂。在这个过程中,你将会对最基础的概念加以解释,但是如果无法解释清楚,那么注意:这就是你的漏洞。查漏补缺 很好,经过第二步,相比你已经发现有些东西其实你也了解的很肤浅,似懂非懂,那么重新把这个概念研究一
2020-12-11 10:52:15 504
原创 QDoubleValidator完善版
使用过QDoubleValidator的同学都知道,QDoubleValidator在Qt中实现并不完善,导致使用时存在bug,但是幸好,Qt提供了validate的虚函数,让我们可以重写它,以下是我实现的一个QDoubleValidator版本,暂时没有发现什么问题。//***********************QDoubleValidator.h*************************//#ifndef QTVEDITORDOUBLEVALIDATOR_H#define QTVE
2020-12-09 14:25:21 2102
原创 树综述
一直以来,树这个部分都是我知识结构中的一个漏洞,虽然平时工作中很少用到,但是我觉得还是有必要进行梳理、总结,完善自己的知识图谱。基本概念 树由节点和边组成,边是节点的有序对,一般分布在箭头两端。树的顶端节点,称为树的根。 对于一个边而言,尾部节点是箭头方向节点的祖先,后者是前者的子孙,需要注意:每个节点都是自身的子孙,如果我们要寻找的某个节点的子孙而不包括节点本身时,我们需要指明查找的是节点的特有子孙。 没有子孙的节点成为树叶。 树的节点个数要比边树多1,因为每个节点除了根节点外,都是
2020-12-08 15:54:50 698
原创 visual studio使用记录
vs引用第三方库vs引用第三方库 以配置opencv库为例:包含目录:用于设置头文件所在目录,对opencv而言,包含其include目录和include目录下的opencv、opencv2共三个目录。库目录:也就是静态库所在路径。附加依赖项:静态库名称,需要加后缀*.lib,由于库目录中已经设置了静态库所在路径,所以这里不需要再写绝对路径,如果有设置静态库,但是链接时找不到,那么一般就会报link错误。 除此之外,由于opencv库使用静态加载方式,所以除了静态库用于链接外,还.
2020-12-04 09:38:59 96
原创 函数模板初探
函数模板是一个相当大的群体,很难以一篇文章的形式将其彻底总结完,本节将总结一些函数模板的基本使用,至于更加高级的用法,可能在后面加以深入;函数模板的基本使用 如果一个函数,针对各种数据类型,如果其实现算法都大体相同,那么就可以使用函数模板; 其实从上面的使用场景可以看出,似乎我们也可以通过函数重载实现,但问题在于,如果有相当多的数据类型,那么可能要定义同样多类型的函数重载,这将会成为一项复杂的工程; 因此,当我们考虑使用函数模板时,如果涉及的类型较少,那么可以直接使用函数重载; 同样,
2020-12-03 22:59:11 84
原创 bind详解
bind与占位符绑定普通函数绑定成员函数绑定函数对象 如果你还在使用bind1st/bind2nd,那么恐怕已经out了,Boost提供了更强大的武器bind,用于函数对象的绑定; bind接受的第一个参数必须是可调用对象f,包括函数、函数指针、函数对象、成员函数,之后最多可以接受9个参数,参数的数量必须与f的参数数量相等,这些参数姜维作为f函数的参数。 bind会返回一个函数对象,它内部保存了f的拷贝,当发生调用时,之前参数将传给f函数完成调用。bind与占位符 bind与占位符可以.
2020-12-02 22:58:29 7285
原创 visual stdio报错集锦
error C2220: 警告被视为错误 - 没有生成“object”文件C++报错:The build tools for v141 (Platform Toolset = ‘v141’) cannot be found.
2020-12-02 10:21:07 305
转载 对“雷军的终极思考”的思考
最近看了一篇文章。全文在这里。总结下来就是以下几点,读完以后做了思考,颇为赞同。总结为以下几点:1. 在对的时候做对的事情,比任何时候用对的人、把事情做对都重要。 其实就是天时的重要性。有时候我就在想这多少有点宿命的味道。 2. 看五年、想三年、认真做好一两年。 记得周鸿祎也说过,所谓人生规划,很多时候都是倒叙的。边走边看,稍微看远一点。计划赶不上变化,但是一定记得要踏实。踏实的走好每一步,大方向对了就好。其他的还是需要很大成分的运气。3. 顺势而为
2020-12-01 14:39:20 95
原创 智能指针总结
智能指针用于管理动态内存,当智能指针过期时,这些内存将自动释放;智能指针也是模板,当我们创建智能指针时,需要提供其所指向的类型; 可以从 auto_ptr 的构造函数来了解一下智能指针的基本构成:template<class X> class atuo_ptr{ public: explicit auto_ptr(X* p=0) throw;} 从上面可以看出,智能指针中保存了一个指针成员,在构造函数中传入赋值;目前 auto_ptr 已经被弃用,主要原因在于:
2020-12-01 10:38:25 147
转载 一名国外程序员的感悟
我是一名程序员,几个月前刚过完四十岁生日。 某个星期六的早晨,我参加了一个 React Native 技术交流会,演讲者正在竭力说服我们为什么它会成为移动开发领域真正的下一个大事件。但对我来说,它有点像十五年前的 jsp ,将所有的逻辑都放在演示代码里面。但我“老”了,我认为这是因为自己还没有完全理解它。 演讲者展示完 ppt 后,现场进行编码,还展示了大约半打我没听说过的配套工具,这些都让我感到有点沮丧。 当然,我并...
2020-12-01 10:19:18 253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人