自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小键233

~~233

  • 博客(78)
  • 收藏
  • 关注

原创 编译原理 词法分析:介绍,KMP 匹配算法

词法分析,Lexcical analysis, 是将编程语言从字符转变成一个个token的分析器。 这也通常是一个编译器的开始阶段。token 也称之为词素。举个例子, 下面这段程序转变成token的输出如下:printf("Total is %d\n,", score);token 的输出和匹配上的内容顺序:printf 函数名字( 符号"Total is %d\n" 字符常量, 符号score id,指向符号表来查询实际的内容) 符号; 符号Token, Pattern

2022-03-26 19:31:15 986

原创 连续空间的多维数组实现(二)

在我的这篇文章中,我提出了一种实现连续空间的二维数组的方法。https://blog.csdn.net/u014613043/article/details/51543534今天重新组织了一下新的实现方式,觉得有点意思,记录一下设计思想一个连续的多维空间数组,希望可以使用模板自动帮我们识别,这是个N 维的数组。然后二维的数组就是这个实现的泛化。于是,给出如下的类声明:template...

2019-07-02 23:19:47 337

原创 个人项目总结

个人项目总结@todo

2019-05-18 18:00:10 687

原创 C++ Task 的实现(lambda 是个好东西)

本文目的在于实现一个简单易用的 task 类。它的目的在于将将要执行的动作和上下文相关信息(如参数)保存起来,然后在想要执行的时候,发起这个动作。完成品的实例如下:struct A{ int b;};task t([](A a, A b, int c)->void{ a.a += b.b+c;}, A(233), A(A_v), 4);t();那么这

2017-11-15 12:38:53 5410 3

原创 某天的想法 -- 为什么我们要努力

我一直相信这个世界是遵循加速回报定律了。就跟玩游戏一样,你后期越厉害,打出的伤害就越高。你以为的成长曲线是红色的,但实际上,成长的曲线是蓝色的。我记得早先一个华中科技的学长告诉我一个道理, 他说,人出名要趁早,名望这种东西,越早越好。在我理解,是加到自己身上的buffer 越早越好。这些新加的buffer,又会立刻促进下一个加给你的buffer 。好比如这是一辆加速度永远为正的列车,你越早开始加速

2017-11-08 10:35:28 398 2

原创 无题

很久没有写过博客了,不知道这篇算什么类型的。是技术的,还是心情的呢。今天终于算是看完了《STL 源码剖析》。写的最后一份代码是 红黑树的实现。 在C++14 的标准看来,这本书有些内容感觉还是过时了。如果有右值引用和匿名函数的话,也许模板还有更牛逼的玩法吧。我毕业了,学生时代写点什么东西就迫不及待拿出来分享(装逼)的心情反而没有了。 了解到更多的技术,了解到更多的知识,才发觉,真是学无止境。简

2017-07-29 15:05:20 320 3

原创 STL(七):stack 与 queue

好久没有写过新的内容了。主要是最近真的没有时间。好吧,这次介绍一下栈与队列的内容。stack先理一下之前写过的容器:vectordequelist这些都是序列式容器,但是使用了不同的数据结构来实现。栈的特性,就是先进后出(或者后进先出) 一般来说,我们可以使用上面的容器来实现栈。事实上,当你看到STL 中的设计时,才感叹,真是一种绝美的设计啊。这次先从

2016-10-01 22:52:40 411

原创 STL(六):deque

隔了好多天,终于把这个deque 给写了。deque 是双端队列。也就是,方便在队头和队尾插入数据的队列。 它能够解决vector 增加元素时不停地重新分配内存和在头部插入效率低下的问题。看到它的数据结构才觉得真心厉害。数据结构看图 deque的数据组织是这样的: 有一块连续的小内存充当中控器,指向真正的数据缓冲区。有点像一本书的目录。 而数据,真正是存储在缓冲区的。 deque 主要是维

2016-07-24 12:04:17 452

原创 OgreBullet 的使用

最近做实训,用到Ogre 的引擎。在渲染方面,Ogre 的性能杠杠的,不用多解释,但是除了渲染,别的模块很多都是空缺的。 so,当我尝试去做物理引擎的时候,发现就像来到了一篇荒原,对,就是荒原。所幸,前人做了很多的物理引擎与Ogre 的匹配。OgreBullet 就是与Bullet 匹配的东西。 但是这玩意有点历史,项目还是08年的,我使用的是Ogre的1.9 版本了。简单尝试了一

2016-06-16 20:15:47 1003

原创 STL(五):连续空间的二维数组实现

这个不属于STL 中的内容,仅是个人补充使用嘛~一开始是这样的。 加入我们需要新建一个二维数组,一般像下面这样用:int row = 2, col = 3;int array[2][3]; //1//orvector< vector<int> > v(row, vector<int>(col) );//2//or int* array = new int[row*col];//3//or

2016-05-31 10:56:30 1535

原创 STL(四):list

STL 中的list 可以说是与vector 相对应的一个容器。 什么意思呢? 嗯,在我看来,vector 是线性表,空间连续,它的特点是原生指针作为它的迭代器,支持随机存取。但是插入和删除的操作代价高,并且有可能有一部分空间被浪费。 list 是链表,空间不连续,它的特点是对空间利用率高,插入和删除数据是常量时间,但是不支持随即存取,并且每个节点都需要浪费掉额外的两个指针的内存空间(不要忽视

2016-05-27 16:39:11 1341

原创 STL(三):vector

一和二中吧STL 的基础都说明白了,那我们尝试着实现一下第一个容器:vector (好敷衍呀~)vector 算是比较简单的一种容器了,但饶是如此,我都写了好久(主要是其他的各种函数费时间)准备工作在直接开始说vector 的时候的时候,我会假设你懂得以下函数的运用(最好自己去实现一下吧)uninitialized_copyuninitialized_copy_nuninitialized_

2016-05-25 09:13:07 3594

原创 STL(二):construct 与 destroy

STL 中关于对象的构造和销毁是使用construct 和 destroy 函数 的。 这个内容写在文件stl_construct.h 中。_type_traits在讲主题之前,有必要介绍一个_type_traits 与若干概念。 简单而言,这个类的作用就是萃取出我们需要的各种内容。它的模板代码如下://POD 的意思是:Plain Old Data ,即标量型或传统的C struct 型别

2016-05-24 21:14:20 908 1

原创 STL(一):allocator 空间配置器

大概…………很久很久以前,我做了一个浪(er)漫(bi)的决定,就是自己也实现一个STL,毕竟造轮子呀,才是最浪漫的不是吗。于是,山很高,海很深,浪花一浪接一浪,我义无反顾走上了作死之路。 nice ,作死之路的第一部分,就是关于allocator,空间配置器的。STL 有自己的内存管理,其中最最基础的就是allocator ,任何内存的请求和释放都要经过它。它本质上就是封装了一下malloc 和

2016-05-24 20:49:54 443

原创 new 与 delete 操作符

new 和 delete 是C++ 中一对动态申请内存的操作符。new_handler 行为在std的命名空间中,有这样的代码:namespace std{ typedef void (*) () new_handler; new_handler set_new_handler(new_handler p) throw();}set_new_handler的作用是,允许用户设置当

2016-05-09 12:38:20 887

原创 模板Trait 技术与简述template 元编程

模板Trait 技术想了好久都没有想到合适的例子,已是干脆直接使用[1]中的例子就好了。STL 中引入了迭代器的概念。但是在本文中的例子不直接使用STL 的迭代器,而是写了一段很简短的代码,作为演示使用。 本例中的迭代器有三种:Forward_Iter,只能向前进,也就是只能加非负数Bidirectional_Iter,可以双向增减Random_Iter,可以随意增减 *本例并没有沿用ST

2016-05-08 20:41:04 858

原创 模板

隐式接口与编译器多态假如有如下的模板函数:templatetypename T>void doSomething(T& t){ if(t.getIs() ) { t.traver(); }}那么,对于T 而言,它的隐式接口便是:bool getIs();traver();T 的类型必须要支持这两个接口才能通过编译。而

2016-05-08 11:12:13 594

原创 完全不知道怎么取标题,但是不进来看看也许会后悔--其实我一开始想写关于virtual 函数的

假如,现在有个类,它含有数据,我们需要为它编写一些遍历的函数。 就比如,类是这样的:class SomeClass{ enum{ Length = 512}; int element[Length];public: void traver() { //做一些遍历 }};那如果有需求,要求遍历函数能够依据不同的情况,采取不同的遍历函数,怎

2016-05-07 13:49:12 599

原创 面向对象设计时的若干考虑

在OOP 中,类之间的关系可以如下表示[1]: 当类是public 继承的时候,它们之间是is-a 关系. 当类是private 继承的时候,它们之间是is-implemented-in-terms-of 关系 当类是耦合关系时,它们之间是has-a 或者 is-implemented-in-terms-of 关系[1]中还提到两个条款: 绝不重新定义继承而来的non-virt

2016-05-07 12:46:30 309

原创 swap 函数的编写

swap 函数用来交换两个变量的值,C++ 标准库提供了这个函数。前面的博客也有提到 copy and swap 技术,可以处理自我交换的情况。 那一个典型的实现就是这样的:template<typename T>void swap(T& a, T& b){ T temp(a); a = b; b = temp;}*C++ 标准库就提供了这个函数,所以并不用自己去手动

2016-05-07 12:24:30 1603

原创 以对象的形式管理资源

题目来自[1]条款13:以对象管理资源。 因为太贴切了,所以直接用了。首先说一下资源。 所有资源就是,一旦用了它,将来必须还给系统。[1]而资源一般是[1]:内存文件描述器(file decriptors)互斥锁 (mutex locks)图形界面中的字型和笔刷数据库连接网络sockets我们假设有个资源就叫做Resource 好了,它通过工厂函数(fac

2016-05-07 11:20:45 723

原创 正确地复制对象--oeprator=与copy构造函数

额,这个名字有点怪怪的=_=ok,下面进入正题,为了演示方便,代码只写出简略的部分。copy构造函数class Base{public: Base() {} Base(const Base& ) { cout<<"Base copy "<<endl; }};class Derived: public Base{public: De

2016-05-06 16:16:51 535

原创 谈谈virtual函数

virtual , 写C++ 的都不会陌生吧,用于类的成员函数,用以表现对象多态的性质。为多态基类声明virtual 函数以前看书时,得到一条“黄金定律”(这是错误的): 永远应该以virtual 声明类的析构函数如果不这么做,那么当类成为基类时,在回收对象内存,会发生不正确的行为,导致内存泄漏。这里就不在赘述细节了。乍一看,很有道理不是么,防患于未然。但是少年呀,不能这么年轻,轻易声明vir

2016-05-06 14:18:38 2247 2

原创 Empty Class(空类)的作用

假如有一个这样的类,没有数据成员和操作(除了本身默认存在的构造函数、复制构造函数、析构函数、copy assignment函数),那么,它能做什么?class Empty{};一开始我也是以为这样的空类能够有什么作用呢,直到我看了[1],才感叹自己如此肤浅(所以也建议你去看:)先假设我们有个很傲娇的类,它不希望通过构造函数生成,也不希望别的对象对它赋值。很不巧,如果我们没有在类中声明复制构造函数

2016-05-05 17:01:03 8583

原创 const 成员函数重载

先看一段引用[1]: 许多人漠视一件事实:两个成员函数如果只是常量性(constess)不同,可以被重载ok,下面为了解释,定义一下下面这个类:class Cstring{ private: char str[32]; public: Cstring(char instr[], size_t n) { for(int i=0;i<n;+

2016-05-05 15:56:48 677

转载 数字证书原理,公钥私钥加密原理

加密解密的文章,非常详细数字证书原理,公钥私钥加密原理 - 晓阳 的专栏

2016-04-26 21:45:11 405

原创 Graph Cuts

Graph Cuts 是Yuri Y. Boykov 和 Marie-Pierre Jolly 发表在2001年iccv 上一篇论文提出的方法。他们研究,用一种交互式的方式来进行图像的分割。先由用户标记一些背景或者物体的种子像素点,然后用Graph Cuts的方法进行分割。Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentatio

2016-04-24 21:41:13 4583 4

原创 智能剪刀算法学习笔记

写在前面的话:如果以后我看到什么不懂的话,我一定会说:”天哪,这简直比计算机视觉还难!“一边看论文,一边整理思路,决定整个思考过程都像流水账一样记下来。高能:由于先整理思路,然后再动手写代码,所以,前面的内容可能有错,仅作为个人课程设计之用,请保持个人独立思考和分辨是非的习惯————>+_+。智能剪刀概述“智能剪刀”( Intelligent Scissors) 是 Morten-son 和 Bar

2016-04-15 20:58:27 10701 6

转载 thinkPHP入门(二):基础

最近正在学习thinkphp,同时博客同步记录学习笔记,但是内容大多都是[1] 提供的文档,所以,强烈建议直接阅读该文档,此文仅作为本人学习记录之用*在此之前,假设数据库中已经有一张表 think_form 了,具体内容请看[1]CURDCURD指的是数据的基本操作:C: createU: updateR: readD: delete创建数据通过表单通

2016-04-13 09:38:35 565

原创 C++服务器(七):Windows 下配置pthread

pthread POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。[1]这套接口在 Linux 下得到很好的支持。但是在 Windows 下却需要额外配置,不过过程倒是比较容易。 这里的配置针对GCC 编译器,如果是配置VC 的话,方法也差不多,大可以自己琢磨一下。下载通过以下网址get 到Windows版本的pthread: ftp://sou

2016-04-09 09:35:31 2540

原创 C++服务器(六):socket 异步模型与select 的实现

之前在另一篇博客上提到一些关于socket 的异步模型的资料,其中有一篇博客写得很详细,在此附上链接: socket阻塞与非阻塞,同步与异步、I/O模型[1]这篇博客已经讲得很好了。但是我还是觉得,有必要的话,应该捧个书本系统地探究一下socket 异步模型的区别和实现。在这里,我选择的实现是使用select 模型。 原因如下:服务器目前只是个人使用,所以,流量并不会很大,少数的socket

2016-04-07 20:12:13 9465 1

原创 ubuntu15.10 配置opencv开发环境

1、去官网下载最新的opencv版本下载Linux的即可 http://opencv.org/downloads.html2、安装必要的依赖包等sudo apt-get install build-essentialsudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libs

2016-03-26 19:56:06 1613 2

原创 C++服务器(五):pthread多线程编程

多线程采用pthread库。 考虑到多平台下的实现并不会很容易,还有多线程间的同步等问题,采用一个比较通用的库就好了,这样减少很多工作(其实是我不会使用别的库)创建一个线程函数原型:#include <pthread.h>int pthread_create(pthread_t * tidp,const pthread_attr_t * attr,void * (* start_rtn)(vo

2016-03-19 20:24:27 2600

原创 C++服务器(四):git 如何强制覆盖本地文件and socket 的异步模式

没什么事做就只好写写博客。 不过这次没有贡献什么代码。 倒是了解了git 的一下用法 还有socket 的异步模式。 先放在参考资料那里,以后再查看。参考资料: socket阻塞与非阻塞,同步与异步、I/O模型 Git pull 强制覆盖本地文件

2016-03-19 15:05:24 557

原创 C++服务器(三):多平台的构思与Windows下的tcp_socket

在做这个服务器的时候,遇到很多奇葩的问题。 以前做项目都是使用强大的VS,这次使用 G++编译器,配合 makefile 命令使用,算是了解了控制台下的项目是怎么做的了。若干话题日志的IO在main 前自动执行一段代码多平台要解决多平台的问题,那么应该要有一个统一的接口,然后再分别实现。 在一个配置文件中,定义宏如下:#ifndef CPPSERVER#define CPPSERVER

2016-03-18 16:34:03 775 1

原创 C++服务器(二):Windows下的socket编程

在上一篇博客中,我主要写了Linux下的sokcet编程,这篇文章,主要是想写一下Windows下的编程时怎样的。 为后期实现服务器的跨平台做好准备。以前刚好做过 TCP 、UDP socket 编程的一些工作,这里也顺便记录一下以前的内容吧UDPUDP是一种面向无连接、不可靠的传输层协议。 其中 UDP 的连接过程如下: TCPTCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。代码

2016-03-17 10:03:43 4044

转载 约瑟夫环问题--递归推导

本文为学习《剑指offer》的记录。因其原理在原作者博客上找不到,所以,只能自己编写记录,如有不当之处,欢迎指正。题目描述: n个数,编号为 0 , 1, ……, n-1 排成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m 个数,请问最后一个剩下的数是多少?推导过程 定义一个函数 f(n, m) 为 n 个数中取 m 最后剩下的编号。 第一个被删除的数是 (m-1)%n, 记为 k 。

2016-03-16 15:43:23 3245 2

转载 N 个骰子的点数

直接参考原著: 程序员面试题精选100题(43)-n个骰子的点数[算法] 循环的解法比较巧妙,mark一下。

2016-03-16 14:54:59 301

原创 栈的输出队列

题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。我的看法: 一个比较直观的方法就是,用一个辅助栈模拟弹出栈的过程。 比如说,顺序压入序列一时,当栈顶元素为4时,则弹出4,接着

2016-03-12 13:55:54 2550

转载 快速幂算法

原文:快速求幂算法 快速求正整数次幂 2007-05-05 12:21 快速求正整数次幂,当然不能直 接死乘。举个例子:3 ^ 999 = 3 * 3 * 3 * … * 3直接乘要做998次乘法。但事实上可以这样做,先求出2^k次幂:3 ^ 2 = 3 * 3 3 ^ 4 = (3 ^ 2) * (3 ^ 2) 3 ^ 8 = (3 ^ 4) * (3 ^ 4) 3 ^ 16 = (

2016-03-10 15:31:10 338

空空如也

空空如也

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

TA关注的人

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