随笔分类 -  C/C++

摘要:需求简单分析。玩过连连看的都知道,连连看其实就是测试能不能用少于等于3条相连的线,连接两个点(图片)。线的条数为0~3条。先只实现了逻辑,并做了智能测试,程序自己可以演示玩连连看的过程,界面还没有做,准备用QT(不熟),源码下载0条线表示两个点相邻,在坐标轴上看就是X轴相同,Y轴值相差1,或是Y轴相同X轴值相差1。1条线表示两个点同X或是同Y轴,且两点之间没有其他点。2条线表示两个点确定的长方形,存在连接两个点的两边上都没有其他任何点3条线复杂点,经过反复的思考,决定将3条线的情况分成5类:上下左右中(东南西北中)。这样的分类主要是想让代码更好理解,思路看起来更简单点。上:连接两个点的3条线的 阅读全文
posted @ 2013-02-04 14:21 啊汉 阅读(9073) 评论(7) 推荐(10) 编辑
摘要:许多计算机系统对数据类型的合法地址做了一些限制,要求某种数据类型对象的地址必须是某个值K(2,4,8)的倍数,这种堆积限制简化形成了处理器和存储器系统之间接口的硬件设计,总之就是为了方便高效的读取数据,于是就有了数据对齐。struct S1{ char k; double i; char c; };Sizeof(S1)的值为24,而不是10,其原因就是数据对齐,如果是连续的存每个字段的值,那么double类型的i就可能分配在两个8字节的存储器块中,那么可能就要执行两次存储器访问,而现在的内存分配至这样的,k,i,c都占用8个字节,这样访问1次存储器就能得到double类型的i的值。... 阅读全文
posted @ 2012-10-03 22:38 啊汉 阅读(4132) 评论(9) 推荐(0) 编辑
摘要:1:子类不要覆写父类的非虚函数。2:子类不要覆写从父类继承过来的默认参数3:子类与父类之间的赋值问题1:子类不要覆写父类的非虚函数。为了解释方便,先看一个简单的例子。class A{ public: A(int d):data(d){ } void print() { cout<<"A print..."<<data<<endl; } virtual void test(int i=2) { cout<<"A test..."<<i<<endl; ... 阅读全文
posted @ 2012-07-28 11:00 啊汉 阅读(2861) 评论(0) 推荐(0) 编辑
摘要:Effective C++ 类与函数的设计和申明在看《Effective C++》这本书的过程中,我无数次的发出感叹,这他妈写得太好了,句句一针见血,直接说到点上。所以决定把这本书的内容加上自己的理解写成5篇博客,我觉得不管你是否理解这些条款,都值得你先记下来。下面的索引对应的是书中的章节。18:努力让接口完美且最小化19:区分member functions,non-member functions和friend functions三者20:避免将data member放在公开接口中21:尽量使用const22:尽量使用 pass-by-refernece,少用pass-by-value18 阅读全文
posted @ 2012-07-22 11:17 啊汉 阅读(3291) 评论(0) 推荐(2) 编辑
摘要:在看《Effective C++》这本书的过程中,我无数次的发出感叹,这他妈写得太好了,句句一针见血,直接说到点上。所以决定把这本书的内容加上自己的理解写成5篇博客,我觉得不管你是否理解这些条款,都值得你先记下来。下面的索引对应的是书中的章节。11:如果class内动态配置有内存,请为此class声明一个copy constructor和一个assignment运算符12:在constructor中尽量initialization动作取代assignment工作13:initialization list中的members初始化次序应该和其在class内的声明次序相同14:总上base cla 阅读全文
posted @ 2012-07-15 22:37 啊汉 阅读(3393) 评论(3) 推荐(4) 编辑
摘要:好久没有做算法题了,重温几个简单的算法题。第一题:求子数组的最大和这是一道很常见的算法题,很多人都能很快的写出算法,但很多人都不能写得完全正确,问题主要出在sum初始化上,很多错误的答案将他初始化为0,如果数组的所有元素都为负,那么得到的最大最是0,sum要初始化成数组的第一个元素。第二题:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句 这道题在网上也有很多个版本,有在构造函数中实现加法,利用两个静态变量一个存结果,一个存当前值,然后创建一个一维n个元素的数组,存结果的静态变量即为所求,还有的就是用两个方法,一个方法是递 阅读全文
posted @ 2012-05-08 14:20 啊汉 阅读(7305) 评论(6) 推荐(5) 编辑
摘要:等快递无聊--旋转字符串真是个无语的周末,昨天下午等了几个小时的快递,买了两本书《代码大全》和《编程珠玑》,还有别人的衣服,今天一大早又跑到公司来等快递,又是别人的衣服,还没有到呢,做专业的代购真是无语,本想买票,12306更让我无语,想登陆门都没有,只好玩玩程序,昨天看了编程珠玑,里面有个问题是关于字符串的旋转的,题目如下:将一个N元一维向量左旋i个位置,例如当n=8且i=3时,向量abcdefgh旋转为defghabc。你能否仅用数十个额外字节的存储空间,在正比于n的时间内完成向量的旋转废话就不多说了,其他垃圾的方法都直接PASS,直接看最好最正确的方法,没有时间写这些方法,也没有更多的时 阅读全文
posted @ 2012-01-08 11:47 啊汉 阅读(2017) 评论(6) 推荐(1) 编辑
摘要:我所知道的一个简单类 大家都说C++难学,我也正在学习,之所以难是可能因为没有了解C++中的一些很基础的东西,有点似懂非懂的感觉,而没有真正了解C++的运行机制,我一直在学习基础,这篇博客源于一个简单的类,这就是我所知道的一个简单类,博客中的观点大部分来至Effective C++和More Effective C++两本书,我是反复看了好几遍,还会一直看,因为我的C++还很菜。 一个简单的类源码: #include <iostream>using namespace std;class UInt{ public: //缺省构造函数,在没有任何构造函数的时候,编译器默... 阅读全文
posted @ 2011-10-10 11:40 啊汉 阅读(2696) 评论(5) 推荐(3) 编辑
摘要:学习C++已经有一段时间了,一直都是学习基础的东西,每次写的代码都比较少,没有明确的学习目标,基础还是基础,漫无边际的,基本上都是做一道或者几道算法题,连一个小小的实战都没有,也不知道自己学得怎么样了,现在终于有一个小小的实战了《C++ 一个网络编程实例》。由于自己一直在做C#,只能业余时间学习C++,都说C++ 是那么的难,暂时还没有感觉到有多难,毕竟写代码也有两年多了。我要学习多久才能进一家做C++研发的公司呢?相信在不远处有一家C++研发公司在等着我。这只是一个小小的实例,包括Socket编程、多线程、文件操作。简单介绍:他实现了点对点聊天,一个服务器,一个客户端,主线程用来发送数据,启 阅读全文
posted @ 2011-09-09 11:51 啊汉 阅读(81050) 评论(21) 推荐(139) 编辑
摘要:算法--两道百度笔试题 今天看到一位园友写了一篇关于百度的面试题的博客,成了评论头条,再下看了一下,非常感兴趣,那位博主的算法能力跟我一样需要提高,估计他的功力还在我之下,所以再下不才,在这里把自己的源码贴出来。 百度面试题(一):假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数和正数间元素相对位置不变。时空复杂度要求分别为:o(n)和o(1)。 其实开始的时候我也是一头雾水,在纸上画画之后发现,其实就是一道变形的插入排序。幸运的是这里不需要比较大小,要比较大小的话时间复杂度是O(n2),只用判断正负,那时间复杂度就只要O(n)了。 如:-3,1. 阅读全文
posted @ 2011-09-01 14:09 啊汉 阅读(17760) 评论(154) 推荐(6) 编辑
摘要:数组求和算法系列一直想写一个数组求和算法系列博客,但由于自己算法能力有限,完成不了,只能完成其中简单的部分,难的部分希望有园友愿意和我一起完成。在写这篇博客的过程中借用了别人的思路,有的的确是要一定的算法和数据结构基础,特别是对递归的理解,到现在为止我觉得我还没有真正的理解递归。我一向不太喜欢废话,我的博客要么是有关分析的,要么就是源码下面的代码希望对你有所帮助:1. 在排序数组中查找和为给定值的两个数字,输出一对代码//在排序数组中查找和为给定值的两个数字,输出一对void FineTwo(int*A,int size,int n) { if(n<1|| size<1) ... 阅读全文
posted @ 2011-08-24 12:36 啊汉 阅读(7426) 评论(7) 推荐(4) 编辑
摘要:C++请不要问我string s=”a”+”b”分配了几次内存当时技术能力有限,写得很扯蛋,观点完全是错误的,现在的观点是:"a"+"b"会被编译成"ab",这块内存在编译器就分配好了,可能存放在.data段或是.rdata段,s指向这个"ab"的首地址,执行这行代码其实就是在线程栈中加一个指向"ab"首地址的指针。如果产生这个指针算一次内存分配的话,那就是分配了1次内存,否则就是0次。下面的内容就不要看了,以免误导你 首先我要告诉你,string s="a"+"b 阅读全文
posted @ 2011-08-08 17:16 啊汉 阅读(5934) 评论(20) 推荐(3) 编辑
摘要:四种方式实现--从尾到头输出链表 方法一:借用栈倒序输出链表 方法二:先翻转链表,再顺序输出 方法三:递归实现,一个字妙,两个字很妙,三个字太妙了 方法四:用数组实现 方法一:借用栈倒序输出链表 因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈 方法二:先翻转链表,再按顺序打印(主要是想自己实现单链表的翻转,这种实现方式破坏了链表的结构,当然再翻转一下就还原了) 翻转链表的步骤: 1:将当前节点的next节点指向他以前的前一个节点 2:当前节点下移一位 3:如果是最后一个节点,就把它的next节点指向它以前的前一个节点... 阅读全文
posted @ 2011-08-01 19:33 啊汉 阅读(5089) 评论(2) 推荐(2) 编辑
摘要:经典算法题--求对策字符串的最大长度(第二版)方法一:思路很中规中矩,遍历这个字符串,若有发现相邻的两个字符相等,就循环判断与这两个字符相邻的两个字符是否相等, 直到不等,记下字符符合条件的字符个数。最大的个数即为所求。(此方法适合如google这样的字符串)方法二:思路和方法一时一样的,适合ggoggle这样的字符串。方法三:满足题意,适合任何类型的字符串。就是时间复杂度为O(n^2)。方法一int counterplan1(conststring str) { int strlen=str.length(); int maxlen=0; ... 阅读全文
posted @ 2011-07-25 14:41 啊汉 阅读(1903) 评论(4) 推荐(1) 编辑
摘要:题目:输入一个字符串,输出该字符串对称子字符串的最大长度,如输入google,则输出4.方法一:思路很中规中矩,遍历这个字符串,若有发现相邻的两个字符相等,就循环判断与这两个字符相邻的两个字符是否相等, 直到不等,记下字符符合条件的字符个数。最大的个数即为所求。方法二:在方法一的基础上略有改动,思路还是一样,只不过不是一发现相邻的两个字符相等就开始循环, 而是根据上次出现对称的字符个数比较对应的两个字符是否相等,如果不等,那肯定是不用循环的,我们要求最大的长度吗?哈哈哈... 如果相等,就向里循环,判断里面的字符是否相等,不等就退出循环,如果都相等的话,说明更长的长度出现了, 我们开始向外循环 阅读全文
posted @ 2011-07-22 17:55 啊汉 阅读(2831) 评论(11) 推荐(1) 编辑
摘要:C++自己实现list 前两个博客发表了自己写的stack(栈)和queue(队列),感觉比较简单,今天想试着实现list,结果发现,不是那么容易,感觉自己对STL的底层不是很了解,真要自己实现还真的很难,看STL的源代码,那个晕啊...那代码也写得太难理解了,当然跟我不了解有关,但我相信,在将来的某一天我会懂的,你看我的代码也会懂的。 话说:STL中的list的内部结构就是一个双向链表,这个东东以前还真没有玩过,就凭他用的是双向链表我就不想用他,指针太多,耗资源,当然存在就有他的价值,他能快速访问其中的元素。废话总该少说,代码就该多些。 有那么一点高兴的是实现双向链表的翻转,其他的没什... 阅读全文
posted @ 2011-07-21 19:00 啊汉 阅读(8362) 评论(16) 推荐(3) 编辑
摘要:7种方式实现斐波那契数列一:递归实现 在学校里学习递归的时候,老师就喜欢举斐波那契这个例子,看!多简洁清晰。其实这个例子是非常不适合作为递归举例的, 原因就是效率太慢,除了最后一个数,每个数都被算了一遍又一遍,时间复杂度差不多是5n^2/3。二:数组实现 空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快。三:vector<int>实现 时间复杂度是0(n),时间复杂度是0(1),就是不知道vector的效率高不高,当然vector有自己的属性会占用资源。四:queue<int>实现 当然队列比数组更适合实现斐波那契数列,时间复杂度和空间复杂度和vector&l 阅读全文
posted @ 2011-07-15 14:29 啊汉 阅读(22439) 评论(18) 推荐(5) 编辑
摘要:C++用数组和链表分别实现Queue昨天写了《C++用数组和链表分别实现Stack》,今天就是《C++用数组和链表分别实现Queue》,队列就是先来的先被处理掉,后来的就等,直到成为先来的,实现起来感觉和栈差不多。模板好用的,功能强大,有些东东还是写成模板的好,废话昨天都说了,今天是不想说的,博客园的哥们说我的博客不符合推荐到首页的要求,只好加几句废话。链表版template<typename T,typename container>class queue {public:bool empty() const{return len==0;}void checkEmpty(){if 阅读全文
posted @ 2011-07-12 16:21 啊汉 阅读(4947) 评论(4) 推荐(2) 编辑
摘要:C++用数组和链表分别实现Stack C++学习有段时间了,感觉还是有很多不足啊,今天自己用数组和链表分别实现Stack,当然STL中的Stack肯定不是这么简单,你不妨看一下,说不定有收获呢,若发现有问题,请指正,毕竟对于C++我还是新手。数组版//typename可以表示任何类型,而class只能表示类template<typename T,typename container>class stack{public://栈是否为空bool empty( ) const{return index==0;}//出栈void pop( ){if(empty()){thrownew e 阅读全文
posted @ 2011-07-11 18:22 啊汉 阅读(5548) 评论(22) 推荐(2) 编辑
摘要:作者:陈太汉是的。我们讨厌产生临时变量,因为它要占用我们的内存,消耗我们的CPU时间,让我们的程序性能降低。但有时候它是必须的。那讨厌的临时变量什么时候产生呢?产生临时变量的三种情况:一:以By Value的方式传值;二:参数为const的类型。三:类型转换一:以By Value的方式传值。 我们都知道,引用类型和指针类型传递的都是地址,可以直接对地址中存放的数据进行操作, 而以传值的方式传递参数,就会在heap中重新分配一个临时区域, 将实参中的数据拷贝到临时区域中,而你对这分数据进行的任何的操作都不会影响实参的内容,因为实参跟形参只是内容相同, 分别在两块不同的内存中。而引用和指针操作的是 阅读全文
posted @ 2011-07-04 15:54 啊汉 阅读(4292) 评论(6) 推荐(1) 编辑