上一页 1 ··· 40 41 42 43 44 45 46 47 48 ··· 58 下一页
  2013年11月5日
摘要: 考虑下面的需求,对vector中的每个元素加1,如何做?1 void add(int& lhs) // 注意:要修改主调方法中的数据,这里要使用引用2 {3 lhs= lhs + 1;4 }5 int intArray[] = {1,2,3,4,5};6 vector intVector(intArray,intArray+5);1、最原始的做法:1 for(vector::iterator iter=intVector.begin();iter!=intVector.end();iter++)2 {3 add(*iter);4 }2、使用类似b... 阅读全文
posted @ 2013-11-05 20:00 Andy Niu 阅读(59712) 评论(0) 推荐(1)
  2013年11月4日
摘要: 树型结构一直是一种很重要的数据结构, 我们知道二叉查找树BST提供了一种快速查找, 插入的数据结构. 相比散列表来说BST占用空间更小,对于数据量较大和空间要求较高的场合, BST就显得大有用处了.BST的大部分操作平均运行时间为O(logN), 但是如果树是含N个结点的线性链,则最坏情况运行时间会变为O(N). 为了避免出现最坏情况我们给它增加一些平衡条件, 使它的高度最多为2log(N+1), 最坏情况下运行是间花费也接近O(logN), 这就是我下面要讨论的红黑树.由于红黑树的插入和删除是相对复杂的操作,所以这里我将重点讨论这两种操作.AVL树在理解红黑树之前最好先来看看AVL树, 相比 阅读全文
posted @ 2013-11-04 21:08 Andy Niu 阅读(664) 评论(0) 推荐(0)
摘要: 负责一个项目,概要设计大概分为以下几个过程:1、确定边界:确定边界后,才能明确与外部哪些实体交互,交互需要确定:通信方式是串口还是网络,消息的大小,消息的格式,消息是同步还是异步。2、划模块:模块之间有竖直关系和水平关系,比如MVVM模式可以认为是竖直关系,从外部的界面到内部的数据。水平关系比如:接受消息,处理消息,转发消息。3、定接口:模块可以认为是一个IPO(Input-Process-Output)控件,概设的时候,模块是一个黑盒,对外的接口要尽量小。4、理流程:使用时序图,说明对于一个功能,若干模块是如何协作完成的。 阅读全文
posted @ 2013-11-04 19:07 Andy Niu 阅读(725) 评论(1) 推荐(0)
摘要: 1、初始化与赋值的区别: 二者的区别不是看,是否有=这个赋值操作符,而是看操作的时候,对象是否已经有值。 初始化:创建对象,并给它设置初始值。 赋值:对象已经有值,擦除对象的当前值,并使用新值代替。2、初始化分为直接初始化和copy初始化。 直接初始化:直接调用与实参匹配的构造方法。 copy初始化:也叫copy构造,总是调用copy构造方法。copy构造方法就是这样的,Person(const Person& rhs),也就是根据已有的对象,copy对象的内容,形成一个副本。3、一方面:定义对象的时候,肯定调用某个构造方法进行了初始化,包括显示或者隐式。另一方面,对象的初始化必须是. 阅读全文
posted @ 2013-11-04 18:34 Andy Niu 阅读(993) 评论(0) 推荐(0)
  2013年10月31日
摘要: 1、查找,只匹配整个词语:匹配词语Andy,而不匹配包含Andy的词语,Andy前后有特殊字符才能匹配成功,前后的特殊字符表明Andy是一个词语。2、正则表达式匹配,如下:符号功能%匹配行首 - 表示搜索字符串必须在行首,但不包括任何选定的结果字符中的行终止字符。$匹配行尾 - 表示搜索字符串必须在... 阅读全文
posted @ 2013-10-31 20:38 Andy Niu 阅读(3662) 评论(0) 推荐(0)
  2013年10月30日
摘要: 1、程序结束后,程序(实际上是指进程)占用的内存全部释放,不管是栈上的内存还是堆上的内存,包括泄漏的内存,全部释放。因为进程都不在了,OS会把进程的所有资源回收。2、因此,所谓的内存泄漏只是存在于程序运行过程中。3、内存泄漏:在程序运行过程中,对于一块确定不再使用的内存,没有人工delete,才会造成内存泄漏。4、假设一块内存,在程序的整个运行过程中都要使用,这种情况下这块内存是不能释放的,否则会引起未定义行为。必须等到程序结束后,OS来回收内存。5、假设指针指向一块申请的内存A,然后再指向一块申请的内存B,对于内存A,以后永远不会在使用,没有对内存A进行delete,造成内存泄漏。OS不会释 阅读全文
posted @ 2013-10-30 20:02 Andy Niu 阅读(242) 评论(0) 推荐(0)
摘要: 1、 Widget w1; //调用Default构造方法 Widget w2(w1); //调用copy构造方法 w1 = w2; //调用copy赋值操作符 Widget w3 = w2; //调用copy构造方法2、 对于Widget w3 = w2; 是调用copy构造方法,为什么? 因为定义一个对象的时候,肯定要调用构造方法。因此,对于Widget w3(w2) 和Widget w3 = w2表达的意思一样,都是以W2为蓝本,copy构造对象W3。3、方法调用做了两件事:a、用实参初始化形参;b、控制权交给被调方法。 被调方法的执行,以形参的定义和初始... 阅读全文
posted @ 2013-10-30 19:42 Andy Niu 阅读(265) 评论(0) 推荐(0)
  2013年10月29日
摘要: 对shared_ptr的Copy构造和Copy赋值,会改变引用计数,但是对shared_ptr中原始资源的Copy构造和Copy赋值,不会改变引用计数。因此存在下面的危险情况:1、获取资源时,初始化指针p,然后才用shared_ptr封装资源,这意味着,又可能shared_ptr已经释放了资源,还在使用p,造成未定义行为。这种问题的解决办法就是RAII2、全局变量,取得shared_ptr中的原始资源,又可能shared_ptr已经释放了资源,还在使用全局变量,造成未定义行为。这种问题的解决办法是,全局变量不要获取shared_ptr的原始资源。对于已经存在的接口,需要传递原始资源,是没问题的 阅读全文
posted @ 2013-10-29 20:51 Andy Niu 阅读(619) 评论(0) 推荐(0)
摘要: 对于下面的情况,应该在Heap上分配内存:1、对象比较大(要考虑包含的对象的大小),栈的大小有限,不宜分配很大的对象。2、创建之后,还要在其他地方经常使用,要进行频繁的传递。对象比较大,以及频繁的传递,都会导致Copy代价较大。Copy代价大,为什么不使用引用呢? 引用必须进行初始化(先有真名,再有别名),有些地方可以使用引用,比如方法的形参。有些地方不能使用引用,比如存在关联关系的对象,不能引用另一个对象,只能通过指针。 阅读全文
posted @ 2013-10-29 20:39 Andy Niu 阅读(204) 评论(0) 推荐(0)
  2013年10月25日
摘要: 1、共享资源是一个自动锁住的房间,互斥体是钥匙,进入房间必须取钥匙,离开房间应该还钥匙。这就对应着互斥体的lock(取钥匙)和unlock(还钥匙)。2、考虑下面的场景:还钥匙的时候出现异常,会发生什么? 导致死锁,因为钥匙归还失败,所有人都没法再取到钥匙。3、如何解决这个问题? 想一下,动态分配内存存在类似的情况。如果忘记delete,会导致内存泄漏。它是如何解决的? 在栈上分配对象,要一个特点,那就是离开作用域后,对象肯定要调用析构方法。利用这个特点,可以使用对象对指针封装,在对象的析构方法中进行delete,就保证了一定会执行delete。这就是智能指针。因为智能指针,不是针对一个特.. 阅读全文
posted @ 2013-10-25 19:17 Andy Niu 阅读(4270) 评论(0) 推荐(0)
上一页 1 ··· 40 41 42 43 44 45 46 47 48 ··· 58 下一页