- 博客(16)
- 资源 (6)
- 收藏
- 关注
原创 快速排序
此算法将列表元素一分为二:一部分为小于”基准“元素的列表,一部分为大于”基准“元素的列表;待列表分割后,算法又在每个较小的列表上重复这一过程。快速排序的实现:void quick_sort(int* array, int lower, int upper){ int tmp; int mid = (upper+lower)/2; int pivot = array[mid]; int
2015-10-29 19:08:17 477
原创 volatile:多线程编程的最好伙伴
voaltile关键字被设计成在现存的某个异步事件中防止会导致代码错误的编译器优化。仅仅是一个小小的关键字当谈及到线程时,尽管所有的C和C++标准都明显的沉默,但是它们以volatile关键字的形式对多线程做了小小的让步。就像更知名的极其相似的const一样,volatile是一个类型修饰符。它的目的是用于在不同线程中访问和修改的变量协同工作。基本上,没有volatile,
2015-10-29 08:20:59 896
原创 线程依附性
一个QObject实例是具有线程依附性的,或者说它驻留在某个线程。当一个OQbject接收到队列信号(queued signal)或者投递事件(posted event),槽函数或者事件处理函数运行在对象驻留的线程中。 注意:如果一个QObject没有线程依附性(也就是说thread()函数返回0),或者它位于没有运行事件循环的线程内,那么它就不能接收到队列信号或者投递事件。
2015-10-28 20:32:23 758
原创 基本递归和尾递归
基本递归 先看一下计算n的阶乘的定义式: n! = (n)(n-1) (n-2)...(1) 使用递归可以将其表达成: F(n) = 1 如果 n=0, n=1 F(n) = nF(n-1) 如果 n>1 实现代码如下:int fac
2015-10-28 16:06:53 1223
原创 Qt中的并发
QThread是一个低级(low-level)类,适合用于显式地构建长期运行的线程。 QtConcurrent是一个命名空间,提供了用于编写并发软件的更高层次的类和算法。该命名空间中有一个重要的类,QThreadPool,这是一个管理线程池的类。每个Qt应用程序都有一个QThreadPool::globalInstance()函数,它带有一个推荐的最大线程数,在大多数系统上,处理核的数
2015-10-28 09:58:40 6364
原创 Qt中使用到的设计模式之反射模式
所谓反射,就是指对象成员的自我检查。使用反射编程(reflective programming),就可以编写出通用的操作,可对具有各种不同结构的类进行操作,使用通用的值存储器QVariant,就可以按照一种统一的方式来对基于类型和其它普通类型进行操作。QMetaObject——元对象模式 所谓元对象(meta object),就是描述另一个对象结构的对象。
2015-10-28 08:18:17 2253
原创 Qt中的智能指针
尽管C++不支持垃圾回收,但C++对象的自动内存管理还是可以通过好几种方式来实现,主要是通过智能指针使用以及引用计数。Qt提供了许多不同的智能指针类型,以适用于不同的用途。一个重写了指针解引用操作operator*()和operator->()的类被称为智能指针。这使得类实例的行为就像它是一个内置指针一样。这样的类几乎总是模板类,因此定义时必须在模板参数中提供引用类型。最常见的能找到这些重写操
2015-10-27 19:15:14 8986
原创 树中两个结点的最低公共祖先
一棵树如下图所示:假设要找到结点F和H的最低公共祖先。首先我们得判断A的子树中是否同时包含结点F和H,得到的结果为true。接着我们再先后判断A的两个子结点B和C的子树是不是同时包含F和H,结果是B的结果是true而C的结果是false。接下来我们再判断B的两个子结点D和E,发现这两个结点得到的结果都是false。于是B就是最后一个公共祖先。当我们判断以结点A为根的树中是否含有结点
2015-10-27 15:52:25 580
转载 把字符串转换成整数
enum Status { kValid = 0, kInvalid };int g_nStatus = kValid;int StrToInt(const char* str){ g_nStatus = kInvalid; long long number = 0; if(str != NULL && *str != '\0') { bool minus = false;
2015-10-27 15:31:24 506
原创 不用加减乘除做加法
首先我们分析一下十进制加法是如何计算的,比如是如何得出5+17=22这个结果的。一般可以分成3步进行:1)只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1);2)做进位,5+7中有进位,进位的值是10;3)把前面两个结果加起来,12+10的结果是22,刚好5+17=22。 然后我们分析下这种方法对于二进制是否也有效。5的
2015-10-27 13:18:21 578
原创 求1+2+...+n的n种方法
一、利用构造函数求解这种方法本质上还是利用循环来完成。循环只是让相同的代码重复执行n遍而已,我们完全可以不用for和while来达到这个效果。比如我们先定义一个类型,接着创建n个该类型的实例,那么这个类型的构造函数将确定会被调用n次。我们可以将与累加相关的代码放到构造函数里。如下代码正是基于这个思路:class Temp{public: Temp() { ++N; Sum
2015-10-27 10:16:00 2974
原创 update和repaintde的区别
当产生一个绘制事件并且调用paintEvent()函数的时候,会出现如下几种情况: 1)在窗口部件第一次显示时,系统会自动产生一个绘制事件,从而强制绘制这个窗口部件本身。 2)当重新调整窗口部件的大小时,系统也会产生一个绘制事件。 3)当窗口部件被其他窗口部件遮挡,然后又再次显示出来的时候,就会对那些隐藏的区域产生一个绘制事件(除非这个窗口系统存储了整个区域)。
2015-10-27 09:54:48 747
原创 Qt::WA_StaticContents的作用
Qt::WA_StaticContents这个属性告诉Qt,当重新改变窗口部件的大小时,这个窗口部件的内容并没有发生变化,而且它的内容仍旧保留从窗口部件左上角开始的特性。当重新定义窗口部件的大小时,通过使用这个信息,Qt就可以避免对已经显示区域的重新绘制。图5.5图示了这一情形。 通常情况下,当重新定义一个窗口部件的大小时,Qt会为窗口部件的整个可见区域生成一个绘制事件。但是如果该
2015-10-27 09:50:56 1671 1
原创 线程安全之单例模式
一、懒汉模式即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。需要用锁来保证其线程安全性。原因:多个线程可能进入判断是否已经存在实例的if语句,从而导致线程不安全。使用Double-check Locking来保证线程安全性。但是处理大量数据时,该锁会成为严重的性能瓶颈。1)静态成员实例的懒汉模式class Singleton{private: st
2015-10-26 20:34:05 612
原创 Winows API串口编程
使用Windows API操作串口有两种方式:同步方式和异步方式(又称为重叠方式)。同步方式是指API函数会阻塞直到操作完成才返回;在多线程下,虽然不会阻塞主线程,但是仍然会阻塞监听线程。而异步方式下,API函数会立即返回,操作在后台进行,避免线程的阻塞。 操作串口一般有以下几步骤: 1)获取串口 2)打开串口 3)配置串口 4)读写串口 5)关闭串口
2015-10-26 14:32:39 1125
转载 以空间换时间计算Fibonacci数列
先来看一下Fibonacci序列的定义:F(n) = 1, n = 0 或 1F(n) = F(n - 1) + F(n - 2) n > 1一般情况下,我们都喜欢采用递归方法计算Fibonacci数列,像下面这样的代码:int f(int n){ if(n <= 1) { return 1; } return
2015-10-26 10:11:06 534
数字图像处理与机器视觉——Visual C++与Matlab实现(pdf+附书源码)
2015-07-07
Visual C++网络高级编程(pdf)+实例源代码
2014-09-02
嵌入式Linux应用程序开发标准教程
2012-11-01
嵌入式Linux应用程序开发详解
2012-11-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人