- 博客(80)
- 资源 (8)
- 收藏
- 关注
原创 函数式编程与 C++
这个学期学了一门函数式语言 Coq,是法国人发明的,它与 ML 很像,其实 Coq 的发明主要是受了 ML 的影响。Coq 的语法我就不在这叙述了,有兴趣的朋友可以看这本书 Software Foundations,也就是我们上课用的教材。下面直接看些例子吧。1. map它的功能与 C++ 中的std::transform算法类似,是将f作用在list中的每个元素(元素类型是X)上,返回一个list
2015-04-22 12:34:32 3393 1
原创 C/C++ 中生成特定范围内的随机数
大家在写 C/C++ 程序时,难免会遇到要求获取某个范围内的随机数,我查阅了一些资料后,总结如下。本文分两部分,先介绍 C 语言中与随机数相关的两个函数 srand 和 rand,后介绍 C++ 中的 random 库,每一部分最后会给出生成特定范围内的随机数模板供参考。1 C 语言中的 srand 和 rand1.1 实现下面是 VC 的实现,GCC 的实现比 VC
2014-11-27 16:04:02 27104 1
原创 C++ 中的 Lambda 表达式
前些天买了本《程序设计语言理论》,看了简介,Lambda 演算贯穿整个理论,尤其在函数式语言中具有重要作用。C++11 中也加入了 Lambda 表达式,下面做个总结。1、一个简单的 Lambda 表达式如下:[] {}这就定义了一个对象,这个对象匿名,记住,Lambda 表达式是对象,不是类型,这很重要!本例中,该对象的类型是 'anonymous-namespace'::<lambda0>,这是编译器给它设的一个类型名。
2014-05-08 16:52:36 2559
原创 【算法】第 n 小数 nth_element
STL 中取第 n 小数的算法 nth_element 的函数原型如下template<class RandomAccessIterator>void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);算法说明:1、功能:执行 nth_element 后,nth 所指位置的元素将是整个区间有序时在该处的元素。对 [first, nth) 中的任意迭代器 i 和 [n
2014-04-30 16:48:02 3213
原创 【算法】中位数 median
median 是 STL 内部的算法,用于求三个数的中位数,它将用于 std::sort, std::nth_element 的实现中,快速排序和求第 k 小数算法都用到了划分,选取 pivot 时为“三者取中”,即 *first, *(first + (last - first) / 2), *(last - 1) 三者的中位数,这两个算法后面会介绍。median 的源码如下:templ
2014-04-26 22:23:39 6968
原创 【算法】划分 partition
STL 中的划分算法 partition 的函数原型如下template ForwardIterator partition(ForwardIterator first, ForwardIterator last, Predicate pred);四点说明:1、作用:将 [first, last) 中所有满足 pred 的元素置于不满足 pred 的元素前面。2、返回值:设返回的迭代
2014-04-25 21:44:52 6844
原创 【算法】插入排序 insertion_sort
准备写个《STL 源码剖析》的读书笔记,开个专栏,名为《STL 的实现》,将源码整理一遍。很喜欢侯捷先生写在封底的八个字:天下大事,必作于细!他在书中写到:我开玩笑地对朋友说,这本书出版,给大学课程中的「数据结构」和「算法」两门授课老师出了个难题。几乎所有可能的作业题目(复杂度证明题除外),本书都有了详尽的解答。然而,如果学生能够从庞大的SGISTL源码中干净抽出某一部份,加上自己的包装,做为呈堂作业,也足以证明你有资格获得学分和高分。事实上,追踪一流作品并于其中吸取养份,远比自己关起门来写个三流作品,价
2014-04-22 17:20:19 3278 1
原创 用有限自动机实现正则表达式的匹配
问题:在主串中查找是否存在正则表达式为 abc*d?e 的匹配,下面用有限自动机的方法查找,该正则表达式的最简 DFA 如下状态转换表如下图所示程序中用二维数组定义如下#define STATES_NUMBER 5#define LETTER_NUMBER 5// 表示 abc*d?e 的最简 DFA 的状态转换表(-1表示不接受)int trans_table[STA
2014-03-08 18:33:12 8202
原创 C 语言中模拟“泛型”
一般在写 C 程序时用 typedef 将容器中元素的类型抽象,无法在同一个程序中用到两种类型,而本文试图在一个程序中用到两种不同类型的容器,比如实现类似于 C++ 中的 vector 和 vector。核心技术是将元素类型定义为 void *,管它什么类型,都用 void * 类型的指针指向真正的数据,与此同时,类型的大小是个重要信息,比如一般地,char 为1个字节,double 为4个字节。
2014-02-07 22:44:15 3720
原创 求二叉树的带权路径长度(深搜或广搜)
考研昨天结束了,专业课我考得不好,是408,算法题13分。今年是求二叉树的带权路径长度,我就写了算法思想,代码空白,因为时间来不及了,慌了,是心态的问题吧,做到最后有种天要塌下来的感觉,回来后很沮丧,因为我觉得自己是可以写出程序的,不服啊! 下面说说这道题目。树的带权路径长度(Weighted Path Length)定义:树中所有叶子的带权路径长度之和。比如下面这棵树,WPL就是3*
2014-01-06 17:28:56 7877 3
原创 上机实现操作系统课程中的 PV 操作
各位上过《操作系统》的同学都知道进程同步这个知识点,汤小丹那本“考研指定教材”上面描述 PV 操作是用 Pascal 语言的,看着真心难受,各种题目也是要求我们纸上写程序,本人真心反感,写了都不知道对不对。下面这个程序是在 Windows 下用 C 语言写的,选的例子是经典的“生产者消费者问题”,希望对大家有所帮助。“生产者消费者问题”的程序如下,假设有多个缓冲区,多个生产者,多个消费者。它们
2013-11-06 17:27:21 2168
原创 用二级指针操作不带头结点的单链表
在不带头结点的单链表中删除特定元素,一种很麻烦的情况是首结点即要删的结点,所以往往标识一个链表的 head 就会改变,而在删除函数中要改变客户端的 head,就必须传入 head 的地址,否则客户端的 head 永远不会改变,也就是说,若形参为 Node * 类型,修改的只是 head 的副本,这是C语言中的基础问题。这篇博客是我读了皓哥的这篇文章《Linus:利用二级指针删除单向链表》有感而写的
2013-10-06 00:56:32 3303 8
翻译 用 C++ 标准模板库(STL)的 vector 实现二叉搜索树(BST)
本文由 Justme0 翻译自 Code Project 转载请参见文章末尾处的要求。介绍众所周知,要建一棵树,我们需要关注它的内存分配与释放。为了避开这个问题,我打算用C++ STL(vector和deque)来建一棵小型的BST。很明显,这篇文章是出于这个想法的。 背景BST是应用最广泛的数据结构之一。C是首选语言,不过因为C++尤其是C++11的出现,我更有兴
2013-09-05 17:31:07 7161 2
原创 C 语言中实现数据与方法的封装
在 C 语言中可以用结构体代替类,用函数指针代替成员方法,实现数据成员与成员方法的封装,在客户端程序中写出的程序与 C++ 类似,唯一的不同是 C 语言中调用函数指针成员时必须将本对象的地址传给函数,因为 C 语言中各函数的地位是相同的。 本文以模仿 STL 中的 vector 类写了一个 C 语言的 vector 结构体,程序如下:1. vector 的接口/******
2013-08-19 00:25:58 3468
原创 第一次面试
下午课刚上完,我收到了HR的通知,得知没有通过面试,这是一家在合肥的软件公司。挺不爽的,我觉得主要是因为经验少。还是谈谈面试官问我的两个技术问题吧,我应聘的是C++软件开发工程师。1、STL中的map是线程安全的吗?我的回答:标准中没有规定,但是基本上STL都实现了,是线程安全的。其实是大部分版本的STL都不是线程安全的。我前几天刚好查了这个问题,参见:http://sta
2013-05-24 17:46:48 2795 7
原创 USACO 1.2.2 Transformations(模拟)
分析 这是我第一次在ACM的题目中用OO的思想写的程序,看到标程,竟不谋而合,结构是类似的。对正方形这个类分析,将会使问题变得简单,我觉得OO的分析和设计挺关键的,其实我一开始也没设计好,原先准备把7个bool函数当成类的成员方法,其实这个设计是不好的,有点过了。其实应该是把旋转90度和轴对称这两个方法作为类的成员方法,这样main中调用就方便自如了。 最后,我觉得
2013-03-30 13:14:08 1654 1
原创 POJ 1151 Atlantis(离散化+扫描线)
题目大意:求N个矩形的并的总面积。http://poj.org/problem?id=1151参考了黑书上讲离散化的那两页,想到了上学期学的计算机图形学里的多边形填充算法。src:/******************************************************************** created: 2013/03/28 created:
2013-03-28 11:59:05 1570
原创 USACO 1.1.4 Broken Necklace(模拟)
做这题做了一个下午,都快崩溃了。说下要点:1、要注意'w'这种特殊情况,到某位置时,注意左边、右边是'w'的情况。2、得把整个项链看出循环队列,所以指针移动时注意mod。3、我用的还是暴力法,O(n^2),看解题报告有O(n)的算法,用的是DP,还有待研究。源程序#define _CRT_SECURE_NO_WARNINGS#include #include
2013-03-24 00:18:36 1713
原创 完美二叉树(perfect)与正则二叉树(strict)的概念
“满二叉树(full)”的定义在国内和国外完全不同,国内指“完美二叉树(perfect)”,国外指“正则二叉树(strict)”,所以我建议国内外都取消“满二叉树(full)”这个叫法,这样就没有不必要的麻烦了。总结如下:参考资料:http://www.stackpop.org/html/366_cn_us_difference_ds.htmlhttp://st
2013-02-25 10:36:28 7376
原创 读《STL源码剖析》有感
一个月之前的今天是我的生日,一位关系不错的同学送了我本《STL源码剖析》,还有位送了我本《C和指针》,我就看起来了,这些天都在考试,就经常晚上11点半过后拿个手电筒看,我特别认可一句话:“兴趣是最好的老师。” 《C和指针》里面的内容很细,我就先看了《STL源码剖析》。第一次正式看一个上午看了40多页,自己都吃惊了。前言中孟岩的序写得不错,文笔好。第一章侯先生介绍了STL的历史,
2013-01-21 19:16:51 2004
原创 旋转字符串(循环移位,rotate)
旋转字符串是个经典问题。要求:时间复杂度O(n),空间复杂度O(1)。接口描述:http://www.sgi.com/tech/stl/rotate.html《编程珠玑》、《编程之美》上都有这个问题,关于左旋右旋整个旋的方法我就不说了。我的想法是,先左右比较,长的一段的大部分移到另一端,再递归进行余下的。比如: char str1[] = "abcdefghijkl
2013-01-14 18:11:00 2287
原创 数组传参的三种方法:泛型;压扁数组;数组结构
数组传参很常见,在C/C++中传递数组时,数组名会退化为指针,所以一般都要给出首地址和长度。这是有缺陷的,当我们在写函数时不知道各维大小时该怎么办呢?下面用矩阵乘法作为例子,给出三种实现方法:GP, flattening the array, struct其中我认为flattening the array 这种方法最好,OpenGL中的glMaplf 函数用的正是这种方法,它的函数原型如下
2013-01-10 17:34:09 2411
原创 模拟处理机调度
一、先来先服务#define _CRT_SECURE_NO_WARNINGS#include #include #include #include using namespace std;unsigned int sysTime = 0; // 模拟系统的时钟,每运行一次就加1enum Status {Ready, Complete}; // 就绪态Ready,完成
2013-01-08 18:30:50 1342
原创 模拟虚存管理
1、页表的数据结构页号标志主存块号修改位外存地址struct PageItem { unsigned pageID; // 作业的页号 unsigned outMAddr; // 该页在外存上的地址 bool state;
2013-01-08 18:12:49 2137
原创 考研结束了
考研结束了,下一届就轮到我们了,今天还跟同学聊了考研的事,我对考研政治不感冒,为什么要叫我们学政治?为什么要把这种信仰强加给我们?而那些申请国外研究生的同学就不用学了,凭什么?这真的很矛盾。我以后想搞技术。看了王道论坛上大家发的那些计算机试题,我觉得找工作的同学也应该准备,到公司里同样也可以研究数据结构和算法,不必总是沉浸在考研试题上,公司也是很强大的,更活!英语,我现在用到英语的地方就是喜欢用英
2013-01-06 20:29:50 3027
原创 初尝“元编程”(C++描述)
先看两个计算斐波拉契数的程序:(1)运行时#include using namespace std;const int N = 45;int Fib(unsigned n){ if (0 == n) return 0; if (1 == n) return 1; return Fib(n - 1) + Fib(n - 2);}int main(int argc, c
2013-01-02 22:40:56 1545 1
原创 CG实验2nd&3rd:二维几何变换、裁减、动画、三维透视
实验21、放缩与旋转说明:关键得到变换矩阵,放缩矩阵: doubleb[3][3] = { Sx,0, 0, 0,Sy, 0, -xF* Sx + xF, -yF * Sy + yF, 1 };旋转矩阵:
2013-01-01 12:48:24 2148 1
原创 CG实验4th:Bezier曲线
根据Bezier曲线的定义,画出曲线上密密麻麻的点即可。运行结果:源程序:/*** Justme0* 绘制Bezier曲线**/#define _CRT_SECURE_NO_WARNINGS#include #include #include #include "graphics.h"using namespace std;// 生成的Be
2012-12-25 19:25:47 1511
原创 CG实验4th:消隐
消隐采用的是深度排序算法(油画家算法)运行结果:源程序:#define _CRT_SECURE_NO_WARNINGS#include #include #include "graphics.h"using namespace std;struct MyRectangle { double x0; double y0; double x1; do
2012-12-25 18:43:12 1169
原创 微软Metro风格颜色值
觉得微软新一代的产品logo颜色很新颖。比如这个页面就很有特色:http://windows.microsoft.com/zh-CN/windows/home下面这些值都是我用拾色器取的,找了一些主要的,希望对做设计的朋友有帮助。微软logo红Hex={F6,53,14}绿Hex={7C,BB,00}蓝Hex={00,A1,F1}黄Hex={FF,BB,00}
2012-12-22 23:42:27 5126
原创 内存的连续分配与回收算法
几点说明:部分代码参考《数据结构》教材。1、采用空闲分区链链接空闲分区,用循环首次适应算法分配内存。 2、假定内存块的大小、地址以“字”为单位计。空闲区、作业区边界采用标识。“字”的数据结构如下:leftLinktagsizerightLink空闲空间upLink
2012-12-01 13:47:51 3865 2
原创 做网站有感
这四个星期在做课程设计,内容就是B/S模式的网站,繁!之前不知道HTML、CSS、JavaScript之类的,只泛泛地自学了C#,借了本ASP.NET看,我一直认为这些是快餐式的知识,因为微软高度封装了它,如张小牛所说,“想会就会”。不像数据结构、计算机组成原理、操作系统、网络原理这些考研课!一个人搞,经常是一边前台HTML,一边后台C#,一边数据库SQL。话不多说了,对网站中用到的一些方法和技巧
2012-11-24 00:54:21 1359
原创 auto_ptr类的源码注解
源码及注释如下,这比记忆语法好多了!个人认为,auto_ptr类设计地不行,比如都不能作为参数传递(传递后实参就没用了),失去了C指针的经典优势!// auto_ptr类的简化版,删除了有关auto_ptr_ref及auto_ptr的一些成员函数templateclass auto_ptr{public: typedef auto_ptr ClassType; explicit
2012-10-21 21:08:05 1236
原创 定点小数补码一位乘(Booth比较法)
程序:// 定点小数补码一位乘(Booth比较法)// http://blog.csdn.net/justme0#define _CRT_SECURE_NO_WARNINGS#include #include #include using namespace std;const int n = 4; // 数值位位数// a,b联合右移(算术移位)void RightM
2012-10-18 11:34:28 4962
原创 定点小数补码一位乘(校正法)
程序:// 定点小数补码一位乘(校正法)// http://blog.csdn.net/justme0#define _CRT_SECURE_NO_WARNINGS#include #include #include using namespace std;const int n = 4; // 数值位位数// a,b联合右移(算术移位)void
2012-10-17 22:37:39 6532
原创 定点小数原码一位乘(C++实现)
这学期在学计组,这里将用C++实现各种运算方法,其实那些算法应该是用电路硬件实现的,用高级语言来描述一遍也挺有意义。说明:输入输出的小数均以机器数表示,数值位为4位。#define _CRT_SECURE_NO_WARNINGS#include #include #include using namespace std;void RightMove(bitset &
2012-10-16 23:03:36 6059 1
原创 重载下标运算符[]
看了bitset的源码,发现要重载下标运算符[]内容还挺多的,作右值时相对简单,只用来测试。作左值时就比较麻烦,因为要修改它的值。 1、作右值举个例子:const bitset b;bool tag;tag = b.test(2);tag = b[2];上面第三句和第四句效果一样,都是测试b的下标为2的位是否为1。当bitset为const时,operato
2012-10-14 16:09:49 5022
原创 【库函数源码剖析系列】(6) strchr
strchr:// strchr#include char *Strchr(const char *s, int c){ for (; *s != (char)c; ++s) { if (*s == '\0') { return NULL; } } return (char *)s;}int main( int argc, ch
2012-09-29 00:53:05 2213
原创 【库函数源码剖析系列】(5) strcat
strcat:// strcat#include #include char *Strcat(char *dest, const char *src){ char *tmp = dest; while ('\0' != *dest) { dest++; } while ('\0' != (*dest++ = *src++)) { ; } return tm
2012-09-28 00:50:28 1494
原创 【库函数源码剖析系列】(4) strlen
strlen:// strlen#include size_t Strlen(const char *s){ const char *p = NULL; for (p = s; *p != '\0'; ++p) ; return p - s;}int main(int argc, char **argv){ char buffe
2012-09-25 19:59:42 1449 1
LLVM Cookbook
2015-08-10
《人月神话》 软件人员必读
2011-06-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人