- 博客(84)
- 资源 (9)
- 收藏
- 关注
原创 __declspec(dllexport)和__declspec(dllimport)
在Windows中,动态链接库(DLL)是作为函数和资源的共享库的一种可执行文件。动态链接是操作系统功能。它可使执行文件调用函数或使用存储在单独文件中的资源。可从使用这些函数和资源的可执行文件中对其分别进行部署。DLL不是独立的可执行文件。DLL在调用它们的应用程序的上下文中运行。操作系统将DLL加载到应用程序的内存空间中。此操作要么在加载应用程序时(隐式链接)完成,要么在运行时按需(显示链接)完成。DLL还可以在可执行文件之间轻松共享函数和资源。多个应用程序可同时访问内存中单个DLL副本的内容。
2023-02-05 15:42:27
2219
原创 MySQL数据库——由于外键的存在导致修改存在表引发的一个错误
1. 错误的来源首先,创建了person表:mysql> CREATE TABLE person -> (person_id SMALLINT UNSIGNED, -> fname VARCHAR(20), -> lname VARCHAR(20), -> gender ENUM('M', 'F'), -> bi...
2018-08-02 22:25:54
5112
1
原创 Apache2.4 安装
1. 下载ApacheApache是一款开源的Web服务软件。我们可以直接到官网上下载到最新的Apache源码。这里我使用的是httpd-2.4.33。官方下载链接:https://www.apachelounge.com/download/2. 配置Apache...
2018-07-12 21:55:49
5027
原创 1.1如何启动和关闭MySQL服务器
1. 通过系统服务启动和关闭MySQL服务器如果MySQL设置为Windows服务,则可以通过Window服务管理器进行启动和关闭。2. 通过命令提示符启动和关闭MySQL服务器在命令提示符下输入:停止MySQL服务器\> net stop mysql 启动MySQL服务器\> net start mysql...
2018-06-19 22:33:22
8748
原创 boost_1_66_0 VS2015编译安装
1. 下载boost库boost库是一个应用广泛的开源库,我们可以到boost官网上下载我们需要的boost库版本。博主这里使用的是boost_1_66_0.由于这里我们是在VS2015上编译安装,因此我们下载是的Window版本的boost库。下载完成后,只需要解压到指定目录即可(这个目录可自行选择)。...
2018-02-11 10:25:30
3098
原创 boost::thread
1. 简介thread 库为 c++增加了线程处理的能力,它提供简明清晰的线程、互斥量等概念,可以很容易地创建多线程应用程序。thread 库也是高度移植的,它支持使用最广泛的 Windows 和 POSIX 线程,用它编写的代码不需要修改就可以在Windows、UNIX等操作系统上编译运行。thread 库也是boost库中少数需要编译才能使用的库,并且thread 库需要date_time 库...
2018-02-11 10:22:27
1481
原创 数据结构——二叉搜索树
1. 简介 二叉搜索树中的关键字总是以满足二叉搜索树性质的方式来存储: 设x是二叉搜索树中的一个结点。如果y是x的左子树的一个结点,那么y.key = x.key。 在下图中,,树根的关键字为6,在其左树中有关键字2、5和5,它们均不大于6;而在其右子树有关键字7和8,它们均不小于6。并且这个性质对于图中的每个结点都成立。2. 遍历二叉树 所谓遍历是
2018-02-07 21:28:51
306
原创 boost::weak智能指针
1. 简介 weak_ptr 是为配合 shared_ptrt 而引入的一种智能指针,它更像是 shared_ptr 的一个助手而不是智能指针,因为它不具备普通指针的行为,没有重载 operator * 和 ->。它的最大作用在于协助 shared_ptr 工作,像旁观者那样观测资源的使用情况。 利用 weak_ptr,我们可以解决常见的空悬指针问题和循环引用问题。 空悬指针问题
2018-02-06 16:31:00
291
原创 boost::shared_ptr智能指针分析
1. 简介 boost.smart_ptr 库中最有价值、最重要的组成部分,也是最有用的。 shared_ptr 与 scoped_ptr 一样包装了new 操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。shared_ptr 也可以安全地放到标准容器中,并弥补了a
2018-02-03 11:47:52
907
原创 boost::scoped_array
1.简介 scoped_array很像scoped_ptr,它包装了new[ ]操作符(不是单纯的new)在堆上分配的动态数组,为动态数组提供了一个代理,包装可以正确地释放内存。2. scoped_array 分析 scoped_array 的类摘要如下所示(这里列出重要部分):template class scoped_array // noncopyable{priva
2018-01-31 09:17:50
1083
原创 泛型编程——模板及模板的特例化
1. 简介 面向对象编程(OOP)和泛型编程都能处理在编写程序时不知道类型的情况。不同之处在于:OOP能处理类型在程序运行之前都未知的情况;而泛型编程中,在编译时就能获知类型了。 模板是C++中泛型编程的基础。一个模板就是一个创建类或函数的蓝图或者说公式。当使用一个vector这样的泛型类型,或者find这样的泛型函数。这种转换发生在编译时。 编写单一模板,使之对任何可能的模板实
2018-01-25 21:11:30
1021
原创 数据结构——队列
1. 简介 和栈相反,队列(queue)是一种先进先出(first in first out,缩写为FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一端叫做队尾(rear),允许删除的一端称为队头(front)。假设队列为q = (a1, a2, ..., an),那么a1就是队头元素,a
2018-01-23 20:47:55
258
原创 数据结构——栈
1. 简介 栈(stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头端称为栈底(bottom)。不含元素的空表称为空栈。 假设栈S=(a1, a2, ..., an),则称为a1为栈底元素,an为栈顶元素,栈的修改是按后进先出的原则进行的。因此,栈又称为后进先出(last in first out)的线性表。2.
2018-01-22 21:10:29
206
原创 Android-ndk编译C/C++遇到的问题
1. 感言 在搭建完相关的Android-ndk环境之后,就开始了C/C++程序的移植工作了。在这过程中遇到了一些编译上的问题,解决这些问题的过程相对比较痛苦,总之就是网上各种资料的查找。这边主要是将这些问题记录起来,供自己或遇到相同问题的开发人员查阅。希望对大家有所帮助。2. cannot use typeid with -fno-rtti 在博主的项目中使用了Boost.Int
2018-01-19 18:38:17
1282
原创 数据结构——双向链表
1. 简介之前讨论的单向链表中的结点只有一个指示之间后继的指针域,由此,从某个结点出发只能顺指针往后寻查其他结点。若要寻查结点的直接前驱,则需从表头指针出发。面对单向链表在这方面的不足,我们的解决方法很简单,只要在数据结构上附加一个域,使它包含指向前一个单元的指针即可。其开销是一个附加的链,它增加了空间的需求,同时也使得插入和删除的开销增加一倍,因为有更多的指针需要定位。另一方面,它简化了删除
2018-01-18 20:41:56
255
原创 在android-ndk上编译boost库及其C/C++程序
1. 简介 最近,项目的需求——将原本运行在Linux的上C/C++移植到Android上运行。折腾了3天,终于可以编译出使用了boost库的可执行程序。这边主要是记录下,并分享出来,供需要的人员参考。如果有什么问题可以在下面评论或发私信。2. android-ndk在Linux上的安装 博主的ndk版本是从底层的驱动人员那边获取的。这边使用的ndk版本是:android-ndk3
2018-01-16 20:21:29
9663
原创 STL——numeric_limits
1. 简介 一般来说,数值型别的极值是一个与平台相关的特性。C++标准程序库通过template numeric_limits提供这些极值,取代传统C语言,所采用的预处理常数。新的极值概念有两个优点,第一是提供更好的型别安全性,第二是程序员可借此写出一些template以核定这些极值。 通俗点来说,就是我们能通过模板numeric_limits来准确的获取具体数值类型的极值,使得我
2018-01-12 11:24:35
759
原创 boost时间和日期——时间
1. 简介 timer 是boost中一个很小的库,提供简易的度量时间和进度显示功能,可以用于性能测试等需要计时的任务。timer 库包含三个组件,分别是:计时器类timer、progress_timer和进度指示类progress_display。2. 计时器类timer timer 类可以测量时间的流逝,是一个小型的计时器,提供毫秒级别的计时精度和操作函数,供用户使用。
2018-01-11 21:32:38
2241
4
原创 数据结构——单向链表
1. 简介 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比较于普通的线性表(数组),链表有自己的优势和劣势:单个结点创建非常方便,普通的线性内存通常在创
2018-01-09 21:35:06
755
1
原创 排序算法——归并排序
1. 算法概述归并排序(Merging Sort)是又一类不同的排序方法。“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表,无论是顺序存储结构还是链表存储结构,都可在O(m+n)的时间量级上实现。利用归并的思想容易实现排序。假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,......,如此重
2017-12-23 15:29:35
393
原创 排序算法——堆排序
堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法,它是选择排序的一种。堆是一个完全的二叉树,分为最大堆和最小堆(通常最大堆用于堆排序,最小堆用于构造优先队列)。最大堆要求每个节点的值都不大于其父节点的值,而最小堆要求每个节点的值都要大于其父节点的值。由于堆排序使用最大堆,这里就讲解最大堆。 最大堆排序的基本思想:先将初始序列R[1...n]建成一个最大堆,此堆为初始的无序区;再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1...
2017-12-20 21:04:05
280
1
原创 排序算法——快速排序
快速排序(Quick Sort)是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分吗,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序的序列为{L.r[s],L.r[s+1],... ,L.r[r]},首先任意选取一个记录(通常可选第一个记录L.r[s])作为枢轴,然后按下述原则重新排列其余记录:将所有关键字较它小的记录都安置在它的位置之前,将所有关键字较它大的记录都安置在它的位置之后,由此可以该“枢轴”
2017-12-19 20:40:05
764
原创 排序算法——选择排序
1. 算法概述选择排序是对冒泡排序的一种改进。选择排序(Selection Sort)的基本思想是:每一趟在n-i+1(i=1,2,...,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树形选择排序和堆排序。2. 简单的选择排序2.1 简单的选择排序分析简单的选择排序可以描述为:在一个长度为N的无序数组中,在第一趟遍历N个数据,找
2017-12-17 11:31:52
360
原创 排序算法——冒泡排序
冒泡排序(Bubble Sort)是借助“交换”进行排序的算法。 冒泡排序的过程很简单。首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即L.r[1].key > L.r[2].key),则将两个记录交换之,然后比较第二个记录和第三个记录的关键字。依次类推,直至第n-1个记录和第n个记录的关键字进行过对比为止。上述过程称作第一趟冒泡排序,其结果使得关键字最大的记录被安置到最后一个记录的位置上。然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作,其结果是使得关键字次大的记录被安置到第n
2017-12-17 11:18:34
1046
原创 排序算法——插入排序
最简单的排序算法之一是插入排序。对于少量元素的排序,它是一个有效的算法。插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左(或从左到右)将它与手中的牌精细比较。插入排序由N - 1 趟排序组成。对于P = 1 趟到 P = N - 1 趟,插入排序保证从位置0到位置P上的元素为已排序状态。
2017-12-16 12:22:26
244
原创 设计模式——命令模式
有时候必须向某对象提交请求,但并不知道关于被请求的操作或请求的接受者的任何信息。例如,用户界面工具箱包括按钮和菜单这样的对象,它们执行请求响应用户输入。但工具箱不能显示在按钮或菜单中实现该请求,因为只有使用工具箱的应用知道该由哪个对象做哪个操作。而工具箱的设计者无法知道请求的接受者或执行的的操作。 命令模式(Command),将一个请求封装称为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 就我们的例子来说命令模式通过将请求本身变成一个对象来使工具
2017-11-26 12:51:30
281
原创 设计模式——职责链模式
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 这里发出这个请求的客户端并不知道这当中的哪一个对象最终处理这个请求,这样系统更改可以在不影响客户端的情况下动态地重新组织和分配责任。
2017-11-25 10:46:49
318
原创 设计模式——代理模式
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。是属于结构型模式。 代理根据其种类,在适当的时候向RealSubject转发请求。 Proxy模式在访问对象时引入了一定程度的间接性。根据代理的类型,附加的间接性有很多种用途:远程代理(Remote Proxy)可以隐藏一个对象存在于不同地址空间的事实。虚代理(Virtual Proxy)可以进行最优化,例如根据要求创建对象。保护代理(Protection Proxies)和智能引用(Smart Reference)都允许在访
2017-11-22 15:49:11
282
原创 设计模式——享元模式
享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。 flyweight是一个共享对象,它可以同时在多个场景中使用,并且在每个场景中flyweight都可以作为一个独立的对象——这一点与非共享对象的实例化没有区别。flyweight不能对它所运行的场景做出任何假设,这里的关键概念是内部状态和外部状态之间的区别。内部状态存储于flyweight中,它包含了独立于flyweight场景的信息,这些信息使得flyweight可以被共享。而外部状态取决于Flyweight场景,并根据场景二变
2017-11-21 09:51:23
261
原创 设计模式——外观模式
1. 概述将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖到达最小。达到该目的地途径之一就是引入一个外观(Facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。2. 结构图下面是外观模式
2017-11-16 21:07:09
232
原创 设计模式——装饰模式
有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱允许你对任意一个用户界面添加一些特性,例如边框,或是一些行为,例如窗口滚动。 使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所使用。但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。 一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。它将客户请求转发给
2017-11-13 20:38:20
259
原创 设计模式——组合模式
组合模式(Composite),将对象组合成树形结构以表示“部分——整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。有时候我们又称其为部分——整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素。从而使得客户与复杂元素的内部结构解耦。 在一些递归或分级数据结构中,组合模式非常有用武之地。例如,文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来
2017-11-12 17:32:53
284
原创 设计模式——桥接模式
1. 简介当一个抽象可能有多个实现时,通常用继承协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立的进行修改、扩充和重用。这种依赖关系限制了灵活并最终限制了复用性。 在面向对象设计中,我们有一个很重要的原则,那就是合成/聚合复用原则。即优先使用对象合成/聚合,而不是类继承。这也就引出这次要提到的桥接模式。 桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地
2017-11-11 14:51:40
511
原创 设计模式——适配器模式
适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。是属于类对象结构型模式的一种。 适配器模式(Adapter)主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。简单地说,就是需要的东西就在面前,但却不能使用,于是我们就想办法适配它。 这样说起来可能有些抽象,就以生活中的例子来形象的表述下。大部分使用过安卓手机的朋友对于来说,在很长的一段时间内都是使用micro USB类型的充电口的
2017-11-07 20:55:19
500
原创 设计模式——生成器(建造者)模式
建造者(Builder)模式又称生成器模式,属于创建型模式。在软件的设计中,我们可能经常会遇到需要构建某个复杂的对象(比如在游戏开发中,进行人物角色的构建),建造该对象的“过程”是稳定的(对于一个人设来都有身体,脸,发型,手脚等),而具体建造的“细节”是不同的(每个人设的身体,脸等各有千秋)。但对于用户来讲,我才不管这些,我只想告诉你,我现在需要某个对象(拥有某特征的人物角色),于是你就创建一个给我就行了。 如果你需要将一个复杂对象的 构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我
2017-11-05 11:04:01
2133
原创 设计模式——单例模式
1. 简介单例模式(Singleton)也是属于对象创建型模式的一种。通常我们可以让一个全局变量使得对象被访问,但它不能防止你实例化多的对象。一个最好的办法就是,让类自身负责保持它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它提供一个访问该实例的方法。单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。2. 结构图Sing
2017-11-05 10:59:45
428
原创 设计模式——抽象工厂模式
1. 简介抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。
2017-11-05 10:53:28
475
SolarWinds-TFTP-Server
2017-09-20
CuteFTP9破解版本
2017-09-20
WinHex19.9.0.0中文版本
2017-09-20
ElecardStreamEyeTools
2017-09-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人