Posts List

boost解析之 proto

Proto是在C++中嵌入领域语言(Embedded Domain-Specific Languages)的一个框架。它提供构建,类型检查,转换,和执行表达式模板的工具: 表达式树数据结构 让表达式赋予行为和成员的机制 建立表达式树的运算符重载 定义表达式语法(grammar)的工具 执行表达式模板的扩展机制 -应用于表达式树的可扩展的转换(transforma ...

24点游戏中的分治策略

直接使用穷举法不是一个好的想法,排列数为N!,两两运算种类有 { a+b, a-b, b-a, a*b, a/b, b/a },为(N-1)^6,因此总计算量为N! * (N-1)^6,是指数级的运算。 能不能通过设计来减少计算量呢? 考虑分治策略,将大集合拆分为小集合运算再合并。 这样 f(A) = U Fork( f(A1), f(A-A1) ),其中A1是A的任何一个子集,Fork代表子集之间的运算,而整个集合A的结果就 ...

松本行弘:我的编程人生

松本行弘(Yukihiro Matsumoto),1965年4月14日出生于日本鸟取县。1984年,就读于筑波大学第三学科信息学系。2年后休学,成为末日圣徒耶稣基督教会的宣讲师。大学复学后,加入中田育男教授的研究室。1990年大学毕业。后在岛根大学攻读博士课程,修满学分后退学,未获学位。 现任株式会社Network应用通信 ...

boost解析之 range

正如“Iterator Must Go”中所说,STL的算法虽然设计的高效,但是基于迭代器的算法设计使得灵活性和简洁性受到很大的限制,也阻碍了STL算法的更广泛的使用。 range设计的目的就是弥补STL的这个缺陷,用range的概念来取代用迭代器对[first, one_past_last)来标识区间,使得使用算法可以更加灵活和紧 ...

基于Range的泛型算法设计

本文介绍基于range的C++泛型算法设计的方式。 先来看一下STL的整体框架: 容器 vector、list、set、map、multi_map等 迭代器 每一种容器都配备自己独立的迭代器类型:Container::iterator 配接器 容器配接器:如stack、queue 迭代器配接器:如3种Insert Iterator、St ...

乔布斯在斯坦福大学的演讲

乔布斯在斯坦福大学的演讲。 演讲全文 I am honored to be with you today at your commencement from one of the finest universities in the world. I never graduated from college. Truth be told, this is the closest I’ve ever gotten to a college graduation. Today I want to tell you three stories from my life. That’s it. No big deal. Just three stories. The first story is about connecting the dots. I dropped out of Reed College after the first 6 months, but then stayed around as a drop-in for another 18 months or so before I really quit. So why did I drop out? It started before I was born. My biological mother was a young, unwed college graduate student, and she decided to put me up for adoption. She felt very strongly that I should be adopted by ...

C++运行时惯用法

本文整理了C++的一些运行时的惯用法。 pimpl惯用法 对于一个类型T来说,如果内部使用了其他的类型U: 可以将U直接做为数据成员,但是这样T和U是耦合的,因为U的定义对于T必须是可见的; 也可以只适用U的指针作为数据成员,这样只要有前置声明,知道U是一个类型即可,U的定义可以在T的实现之前可见即可。 特别的,将T需要的所有数 ...

boost解析之 mpl

mpl致力于操作编译期的静态语言设施,元数据和类型都具有不变性,与纯函数式编程有相似之处。 mpl提供了模板元编程需要的基础框架: 序列, 迭代器, 算法, 还有一些如fold之类的基础元函数。 序列 编译期类型序列是C++模板元编程中的一个基本概念。MPL 将类型序列的重要性视为很多高级元编程设计的基础构件,提供了一套正式的基本框架 ...

模拟“类模板名重载”

函数支持重载,这样相同的函数名可以共用,只要参数不一致就能成为重载函数,特别是功能类似的函数的时候,这样的重载来表达是非常合适的;同样道理,如果有类模板,如果功能类似,但是可能操作的对象数目不一致,即模板参数数目不完全一致,怎么共用一个名字来表达呢? 类模板名重载 由于类是不支持重载的,只能通过默认模板参数和构造模板特化来 ...

boost解析之 tokenizer

tokenizer库提供了字符串的单词分割的容器和迭代器模型,这样可以让我们轻易的按照某些规则分割字符串,该库提供了可配置的3种常用的函数对象类型供选择,当然用户如果有需求可以自己按照规范写操作类型,配置使用。 容器模型 tokenizer template < classTokenizerFunc = char_delimiters_separator<char>, classIterator = std::string::const_iterator, classType = std::string > classtokenizer; tokenizer 类提供了一个容器视图,将一系列单词包含在一个序列中。当对这个序列进行访问 ...

C++编译期惯用法

本文整理了C++的一些编译期的惯用法,主要是一些模板类与模板函数的应用,本文的模板技术分析从模板支持的语法基础、惯用法、模板元编程初步等来展开。 泛型技术背景: 泛型:类模板,函数模板为多种类型设计。如:STL容器,算法 抽象:通过模板技术可以抽象成一般性,封装统一的方式。如:迭代器的规范化和iterator_traits的 ...

最大公约数问题

最大公约数问题是经典的数学问题,本文分析下最大公约数问题的计算优化思路。 分析: 1、求x,y的最大公约数,用辗转相除法 设k = x / y,b = x % y,则x = ky + b, 因此( x, y ) = ( ky +b, y ) = (y, b), 因此( x, y ) = ( y, x % y ),并且( 0, x) = x。 关键就是将两个较大的数的公约数转化为两个较小数的公约数。 int gcd( int x, int y ) { return (y==0) ? x : gcd( y, ...

分解正整数和问题

整理分析了将一个正整数分解成特定的整数和的问题。 把整数N转化成k个严格递增正整数整数序列n1, n2, …, nk的和,请问有多少种情况? 设函数 f( n, m )表示n的递增序列和式中最大值小于等于m的数量。那么,如果n分解的最大值为m,则有f( n-m, m-1 )种;最大值小于m,则有f(n, m-1)种。 则有: 若n > m:f(n, m) = f( n-m, m-1 ) + f( n, m-1 ) ...

boost解析之 lexical_cast

最主要的功能是使得对象间的转化更直接明白,底层是基于字符串流来实现: 提供常见类型之间的转换(如整型int, int64与字符串string,wstring间转换等等) 该库底层使用stringstream来实现并且可以很方便的扩展到自己定义的类型。 例如: #include "json_spirit.h" #include <iostream>#include <string>using namespace std; #include <boost/lexical_cast.hpp> struct Item { Item() : val(0) {} string str; int val; string name; }; ostream& operator << ( ostream & os, Item const& item ) { ...

Ternary Search Tree 三元状态树

基于三元状态树( Ternary Search Trees )实现的tst_map,结合二叉树的空间效率和digital tries的时间效率,是非常有效的基于字符串作为key的关联容器。 三元状态树是特殊的trie树,每个节点存储一个字符,并且最多可有3个子节点。 源码: https://github.com/suninf/tst_map/blob/master/tst_map.h wiki: http://en.wikipedia.org/wiki/Ternary_search_tree 论文(实现原理): http://www.drdobbs.com/database/ternary-search-trees/184410528 ...