随笔分类 -  C/C++

摘要:一、问题描述问题描述:N个人分配N项任务,一个人只能分配一项任务,一项任务只能分配给一个人,将一项任务分配给一个人是需要支付报酬,如何分配任务,保证支付的报酬总数最小。问题数学描述: 二、实例分析---穷举法在讲将匈牙利算法解决任务问题之前,先分析几个具体实例。以3个工作人员和3项任务为实例,下图为薪酬图表和根据薪酬图表所得的cost矩阵。 利用最简单的方法(穷举法)进行求解,计算出所有分配情况的总薪酬开销,然后求最小值。total_cost1 = 250 + 600 + 250 = 1100; x00 = 1,x11 = 1,x22 = 1;total_cost2 = 250 + 350.. 阅读全文
posted @ 2013-08-16 11:38 一点心青 阅读(33393) 评论(4) 推荐(0)
摘要:目前,存在着各种计时函数,一般的处理都是先调用计时函数,记下当前时间tstart,然后处理一段程序,再调用计时函数,记下处理后的时间tend,再tend和tstart做差,就可以得到程序的执行时间,但是各种计时函数的精度不一样.下面对各种计时函数,做些简单记录. 方法1,time()获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数. void test1(){ time_t start,stop;... 阅读全文
posted @ 2013-07-25 18:03 一点心青 阅读(86694) 评论(1) 推荐(5)
摘要:最近几天,看了与topk相关的几个问题,在这里做一些记录。问题一:已知一个数组,求取数组的最小值和最大值。方法一:将求取最小值和最大值看成单独的问题,每个问题单独解决,具体实现如下: 1 void MinMaxValue(int* data,int n,int& min_v,int max_v) 2 { 3 //求取最小值 4 min_v = data[0]; 5 for(int i = 1;i max_v)15 max_v = data[i];16 }17 }方法二:维持两个变量min和max,每次取两个数,比较1次,较小的和min比... 阅读全文
posted @ 2013-05-05 17:51 一点心青 阅读(641) 评论(0) 推荐(0)
摘要:问题来源:假设正在编写一个小游戏,游戏的背景是发生在太空,有宇宙飞船、太空船和小行星,它们可能会互相碰撞,而且其碰撞的规则不同,如何用C++代码处理物体间的碰撞。代码的框架如下: 1 class GameObject{...}; 2 class SpaceShip:public GameObject{...}; 3 class SpaceStation:public GameObject{...}; 4 class Asteroid:public GameObject{...}; 5 6 void checkForCollision(GameObject& obj1,GameObjec 阅读全文
posted @ 2012-08-23 17:41 一点心青 阅读(680) 评论(0) 推荐(0)
摘要:C++,当有一个指针或引用,但是不知道其指向对象的真实类型是什么时,可以调用虚函数完成特定类型对象的行为。但是有时候,我们需要根据不同的数据构造不同的对象类型,相当于虚拟的构造函数。1.虚拟构造函数 虚拟构造函数是指能够根据输入给穹的数据的不同而建立不同类型的对象。虚拟构造函数可应用于从磁盘(或者通网络连,或者从磁带机上)读取对象信息构造不同类型对象。例如需要编写一个程序,用业进行新闻报道的工作,每一条新闻报道都由文字或图片组成。其具体实现代码如下: 1 class NLComponet 2 { 3 public: 4 ... 5 }; 6 7 class TextBlock:... 阅读全文
posted @ 2012-08-23 16:14 一点心青 阅读(1993) 评论(0) 推荐(0)
摘要:问题来源:假设系统中只有一台打印机,如何把打印机对象数止限定为一个。或者系统只提供16个可分发出去的文件描述符,如何确保文件描述符对象存在的数目不能超过16个。在具体的应用过程中,我们可能需要限制某个类所产生的对象数量。下面我们先从简单的问题的开始。1.如何允许建立零个对象? 实例化一个对象时,将调用一个构造函数,因而阻止建立某个类的对象,最容易的方法就是把该类的构造函数声明在类的private域。代码示例如下:1 class CantBeInstantiated 2 {3 private:4 CantBeInstantiated();5 CantBeInstantiated... 阅读全文
posted @ 2012-08-23 14:37 一点心青 阅读(2233) 评论(0) 推荐(1)
摘要:C++中存在着三种类型的与内存管理相关的接口,new 操作符(new operator),new 操作(operator new)和placement new.下面简单介绍这三种接口区别和联系.new操作符是语言内置的操作符,像sizeof一样,我们不能改变它的含义和功能.我们用new操作完成动态对象的创建.它主要完成两部分工作:1.分配足够的内存以便容纳所需类型的对象.2.调用构造函数初始化内存中的对象.new操作符分配内存时,需要调用一个内存分配函数完成内存分配的工作.这个函数就是new操作(operator new).函数operator new的声明方式如下:1 void* opera 阅读全文
posted @ 2012-07-29 10:55 一点心青 阅读(680) 评论(0) 推荐(0)
摘要:在概率及博弈论上,秘书问题的描述如下: 要聘请一名秘书,有n个应聘者.每次面试一人,面试后就要及时决定是否聘化,如果当时决定不聘他,他便举回来.面试后总能清楚了解应聘者的合适程度,并能和之前的每个人做比较.问什么样的策略,才使最佳人选被选中的概率最大. 这个问题最优解是一个停止规则.在这个规则里... 阅读全文
posted @ 2012-07-28 19:40 一点心青 阅读(4174) 评论(0) 推荐(0)
摘要:new和delete是C++中进行内存分配和释放的基本接口,程序员对内存的管理就是依靠这两个接口完成.既然C++的编译器已经提供了new和delete接口,那我们为什么重新定制new和delete.这就引出第一个问题,什么情况下需要重新定制new和delete?(肯定是编译器提供的new和delete满足需求的时候)1.用来检测运用上的错误 编程的过程中,可能出现导致数据"overruns"(写入点在分配区块尾端之后)或"underruns"(写入点在分配区块起点之前).如果我们自行定义一个operator news,便可超额分配内存,以额外空间(位于客 阅读全文
posted @ 2012-07-28 18:15 一点心青 阅读(1147) 评论(0) 推荐(0)
摘要:前两天,睡觉前,偶尔翻起算法导论,看到随机函数这一块内容,里面有一个练习题.5.1-2 描述random(a,b)过程的一种实现,它只调用random(0,1).作为a和b的函数,你的程序的期望运行时间是多少?注:random(a,b)为产生a,a+1,a+2,...,b的函数发生器,且产生各整数的概率相等,同为1/(b - a + 1).看到这个题目时,似曾相识,脑海浮现了利用random(0,1)产生0或1,从而组成二进制数,来完成random(a,b)的实现.但是细想以后,感觉有个问题在脑海中有点不明不白.运行random(0,1)函数k次,使得2k>=(b-a+1),将得到[0, 阅读全文
posted @ 2012-07-28 14:41 一点心青 阅读(11743) 评论(2) 推荐(0)
摘要:经常会对文体文件进行逐行处理,在Shell里面如何获取每行数据,然后处理该行数据,最后读取下一行数据,循环处理.有多种解决方法如下:1.通过read命令完成.read命令接收标准输入,或其他文件描述符的输入,得到输入后,read命令将数据放入一个标准变量中.利用read读取文件时,每次调用read命令都会读取文件中的"一行"文本.当文件没有可读的行时,read命令将以非零状态退出.1 cat data.dat | while read line2 do3 echo "File:${line}"4 done5 6 while read line7 do 8 阅读全文
posted @ 2012-07-25 18:40 一点心青 阅读(183545) 评论(0) 推荐(6)
摘要:shell编程的过程中,经常遇到要获取文件名以及文件后缀名的问题.一般的处理方法如下:1 #code2 file="thisfile.txt"3 echo "filename:${file%.*}"4 echo "extension:${file##*.}"5 #result6 filename:thisfile7 extension:txt其主要是利用了Shell内置的一系列字符串操作符号.具体的相关操作符号介绍如下:表达式含义${#string}$string的长度${string:position}在$string中,从位置$p 阅读全文
posted @ 2012-07-25 14:31 一点心青 阅读(5689) 评论(0) 推荐(0)
摘要:面向对象的编程,首先得设计出良好的类体结构和接口,然后是合理的实现.如何自己设计并实现一个字符串类?这个问题看似简单,其实里面也有不少的玄机. 1 class CMyString 2 { 3 public: 4 CMyString(char* pStr = NULL); 5 CMyString(const CMyString& rhs); 6 CMyString& operator=(const CMyString& rhs); 7 ~CMyString(); 8 ..... 9 private:10 char* pData;11 ... 阅读全文
posted @ 2012-07-21 14:24 一点心青 阅读(3915) 评论(0) 推荐(0)
摘要:C++中内存管理是需要程序员自己控制,系统不提供垃圾回收器,因此,我们在编程要确保动态分配的内存,必须释放,归还给系统.然而,可能由于程序员的疏忽,或者程序中出现一些异常现象,会导致程序无法到达释放内存的语句,从而造成内存泄露.如何才能避免这样错误,让内存资源管理简单化?解决思路:以对象管理资源,其包含两个关键想法如下.1.获得资源后立刻放进管理对象内.实际上"以对象管理资源"的观念常被称为"资源取得时机便是初始化时机".2.管理对象运用析构函数确保资源被释放.不论控制流如何离开区块,一旦对象被销毁(例如对象离开作用域)其析构函数自然会被自动调用,释放资 阅读全文
posted @ 2012-07-19 10:48 一点心青 阅读(571) 评论(0) 推荐(0)
摘要:首先通过一个例子引出自我赋值可能会导致的问题,例子如下: 1 class Bitmap {...}; 2 class Widget { 3 public: 4 ... 5 Widget& operator=(const Widget& rhs); 6 ... 7 private: 8 Bitmap* pb; 9 };10 Widget& Widget::operator=(const Widget& rhs) //一份不安全的operator=实现版本11 {12 delete pb;13 pb = new Bitmap(*rhs.pb);... 阅读全文
posted @ 2012-07-17 20:37 一点心青 阅读(3483) 评论(0) 推荐(3)
摘要:私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量.然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有成员变量,因而,产生了困惑.下面以具体实例进行说明:疑惑:为什么第26行和第32行代码可以编译通过,而第39行和第40行代码会产生编译错误? 1 class CTest { 2 public: 3 CTest(int i); 4 CTest(const CTest& rhs); 5 CTest& operator=(const CTest& rhs); 6 vo... 阅读全文
posted @ 2012-07-17 19:24 一点心青 阅读(18188) 评论(7) 推荐(10)
摘要:C++提供关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换发生.声明为explicit的构造函数不能在隐式转换中使用.C++中,一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数),承担了两个角色.1.是个构造器,2.是个默认且隐含的类型转换操作符.写下如AAA = XXX,这样的代码,且恰好XXX的类型正好是AAA单参数构造的参数类型,这时候编译器就自动调用这个构造器,创建一个AAA的对象.使用explicit声明构造函数,则可防止隐式转换,避免上述情况的发生.具体例子如下: 1 class CTest1 { 2 public: 3 C... 阅读全文
posted @ 2012-07-17 16:52 一点心青 阅读(4963) 评论(0) 推荐(0)
摘要:在C++中,调用拷贝构造函数有三种情况:1.一个对象作为函数参数,以值传递的方式传入函数体.2.一个对象作为函数返回值,以值传递的方式从函数返回.3.一个对象用于给另外一个对象进行初始化(复制初始化).拷贝构造函数必须以引用的形式传递(参数为引用值).其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的调用来生成函数中的对象.这样会导致无限循环地调用拷贝构造函数,直至栈溢出.以前,一直有个误解,以为以同类型的对象调用"="时,就会调用赋值符.参看以下的例子: 1 class CTest { 2 public: 3 CTest(); 4 CTest(con 阅读全文
posted @ 2012-07-17 11:46 一点心青 阅读(5601) 评论(2) 推荐(1)
摘要:有时候,进行类体设计时,会发现某个类的对象是独一无二的,没有完全相同的对象,也就是对该类对象做副本没有任何意义.因此,需要限制编译器自动生动的拷贝构造函数和赋值构造函数.一般参用下面的宏定义的方式进行限制,代码如下:// A macro to disallow the copy constructor and operator= functions // This should be used in the priavte:declarations for a class#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(co... 阅读全文
posted @ 2012-07-16 19:58 一点心青 阅读(13715) 评论(0) 推荐(2)
摘要:程序开发时,经常遇到根据变量获取其类型信息的需求.例如,某一个函数针对不同的类型参取了不同的优化策略,因而要获取相应的类型信息调用对应的函数.template //将迭代器向前移动d单位void advance(IterT& iter,DistT d); //如果d void advance(IterT& iter,DistT d){ if(iter is a random access iterator) { iter += d; //针对random access 迭代器使用迭代器算术运算 } else{ //针对其... 阅读全文
posted @ 2012-07-16 10:10 一点心青 阅读(1647) 评论(0) 推荐(0)