2013年11月6日
摘要: 1、程序地址空间,从下到上(下面是低地址,上面是高地址)分别为全局数据区,堆,栈,堆往上增长,栈往下增长。2、程序运行后,还存在一个代码区,代码区放的是可执行代码,索引了一个个的方法,可认为是数据加工厂。3、全局数据区存放:全局数据,文本常量,具名常量,静态全局量,静态局部量。 阅读全文
posted @ 2013-11-06 21:06 Andy Niu 阅读(472) 评论(0) 推荐(0)
摘要: 1、map的实现是使用平衡树,AVL树或者红黑树。2、在无序的情况下,查找为常数时间。有序的时候,查找为对数时间。二叉排序树(BST)就是为了解决这个问题。3、但是,极端情况下,BST的查找效率退化到常数时间,考虑极端不平衡的二叉树,每个节点只有左孩子。4、为了解决上面的问题,就要想办法对BST进行调整,保证查找效率。5、AVL的思路是:每个节点两个孩子节点的高度相差不大于1,这样就保证了BST比较平衡。6、红黑树的思路是:跟和叶子都是黑色,红的两个孩子都是黑色,每条路的黑色个数一样。这样,就保证了最长路径与最短路径的比小于2,也就保证了相对平衡。为什么红黑树可以保证最长路径与最短路径的比小于 阅读全文
posted @ 2013-11-06 20:52 Andy Niu 阅读(632) 评论(0) 推荐(0)
摘要: 1、二者的作用是一样的,结果也是等价的。就是判断集合是否为空。2、二者是等价的,为什么强调使用empty,因为empty效率更高。3、在STL中,对于一般的集合,empty和size都是常数时间。但是对于list,empty是常数时间,size是线性时间;考虑为什么? 考虑增删操作,对于一般的集合,增删是线性时间,因为涉及到元素的移动,增删的同时也就更新了元素个数。但是对list增删,是常数时间,不会更新节点个数。 因此,对于一般的集合,size是实时更新的,empty与size可认为是等价的。但是对于list:对于empty,只需要检查head是否为end就可以了,为常数时间。对于siz.. 阅读全文
posted @ 2013-11-06 20:42 Andy Niu 阅读(556) 评论(0) 推荐(0)
摘要: 考虑下面的需求,从配置文件中,读取一些数据,这些数据放到一个集合中,获取集合,使用方法A,完成任务。该怎么做?1、首先明确一点,坚决不能让A返回引用。2、方法A在栈上创建集合,返回集合。不存在内存泄漏的问题,但是要付出copy代价。3、方法A在堆上创建集合,返回集合的指针,copy代价很低,但是会存在内存泄漏的问题。4、主调方法创建一个集合,把集合的引用传递给被调方法A,A修改集合的内容。这个不直观,客户要一些东西,方法A要求客户准备一个容器,A在容器中填充内容。5、采用哪种方法,要看具体的使用场景,如果集合内容很小,copy代价小,就不要用指针,否者用指针。6、还要考虑另外一种情况,返回的集 阅读全文
posted @ 2013-11-06 20:21 Andy Niu 阅读(669) 评论(0) 推荐(0)
摘要: 使用正则表达式: ^:b*[^:b#/]+.*$简单说明如下:^:行头$:行尾+:一个或多个*:0个或多个:b:表示空白,匹配空格或者制表符# 表示后面是include,/表示注释^:b*[^:b#/]+.*$ 查找一些行,行的开头有多个空白,后面不是空白,不是#,不是/,这个正则表达式不能剔除 /****/中的后面两行。 阅读全文
posted @ 2013-11-06 19:59 Andy Niu 阅读(1148) 评论(0) 推荐(0)
摘要: \r:回车符,返回到这一行的开头,return的意思。\n:换行符,到下一行的同一位置,纵坐标相同,new line的意思。\t:制表符,为了在不使用表格的情况下,上下对齐,table的意思。Enter 相当于\n\r,所以Enter的标识为 往下,再往前。当然,\n\r等价于\r\n。 阅读全文
posted @ 2013-11-06 14:17 Andy Niu 阅读(6617) 评论(0) 推荐(1)
摘要: 指针的删除动作,如果是安全的操作,必须保证:1、此指针由new返回,说明对象分配在堆上,而不是在栈上,或者其他位置。2、指向的对象确实不再使用,如果对象还在使用,销毁了对象,指针成为野指针,指向垃圾。 阅读全文
posted @ 2013-11-06 13:50 Andy Niu 阅读(399) 评论(0) 推荐(0)
摘要: 在程序中,只使用 using namespace std; 而不使用其他的名称空间,如using namespace boost; 这样的好处有:1、可以避免不同名称空间中的名称冲突;2、可以很清楚地知道某个东西在哪个名称空间内。因为在std中的东西,不再需要使用std::,而在其他名称空间内的必须使用对应的名称空间。 阅读全文
posted @ 2013-11-06 13:37 Andy Niu 阅读(284) 评论(0) 推荐(0)
摘要: 对于场景:string s = "123456",用"3","4"切分,默认情况下(boost::token_compress_off),切分结果为12,空,56,注意,这里的空不是空格。而是"3","4"之间的空。如果不想要这个空,指定boost::token_compress_on就行了。boost::token_compress_on的意思就是说,以"3","4",切分,当出现34的时候,就把34压缩成整体,用"34"切分。 阅读全文
posted @ 2013-11-06 12:24 Andy Niu 阅读(4968) 评论(0) 推荐(1)
摘要: 1、引用的使用场景:必须指向某个对象(不能指向Null),并且从始至终都指向这个对象。还有一种情况:操作符的返回值要求是引用,这样就可以对它赋值。2、指针的使用场景:不适合使用引用,就使用指针。3、能使用引用,尽量使用引用。因为引用相对更高效,不需要判断指向是否为Null4、引用相对更安全,引用和指针都有不安全的情况,也就是指向的内容被销毁了。5、指针指向的内容被销毁,该指针就是野指针,野指针不是Null指针。产生野指针的情况有: a、指针变量没有初始化,指针变量创建时,取值是随机的,不是Null,因此指针变量定义时,要么初始化为Null,要么初始化为合法的内存。 b、对指针进行了dele.. 阅读全文
posted @ 2013-11-06 12:14 Andy Niu 阅读(436) 评论(0) 推荐(0)