
c/cpp
文章平均质量分 61
Runyon1982
擅长Java、C++,全栈开发者
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
整型数字在计算机中的表示
记得远古时代,上第一门计算机课时,书上说:整型数字在计算机中的以补码形式保存。今天有人问我这是啥意思。我干脆就写了个程序来说明这点,程序的功能是让用户输入一个整型数字,然后将这个数字所占据的内存按照位和字节分别输出。不但可以看出的确是用补码形式保存,还能看出是little-endian还是big-endian。#include #include using namespace std;原创 2015-10-10 09:18:22 · 1305 阅读 · 0 评论 -
一个笑话和其对开发的启示
某地举办比赛大便,已经分出前三名当第三名把他的作品端出时全场喝采欢声四起他竟然拿出一个有如卡通般螺旋大便主持人便问他如何做到的他说这个必须考虑到圆周率以及速度的问题在大便时必须用屁股旋转,以及力量速度要恰到好处,中途不能中断话一说完,全场一阵掌声接下来是第二名当他端出作品时,已经有人哭出来了,掌声不断,天啊他竟然端出一串香肠主持人当然也问如何办到的他说:这必须要考虑到饮食原创 2015-10-10 09:19:12 · 323 阅读 · 0 评论 -
RAII、异常、构造函数是一家人
看到标题像胡说八道,其实真是我等车的时候胡思乱想的。 没有RAII(含智能指针,它是用RAII方式来管理内存资源),使用异常将举步维艰,因为c++没有finally。但是有了RAII,c++的异常使用起来比java更轻快。没有异常,构造函数除了赋赋初值干不了什么事情,所以往往需要init(或者start或者kaishi或者任何你喜欢叫的名字)来做复杂初始化。 如果使用错误码方式,原创 2015-10-10 09:19:14 · 541 阅读 · 0 评论 -
MFC无法为控件添加变量(Add Variab…
许久不用MFC,今天在vs2008下用MFC写个小东西,结果在为控件添加变量的时候,居然无法成功——那个界面显示怪怪的,点击完成提示失败。 还好同事遇到过这个问题,给出链接http://hi.baidu.com/sunbin728/blog/item/9fa86c1d0744e9c3a68669e6.html。我的表现跟文中描述是不同的。但是抱着死马当活马医的心态try了一下。居然就OK原创 2015-10-10 09:20:32 · 3688 阅读 · 0 评论 -
求一个正数序列,不超过某一上限最…
在订阅的页面中看到该算法题。解决方案有人说穷举,有人说动态规划,其实这道题目没这么复杂。因为子序列必须是连续的。(不然就是背包问题了)。所以有O(N平方)的解法,而不是O(2的N次方) 代码如下:#include using namespace std;// 本函数只打印唯一解,如果要打印所有解,就先扫描最大值,再扫描一次打印所有即可int printMaxSeqence(in原创 2015-10-10 09:20:35 · 398 阅读 · 0 评论 -
c10k测试:每连接新线程回显服务器…
一直听说每连接开线程的服务器当连接多了以后,由于线程切换和线程竞争导致的开销将会导致每秒处理请求数快速下降。最近写了个每连接开线程的回显服务器想要验证一下这种说法。一开始以为会画出一张漂亮的图(像javanio vstomcat那张图一样的)。结果却让我吃了一惊:连接数增加到了15000,服务器威猛依然,每秒处理请求数相比连接不多时没有明显下降( 再次深感高性能这块不能拍脑袋想当然。原创 2015-10-10 09:21:08 · 377 阅读 · 0 评论 -
C++的Stack实现
初始版本,未引入异常,未将声明与实现分开#include #include class Stack{public: Stack(intcapacity_) :elements(NULL) ,top(0) ,capacity(capacity_) { elements =new int[capaci原创 2015-10-10 09:21:27 · 518 阅读 · 0 评论 -
示范如何让QT控件捕捉键盘事件实现…
扩展QTextEdit,实现类似QQ ctrl+enter 或者msn enter快捷键的效果。 还是很容易的,需要注意QT中Key_Enter指的是小键盘的回车,Key_Return才是键盘中间的回车。代码如下:#pragma once#include #include class TriggerTextEdit : publicQTextEdit{ Q原创 2015-10-10 09:21:32 · 4278 阅读 · 0 评论 -
示范如何在命令行程序中处理用户中…
实现捕获、处理用户中断信号的命令行程序还是比较繁琐的。尤其是Linux,Windows有一定差异。下面我实现了一个跨平台的捕获、处理用户中断信号(ctrl+c)的命令行程序框架。在windows下用SetConsoleCtrlHandlerAPI捕获处理中断,在Linux下用信号机制。===================================================原创 2015-10-10 09:21:35 · 405 阅读 · 0 评论 -
简单判断图像格式的办法(BMP/JPEG…
今天遇到一个问题:测试人员发现某些“bmp”文件我们程序无法正确读取。我们是用QT库来读取图像的。似乎不应该出现这种问题,Google也没听到人抱怨。调试进去,发现是读取文件头后发现格式不对,所以QT没有继续读了。用UE打开一看,发现JFIF字样,搜索发现原来这个“bmp”其实是jpg格式的图像文件。 之后测试了下,发现现在的图像编辑软件对后缀是宽容的。也就说明它们不是根据后缀来判断图像原创 2015-10-10 09:21:45 · 1326 阅读 · 0 评论 -
使用c++实现时间轮算法(Timing-Wh…
前段时间写了篇blog描述了时间轮算法(http://blog.sina.com.cn/s/blog_48d4cf2d0100pq9o.html),昨天终于动手用c++将其实现了,并通过了单元测试。我没有看Linux内核的实现代码,只是看了资料凭自己的理解来实现,在效率方面也没有尽量优化。所以下面的代码用来帮助理解算法可以,拿来实际用就不一定靠谱了。 另外我没有实现删除函数,因为懒得自己原创 2015-10-10 09:21:47 · 2729 阅读 · 0 评论 -
boost::bind示例
#include#include #include using namespace std;class Foo{public: void foo(double d, int i, int j) { cout<< d <<endl;//打印0.5 cout<< i <<endl;//打印100 c原创 2015-10-10 09:18:53 · 328 阅读 · 0 评论 -
boost中的读写锁
开发高性能的并发应用时遇到的问题常可以归结到读写锁模式。利用boostthread库,可以很简单地实现一个读写锁(搜索就有了)。不过老猫告诉我boostthread库本来就包含读写锁了。呵呵。我一开始以为省了我很多功夫,结果后来花的时间更多。因为boost实现的是传统读写锁的refinement。boost的锁分为三级:shared_lock,这个可以看作是传统的读锁;upgrade_lock原创 2015-10-10 09:18:03 · 1994 阅读 · 0 评论 -
boost::bind简要介绍
boost::bind是一个很神奇的东西。他可以把函数(包括类成员函数!)和其参数一起打包成一个函数对象。未引入它之前,基于面向对象架构的软件往往很难在接口设计中引入回调函数的——因为类成员函数无法直接作为回调函数使用——当然,有办法可以搞定,比如把this指针作为回调函数的参数传入。但是这些解决之道往往比较扭曲,远不如bind来得简单直接。虽然bind也是有代价的,调用的时间代价(包括bind的原创 2015-10-10 09:18:51 · 296 阅读 · 0 评论 -
使用boost条件变量实现消息队列
boostthread库里面没有实现类似java中BlockingQueue的东东。但是使用条件变量来实现一个还是很容易的。下面的代码是以前学习boostthread库时的练手之作。==============================================================#include#include #include #include原创 2015-10-10 09:19:42 · 563 阅读 · 0 评论 -
为何编译器无法自动生成拷贝函数
C++编译器一般会为用户自定义类型生成默认拷贝函数。它的行为是逐位复制。逐位复制的意思不是memcpy,而是逐个变量进行复制。 很多书有教导如何禁用掉编译器的拷贝函数:自己声明一个private的拷贝函数。 不过有些时候我们没有故意禁用拷贝函数,却发现编译错误:提示没有相应拷贝函数。这是为什么呢?(一般发生在使用std容器时) 1)先瞄下,有没有不小心声明了个privat原创 2015-10-10 09:19:54 · 463 阅读 · 0 评论 -
算法题:求所有和为N的子集
瞎逛时看到这个题目。想来很久没有做算法题了,觉得本题好像挺好玩的,所以抓来练手。 解释下题目,比如集合{1,2,3,4,5},和为5的子集有{1,4},{2,3},{5}。这个问题有点类似Subset sumproblem,可参考(http://en.wikipedia.org/wiki/Subset_sum_problem) 不过我没有想到文中那些聪明的做法,还是祭出万金油原创 2015-10-10 09:20:12 · 704 阅读 · 0 评论 -
QT4.6中将QImage保存为JPG格式
貌似很容易,因为看QImage的save函数说明就可以做这种事情。 但是实际运行保存却失败。搜索之。 发现应该要找个疙瘩放这两句话:#include Q_IMPORT_PLUGIN(qjpeg) 之后将 QT目录\plugins\imageformats\qjpegd.lib(Debug)或者 QT目录\plugins\imageformats\qjpeg.lib(R原创 2015-10-10 09:20:25 · 2633 阅读 · 0 评论 -
解决VS2008调试后控制台无法关闭的…
如果遇到这个问题,说明你有开启windows更新(包括通过360方式更新),因为这是由微软的某个补丁包导致的问题。表现极度恶心:调试后控制台无法关闭,而且还没办法关机或重启,只能强行关闭电脑电源。 上网搜索下,发现遇到这个问题的人很多,详见:http://social.answers.microsoft.com/Forums/en-US/vistawu/thread/73cea55原创 2015-10-10 09:20:37 · 1336 阅读 · 0 评论 -
Prim最小生成树算法,c代码,非伪…
不知道为何数据结构书上总是喜欢用伪代码,其实真实代码多不了几行。也许是为了让学生动手的时候可以动动脑子? 最小生成树用贪心算法可以求得最优解,实现起来没啥营养很简单。不过有多个加了限制条件的扩展版是NP完全问题,就没这么容易求解了。========================================================================#inc原创 2015-10-10 09:21:52 · 395 阅读 · 0 评论 -
为何浮点数(float,double)不能直…
很早就听说了这个说法,但一直知其然,不知其所以然。实际编程的时候有些时候记得,有些时候也忘了,但似乎也没有受到什么惩罚。昨天晚上读《深入了解计算机系统》(好书,顺便推荐)才算对此有了比较深入的理解。 书上提到gcc浮点比较的一个Bug,上网一搜,发现是个老大难问题:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323。最后这个Bug并没有标志成F原创 2015-10-10 09:21:59 · 507 阅读 · 0 评论 -
C++没有所谓的"赋值构造函数"
发现蛮多C++coder存在一个误会:"string str2 = str1;" 调用赋值构造函数。"string str2(str1);"调用拷贝构造函数。 但其实C++有拷贝构造函数(有人叫复制构造函数),有赋值运算符重载,但没有赋值构造函数! "string str2= str1;" 和 "string str2(str1);"效果完全一样,都是调用拷贝构造函数。原创 2015-10-10 09:22:54 · 382 阅读 · 0 评论 -
高效地反向逐行读取文件
在某些时候,我们需要从文本中读取最后几行。这时候如果采用基于流的文件读取方式,在文件大的时候效率十分低下,因为要把整个文本读取一遍才能定位到最后几行。本文提供的实现采用逐块回退读取文件数据的方式,提供快速且内存可控的反向逐行读取功能。上代码吧:class BackwardLineReader{public: //指定文件路径、换行符、每次读取的字节数、最大的缓存大小(用于避免由于原创 2015-10-10 09:23:18 · 869 阅读 · 0 评论 -
猜测文本/字符串编码的方式
如果给定一个文本/字符串,要获得其编码方式,除了BOM位判断法(很多文件没有BOM标志,有也不一定就正确),就只能通过猜测的方式来获得了。 不管是Linux下的iconv或者windows下的编码转换API都可以知道转换失败的。所以可以随便截一段话,不知道是utf-16,utf-8,gbk没关系,就假设它是,然后转换到另一种编码,如果成功转换了,可能就是它了,如果失败,那就可能不对。当原创 2015-10-10 09:21:54 · 2206 阅读 · 0 评论 -
不用担心大Switch块的性能问题
不知道是否有人会跟我之前一样,觉得Switch如果太大,后面的case要执行很多次比较,效率会比较低。我们代码中有几个大的switch块用于判断网络数据包的类型。昨天我想,如果常用操作在比较后面的case,不是要平白多很多次判断。听说Java对大Switch块会对case排序,然后就可以用二分法比较快地找到对应case。这种方法貌似不错。不过我觉得作为很黄很暴力的C++,使用函数指针Hash直接原创 2015-10-10 09:22:01 · 2034 阅读 · 0 评论 -
纯C的Stack实现
写教程,想要说明白面向过程和面向对象的区别,想用Stack作为最简单的例子。网上搜索Cstack头几个写得乱七八糟。干脆自己动手写个。=======================================stack.c============================================#include #include typedef struct{原创 2015-10-10 09:21:25 · 287 阅读 · 0 评论 -
基于Boost线程库实现Java中atomic…
Java的java.util.concurrent.atomic包的说明是“ A small toolkit of classesthat support lock-free thread-safe programming on singlevariables”。挺贴切的。是实际多线程编程时很方便的一组类。最近我使用boost里的thread库模仿实现了下,没有单元测试,但应该是正确的。因为它原创 2015-10-10 09:22:59 · 539 阅读 · 0 评论 -
Java和C/C++进行DES/AES密文传输
本来觉得DES、AES这种流行加密算法,使用起来应该很简单。但研究后发现有两个变数:1)分块的方式。加密是逐块进行的。分块方法有:CBC、ECB、CFB……2)padding的方式。当数据的位数不及块的大小时,需要填充。填充方式有:NoPadding、PKCS5Padding……如果加解密端采用不同的分块方式或padding方式,即使都是采用DES/AES算法,同样无法解密成功。上次需要C原创 2015-10-10 09:23:13 · 771 阅读 · 0 评论 -
暴力摸瓜之从成员变量到类变量
假设类Foo如下:struct Foo{ int i; float f;};假如知道类Foo的对象a,要知道其中某个成员变量,那是很直观的: a.i 或者a.f。那如果知道成员变量的地址比如:int* p =&a.i,能不能通过p反推出a的地址呢?可以利用offsetof宏:Foo* pFoo = (Foo*)(char(*)p - offsetof(Foo, i))原创 2015-10-10 09:18:20 · 221 阅读 · 0 评论 -
并发环境下的单态——应用程序级单态…
单态是种诱惑力很大的设计模式。但在并发环境下把单态设计成类的方法很多时候并不合适:要么由于每次加解锁导致效率不高;要么由于缺少必要的锁导致程序存在潜在错误,这些错误可能很久甚至永远都不会爆发,但哪天发作了就会把人炸得晕头转向。没有两全之路?有的,这就是应用程序级的单态。我将其称为“云态”——这是在开故弄玄虚的“云计算”的玩笑——我的真实意思是说没啥新东西,都是大家了解的东东。 先来看段原创 2015-10-10 09:19:09 · 233 阅读 · 0 评论 -
正确实现和使用assert
assert是检验函数入参和predictions的有效方法。但是默认的assert实现(不管是windows还是linux)示范了两种最糟糕的错误处理方式:第一)直接崩溃。第二)不管异常直接做。 非调试方式就意味着可以不检查入参?那如果传入的是一个数组下标,不检验直接数组操作还不是哐当一声,程序挂了? 正确的assert实现应该是这样的: 1)始终如一地执行。不要像默认原创 2015-10-10 09:19:21 · 894 阅读 · 0 评论 -
c++中实现类似java printStackTrac…
在程序中使用异常的时候,最怀念的莫过于java中的printStackTrace功能了。在c++里面能否实现一样的功能呢? 搜索sourceforge,还真发现有一个stacktrace项目针对该问题。解决方案就是在windows下使用StackWalk系列函数,在linux下使用backtrace系列函数来访问函数栈信息。测试后发现能用。于是很快乐地盗版、编译、运行。 Linu原创 2015-10-10 09:19:33 · 472 阅读 · 0 评论 -
使用std::set作为用户自定义类型的…
先看看std::set的声明template Key, classTraits=less, classAllocator=allocator> class set对比下std::map的template classType, class Traits = less,class Allocator=allocator<pair <constKey, Type> > > clas原创 2015-10-10 09:19:59 · 629 阅读 · 0 评论 -
简化C++内存管理,避免内存泄露的…
C++不像java和c#那样有垃圾回收机制,所以内存泄露是个比较头疼的问题(谁会忘记写delete?谁都会!),有几种缓解之道: 1)智能指针(推荐boost::shared_ptr)。 2)真正的垃圾回收,参考http://www.hpl.hp.com/personal/Hans_Boehm/gc/,这个我没用过,因为据说不实用:)故本文不讨论。 3)这是从QT中学到原创 2015-10-10 09:20:14 · 562 阅读 · 0 评论 -
更改QTreeView, QListView在window…
早知道有这个bug,当时就让UI设计的时候让选中色等于windows7的默认色。然后xp下来模拟windows7。哎。UI设计用黄色作为选中色。xp下用QSS很容易搞定了。但是这个设置在windows7下不起作用,选中后总是出现win7默认的选中蓝。 在折腾一阵后发现这是QT的一个bug:"QTBUG-4310 QTreeView: setting a style sheetusing原创 2015-10-10 09:21:20 · 900 阅读 · 0 评论 -
VS2008性能测试profiling系统重启…
换了新电脑后还没跑过profiling,今天有需要,结果一跑系统就重启了(reboot),上网一搜,发现:http://code.msdn.microsoft.com/KB958842。 装了KB958842补丁(不需要重启计算机,重启vs2008就可以了),发现就OK了。希望本文能帮到英文不好的同学。 软件: vs2008sp1 硬件: intelcpu 现象:一原创 2015-10-10 09:21:13 · 1097 阅读 · 0 评论 -
static、extern、无修饰符全局变量…
1)extern intglobal_error; // 该语句是非静态全局变量global_error的声明 2)extern intglobal_error = 0; // 该语句是非静态全局变量global_error的定义,不建议这么写,因为extern关键词起不到作用 3)intglobal_error =0; // 该语句是非静态全局变量原创 2015-10-10 09:20:57 · 470 阅读 · 0 评论 -
C++中如何split字符串
毫无疑问,split应该是任何非反人类的标准库编写者都应该提供的功能,因为实在是太常用了。但是不幸的是C++中的string并未提供此功能。诚然实现此功能不难,但为何老是要程序员重复造轮子? 好在boost里提供了几种split字符串的方式。1)使用boost::split。注意is_any_of的意思是集合中的任何一个,而不是equals的意思,那如何根据字符串split原字符串?请原创 2015-10-10 09:22:06 · 2307 阅读 · 1 评论 -
边遍历容器边删除容器元素——适用于…
我们有时候想要删除容器中的多个元素。普通做法可能是逐个进行删除。但这要做的话效率比较低。其实std中的list、set和map容器是有办法边遍历边删除的。使用这种方法,优点很明显,高效省事。缺点就是这种用法并没有出现在标准库的文档中。虽然经测试,windowsvs2005vs2008,gcc4.1下都可以pass。但日后编译器升级了就不一定了。但我觉得这个hack应该会保留下去,因为太方便了。原创 2015-10-10 09:22:11 · 853 阅读 · 0 评论 -
Openmeeting、Asterisk和X-lite之…
如图所示:说明:1)PC Web客户端与Openmeeting会议软件之间的通信协议是HTTP和Flash。2)Asterisk是SIP服务端,跟SIP客户端通过SIP协议通信,使用RTP协议进行实时传输。3)每个会议室都是Asterisk的一个客户端。4)X-lite是一个运行在PC上的SIP客户端程序。原创 2015-10-10 09:22:25 · 481 阅读 · 0 评论