摘要: 敏捷开发强调,要经常重构代码。在开发过程中,往往是开发和重构交替进行。短暂的重构,可以使得后续的开发维护更加容易。我觉得,代码重构可以分为逻辑重构和数据结构重构。数据结构的重构往往需要对代码进行多处改动;但是,数据结构的重构也可以为后续的开发维护带来更大的便利。这里就是一个数据结构重构的例子。这是以... 阅读全文
posted @ 2014-12-03 22:37 掰棒子熊 阅读(435) 评论(0) 推荐(0) 编辑
摘要: 在程序设计中,我们有时会遇到这样的情况,一个线程将数据写到一个buffer中,另外一个线程从中读数据。所以这里就有多线程竞争的问题。通常的解决办法是对竞争资源加锁。但是,一般加锁的损耗较高。其实,对于这样的一个线程写,一个线程读的特殊情况,可以以一种简单的无锁RingBuffer来实现。这样代码的运 阅读全文
posted @ 2014-11-22 12:11 掰棒子熊 阅读(34382) 评论(14) 推荐(4) 编辑
摘要: 最近发现了一个很好的VIM资源,best of vim tips, 展示了一系列很有用的vim 技巧。博主会逐个翻译介绍这些技巧。来源:http://rayninfo.co.uk/vimtips.html本篇:VIM搜索有关的技巧" *最佳搜索技巧*/joe/e : 搜索joe并且将光标置于匹配单词末尾。若不加/e,则光标位于匹配单词开头3/joe/e+1 : 搜索第三个joe并且将光标置于匹配单词末尾+1/joe/s-2 : 光标置于匹配单词开头-2的位置/joe/+3 ... 阅读全文
posted @ 2014-04-12 16:58 掰棒子熊 阅读(491) 评论(0) 推荐(0) 编辑
摘要: 在写代码时候,有时候需要临时注释掉一部分代码,之后还要取消这些注释。真麻烦。那么,用Vim怎么做这件事呢?第一种方法,块模式。 再次声明,本系列全部以windows下面的gVim为例说明。在命令模式下,移动光标到要注释代码段的第一行。然后依次执行以下命令ctrl + q: 切换到块模式按 j 键几次,直到选中全部需要注释的代码行输入 0, 跳转到行首输入 I,注意是大写,在左侧插入输入特定语言的注释符号,比如 //或者#等按 ESC现在,你会看到选中行开头都有了注释符第二种方法,利用宏来实现代码注释在命令模式下,移动光标到要注释代码段的第一行。然后依次执行以下命令qq0i//{... 阅读全文
posted @ 2014-03-06 21:39 掰棒子熊 阅读(505) 评论(0) 推荐(0) 编辑
摘要: 作者使用Vim已经有一段时间了,深深觉得它是一个非常强大的编辑器,使用习惯之后效率很高。最大的缺点是学习曲线比较陡峭。因此作者希望分享一些自己在实际使用中的经验来帮助初学者,同时也帮助作者自己学习。在这个系列的文章中,作者所使用的Vim是windows系统下的gVim 7.4. 同时,作者在这里不打算涉及Vim的入门知识,包括几种模式等。作者假定阅读本系列文章的读者都具有这些入门知识。好,闲话少叙。接下来进入正题。=======================================================本篇的主题是,在Vim中使用插件。插件系统是Vim的一个很强大的地方。无 阅读全文
posted @ 2014-02-27 13:24 掰棒子熊 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 昨天看到一道算法题,抽象之后就是这个问题。凸多边形的限制简化了问题。这里用一种数学方法来说下我想到的一个解法。基本思路是,把凸多边形的顶点以顺时针方向排列,可以得到一系列的向量。如果对于每个向量,这个点都位于它的“右侧”,那么这个点就位于凸多边形内部。反之则在外部。所以问题就是怎样判断一个点是否在一个向量的右侧。我们以上面的例子来说明解法。假定我们要判断点c是否在向量AB(以下向量MN均是指从点M指向点N的向量)的右侧。方法是计算向量AB和x轴正向的夹角a以及向量AC和x轴正向的夹角b。假定a和b的取值范围都是-180~180度.那么如果-180<b-a<0或者180<b-a 阅读全文
posted @ 2012-06-19 21:15 掰棒子熊 阅读(3615) 评论(0) 推荐(0) 编辑
摘要: 编程语言可以分为两类,一类是强类型语言,例如C/C++,任何变量都要明确指出其变量类型,另外一类则是弱类型语言,所有变量都不需要明确是定类型,这一类主要是各种脚本语言,javascript, python, php, etc.C++11中引入了一个新特性,可以在两种情况下不明确指定变量类型,而由编译器推断出变量类型。第一种情况是由初始化变量的类型来推断变量类型,如下,例子来自wikiauto otherVariable = 5;auto someStrangeCallableType = boost::bind(&SomeFunction, _2, _1, someObject);在这 阅读全文
posted @ 2012-05-06 16:04 掰棒子熊 阅读(811) 评论(0) 推荐(0) 编辑
摘要: 在c++11里面,对于常数表达式有了更强的支持。一个是函数返回值可以是常数,另外一个是对于变量的常数表达式的支持更广。首先,函数返回值可以是常数。这个值你可以把它用在所有可以用常数的地方,例如一个数组的大小。下面是一个例子,来自wiki.constexpr int GetFive() {return 5;}int some_value[GetFive() + 5];也就是说,一个函数以constexpr来声明,那么编译器会知道这个函数返回的是常数,从而编译器会在编译期进行变量替换来求出这个常数。(这段来自wiki,本人做了整理)将函数声明为constexpr有非常严格的条件。首先,该函数的返回 阅读全文
posted @ 2012-05-01 21:57 掰棒子熊 阅读(465) 评论(0) 推荐(0) 编辑
摘要: 很久没写了……赶紧继续上这里说右值,有一种解释是说位于赋值运算符左边的是左值,右边的是右值。其实,从“右值引用”这里看的话,一种更准确的定义是,不能放在运算符左边的叫做右值,其他的叫做左值。好,说完右值,右值引用就好理解了,也就是对于右值的引用。那么,为什么之前没有右值引用呢?是因为右值主要都是一些临时变量,对它们的引用是没有意义的,因为理论上我们没有临时变量的任何知识,它是不可用的。而c++11引入右值引用,则主要是与move语义结合使用。那么,move语义是有什么用呢?这里的move可以按照文件操作中的"copy"和"move"两种操作中的后者来理解 阅读全文
posted @ 2012-05-01 21:01 掰棒子熊 阅读(591) 评论(0) 推荐(0) 编辑
摘要: lambda表达式是函数式编程的基础。咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下。这里只是介绍C++11中的lambda表达式以及与此相关的闭包(closure)。同样,这里首先给出参考文档http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2927.pdf其次,给出两个例子,可以看出lambda表达式的写法[](int x, int y) { return x + y; }[](int x, int y) -> int { int z = x + y; return z + x; 阅读全文
posted @ 2012-02-04 15:35 掰棒子熊 阅读(5062) 评论(0) 推荐(2) 编辑