Fork me on GitHub
  2014年4月23日
摘要: 模板元编程(Template metaprogramming,简称TMP)是编译器内执行的程序,编译器读入template,编译输出的结果再与其他源码一起经过普通编译过程生成目标文件。通俗来说,普通运行程序是编译器生成的机器码,由处理器解释执行得到结果,TMP则是编译器实例化template过程中得... 阅读全文
posted @ 2014-04-23 00:26 coderkian 阅读(513) 评论(0) 推荐(1) 编辑
  2014年4月10日
摘要: 本文介绍c++的RTTI的基本用法,并初步研究RTTI的实现原理。1. 什么是RTTIRTTI即运行时类型识别(runtime type identification),用于判断指针或引用所绑定对象的动态类型,由两个运算符实现:dynamic_cast 将基类指针或引用安全地转换为派生类的指针或引用typeid 返回表达式的类型2. 为什么要用RTTI当我们需要对象的类型信息时,比如需要使用非虚函数,有必要知道当前指针绑定的对象的动态类型。3. 如何使用RTTIdynamic_cast用于安全的向下转型(type-safe downcast)。需要注意两点:运算符作用的对象必须含有虚函数。作用 阅读全文
posted @ 2014-04-10 23:57 coderkian 阅读(1565) 评论(0) 推荐(0) 编辑
  2014年4月7日
摘要: 这篇文章我要简单地讲解下c++对象的内存布局,虽然已经有很多很好的文章,不过通过实现发现有些地方不同的编译器还是会有差别的,希望和大家交流。在没有用到虚函数的时候,C++的对象内存布局和c语言的struct是一样的,这个比较容易理解,本文只对有虚函数的情况作分析,大致可以从以下几个方面阐述,1. 单一继承2. 多重继承3. 虚继承下面循序渐进的逐个分析,环境是ubuntu 12.04.3 LTS+gcc4.8.1单一继承为了实现运行时多态,虚函数的地址并不能在编译期决定,需要运行时通过虚函数表查找实际调用的虚函数地址。单一继承主要要弄明白两个问题:1.虚函数表在哪里?2. 基类和派生类的虚函数 阅读全文
posted @ 2014-04-07 01:01 coderkian 阅读(1649) 评论(10) 推荐(1) 编辑
  2014年3月20日
摘要: Lambda是c++11中最重要的新特性之一,cppreference.com是这样定义的:an unnamed function object capable of capturing variables in scope。即可以使用临时局部变量的匿名函数。Lambda的完整语法如下:[ capture ] ( params ) mutable(optional) exception attribute -> ret { body }除了[ capture ]和{ body }是必需的,其他都可以省略。CaptureCapture定义了lambda需要使用的同一作用域的局部变量,全局变 阅读全文
posted @ 2014-03-20 22:41 coderkian 阅读(383) 评论(0) 推荐(1) 编辑
  2014年3月16日
摘要: 本文大部分来自这里,并不是完全着行翻译,如有不明白的地方请参考原文。在c++中,创建临时对象的开销对程序的影响一直很大,比如以下这个例子:String getName(){ return “Kian”;}string name = getName();name对象的构建可以细分为3步:1. 用kian构建函数内的局部string对象tmp12. 调用复制构造函数将tmp1复制到tmp2,并析构tmp1.3. 调用赋值拷贝函数将tmp2拷贝到name,并析构tmp2。所以一共做了3次内存分配,两次复制拷贝操作,但是tmp1和tmp2都马上析构了,如果内存分配很大的话,这里的资源浪费是很可观... 阅读全文
posted @ 2014-03-16 23:38 coderkian 阅读(511) 评论(0) 推荐(0) 编辑
  2014年3月9日
摘要: 问题描述n个人围成一圈,号码为1-n,从1开始报数,报到2的退出,剩下的继续从1开始报数,求最后一个人的号码。算法分析最直观的算法是用循环链表模拟。从首节点开始,不断删除第二个节点,直到只剩一个节点为止。时间复杂度是O(2n).typedef struct josephusnode{ struct josephusnode *next; int item;}jnode;int listjosephus(jnode *head){ jnode *n = head; while(n->next!=n){ jnode *t = n->next; n... 阅读全文
posted @ 2014-03-09 14:33 coderkian 阅读(274) 评论(0) 推荐(0) 编辑
  2014年3月5日
摘要: 最近这段时间比较忙,利用业余时间看完了这本书。虽然书中讲到的很多例子都是上古文物,我没有用过,不过原理都是相通的,对我的启发很大。比如无所不在的KISS原则,实践中慢慢体会到的SPOT原则,无不产生共鸣。下面是这些原则的一些笔记和个人理解。1. 模块原则为什么要模块化?计算机编程的本质就是控制复杂度。而模块化可以降低整体复杂度,即使出现问题也只是局限于局部,方便维护。紧凑性和正交性是模块化的两个重要特性。对于现代项目来说,跨度一般都很大,完全达到紧凑性是非常困难的,只能尽量采用。正交性是指程序中每个动作有且只有一个方法,正交性的程序不但会减少程序中的副作用,而且从另一个方面达到紧凑性。SPOT 阅读全文
posted @ 2014-03-05 00:21 coderkian 阅读(499) 评论(0) 推荐(0) 编辑
  2014年1月29日
摘要: 本文讨论如何判断一个点是在多边形内部,边上还是在外部。为了方便,这里的多边形默认为有向多边形,规定沿多边形的正向,边的左侧为多边形的内侧域,即多边形边按逆时针方向遍历,不考虑自交等复杂情况。比较常见的判断点与多边形关系的算法有射线法、面积法、点线判断法和弧长法等,算法复杂度都为O(n),不过只有射线法可以正确用于凹多边形,其他3个只可以用于凸多边形。1. 射线法射线法是使用最广泛的算法,这是由于相比较其他算法而言,它不但可以正确使用在凹多边形上,而且不需要考虑精度误差问题。该算法思想是从点出发向右水平做一条射线,计算该射线与多边形的边的相交点个数,当点不在多边形边上时,如果是奇数,那么点就一定 阅读全文
posted @ 2014-01-29 00:02 coderkian 阅读(9738) 评论(5) 推荐(1) 编辑
  2014年1月28日
摘要: 定义两个向量的叉积写作a×b,可以定义为a×b=absinθn其中θ表示a和b之间的角度(0°≤θ≤180°)。它位于这两个矢量所定义的平面上。而n是一个与a、b所在平面均垂直的单位矢量。矢量叉积是计算几何算法的核心部分,具有重要的几何意义。一、计算多边形面积设多边形有n个顶点V0(X0,Y0), V1(X1,Y1)... Vn-1(Xn-1, Yn-1),从原点O(0,0)与每条边做三角形,计算的面积和就是多边形面积。三角形面积可以用叉积计算,比如OV0V1面积为:S0=0.5*OV0×OV1=0.5*(X0Y1-X1Y0)于是多边形面积总和 阅读全文
posted @ 2014-01-28 00:55 coderkian 阅读(2322) 评论(10) 推荐(0) 编辑
  2014年1月8日
摘要: 本文介绍c++的四种智能指针,其中后三种是c++11新增加的,auto _ptr已被弃用。要编译c++11,需要安装g++-4.8sudo add-apt-repository ppa:ubuntu-toolchain-r/testsudo apt-get updatesudo apt-get instal gcc-4.8sudo apt-get install g++-4.8编译时指定标准:g++-4.8 -std=c++11auto_ptr详细请参考这里auto_ptr是为了推动RAII而加入到c++标准的第一个智能指针,它实现了最基本的资源管理,不过与其他类型不同的是,auto_ptr是 阅读全文
posted @ 2014-01-08 22:59 coderkian 阅读(2686) 评论(5) 推荐(3) 编辑


作者:coderkian
出处:http://www.cnblogs.com/coderkian/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。