C++用模板求解开方(你不得不知道的模板带给我们的运行效率)

#include <iostream>
using namespace std;
template<int N,int low=0,int high=N>
class Sqrt
{
    public:
    enum{mid=(low+high+1)/2};
    enum{result = (mid*mid>N) ? Sqrt<N,low,mid-1> :: result : Sqrt<N,mid,high> :: result};
};
template<int N,int M>
class Sqrt<N,M,M>
{
    public:
    enum{result=M};
};

int main()
{
    cout<<Sqrt<16>::result<<endl;
    return 0;
}
//这个方法虽然可以求开平方,但是?:这个表达式
//会将每一个步骤的结果都逐步进行下去,无疑会
//在编译阶段造成大量空间浪费,于是有了下面这种
//方法进行选择。

//^_^,模板很强大.
#include <iostream>
using namespace std;

//根据第一个参数的类型选择第二个参数或者第三个参数.
template<bool select,typename Ta,typename Tb>
class IsElseTrue{
};
template<typename Ta,typename Tb>
class IsElseTrue<true,Ta,Tb>//模板特化
{
    public:
    typedef Ta ResultT;
};
template<typename Ta,typename Tb>
class IsElseTrue<false,Ta,Tb>//模板特化
{
    public:
    typedef Tb ResultT;
};

template<int N,int low=0,int high=N>
class Sqrt
{
    public:
    enum{mid=(low+high+1)/2};
    typedef typename IsElseTrue<(mid*mid>N),Sqrt<N,low,mid-1>,Sqrt<N,mid,high> > :: ResultT ReBt;
    //这里就会选择正确的方向进行开方,正真的实现了二分的效果.
    enum{result=ReBt::result};
};

template<int N,int S>
class Sqrt<N,S,S>
{
    public:
    enum{result=S};//结束时S就是所求的结果。
};
int main()
{
    cout<<Sqrt<16>::result<<endl;
    return 0;
}

//模板递归式求解开方。
#include <iostream>
using namespace std;

template<int N,int X=0>
class Sqrt
{
    public:
    enum{result=(X*X<N)?(Sqrt<N,X+1>::result):(X)};
};
template<int N>
class Sqrt<N,N>
{
    public:
    enum{result=N};
};

int main()
{
    cout<<Sqrt<225>::result<<endl;
    return 0;
}
//看起来好像我们在第二步X+1=2时就已经结束递归了,实际上
//?:运算符会对两个分支都进行实列化,于是它又会多余的进行
//一些递归,于是我们这里可以使用选择性模板类解决,代码如
//下面

#include <iostream>
using namespace std;

template<int N>
class Value
{
    public:
    enum{result=N};
};

template<bool select,typename Ta,typename Tb>
class IsElseTrue{};
template<typename Ta,typename Tb>
class IsElseTrue<true,Ta,Tb>
{
    public:
    typedef Ta ResultT;
};
template<typename Ta,typename Tb>
class IsElseTrue<false,Ta,Tb>
{
    public:
    typedef Tb ResultT;
};

template<int N,int X=0>
class Sqrt
{
    public:
    typedef typename IsElseTrue< (X*X<N) , Sqrt<N,X+1> , Value<X> > :: ResultT RT;
    enum{result=RT::result};
};
//这里我们选择了?:的分支,减少了编译时期的花费代价
//再次体现了模板的强大.
int main()
{
    cout<<Sqrt<16>::result<<endl;
    return 0;
}

时间: 2024-10-29 04:03:19

C++用模板求解开方(你不得不知道的模板带给我们的运行效率)的相关文章

网站细节优化,你不得不知道的事

你怎么做优化的?这句话问到许多人的时分他们都是一个回答."文章,外链",其实,搜索引擎优化真的并不是如此.下面天津搜索引擎优化小编举个简略的比方,就好比咱们买了个新房子,文章即是你房子中的家私,外链即是你需求来观赏的兄弟.你的家私多,而且异乎寻常,也即是说你的文章多,自创,当然可以很招引你需求到来的兄弟们的眼球.可是,如果你的房子地没扫,各种规划不合理,很有可能会给别人形成肮脏的印象.所以,做搜索引擎优化并不是只要文章还有外链,还需要你进行仔细的润饰,也即是咱们做的网站细节优化.下面我

你可能还不知道的ES6的事儿

ES6,或许应该叫 ES2015(2015 年 6 月正式发布),对于大多数前端同学都不陌生. 首先这篇文章不是工具书,不会去过多谈概念,而是想聊聊关于每个特性 你可能不知道的事,希望能为各位同学正确学习 ES6 ,提供一些指导. 对于 ES6,有些同学已经在项目中有过深入使用了,有些则刚刚开始认识他,但不论你是属于哪一类,相信这篇文章都有适合你的部分.针对文章中的问题或不同意见,欢迎随时拍砖.指正. 正文 Let + Const 这个大概是开始了解 ES6 后,我们第一个感觉自己完全明白并兴致

ES6 你可能不知道的事 – 基础篇

ES6 你可能不知道的事 – 基础篇 转载 作者:淘宝前端团队(FED)- 化辰 链接:taobaofed.org/blog/2016/07/22/es6-basics/ 序 ES6,或许应该叫 ES2015(2015 年 6 月正式发布),对于大多数前端同学都不陌生. 首先这篇文章不是工具书,不会去过多谈概念,而是想聊聊关于每个特性 你可能不知道的事,希望能为各位同学 正确使用 ES6,提供一些指导. 对于 ES6,有些同学已经在项目中有过深入使用了,有些则刚刚开始认识他,但不论你是属于哪一类

关于线性模型你可能还不知道的二三事(二、也谈民主)

目录 1 如何更新权值向量?2 最小均方法(LMS)与感知机:低效的民主3 最小二乘法:完美的民主4 支持向量机:现实的民主5 总结6 参考资料 1 如何更新权值向量? 在关于线性模型你可能还不知道的二三事(一.样本)中我已提到如何由线性模型产生样本,在此前提下,使用不同机器学习算法来解决回归问题的本质都是求解该线性模型的权值向量W.同时,我们常使用线性的方式来解决分类问题:求解分隔不同类别个体的超平面的法向量W.不论回归还是分类,都是求解向量W,而求解的核心思想也英雄所见略同:向量W倾向于指向

我以前不知道的 Session

之前只知道 Session 是服务器与客户端的一个会话,有默认过期时间,是服务器端的技术,与之对应的是 Cookie 技术,是客户端技术. 下面的几点是之前不知道的:[或者是忘了] 1 . Session是什么时候创建的? 2 . SessionId的组成? 3 . Session存储在哪里? 回答上面的问题: 1 .  在 Java中,Session是在调用 HttpServletRequest实例的 getSession()时创建的[不同语言会有不同时机的创建], 2 .  Session

“Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法

在win7系统下,Word2010出现了不能正常关闭.打开一个已有word文档,点击右上角关闭按钮后,先提示"word已停止工作,windows正在检查该问题的解决方案",随后提示"Microsoft word正试图恢复您的信息,这可能需要几分钟",最后提示"Microsoft Word已停止工作,出现了一个问题,导致程序停止正常工作.如果有可用的解决方案,Windows将关闭程序并通知您".之后,再重新打开word时,提示"Word自

你可能不知道的字符比较中的“秘密”

原文:你可能不知道的字符比较中的"秘密" 有时候,一个简单的字符比较,你可能也会被弄得晕头转向.为什么这样说呢?请看下面这个例子(代码就不贴了,因为后来发现页面不支持这两个字符的显示).猜测一下,会是什么结果?是1还是0? 回答这个问题之前,请再继续向下看.先创建几个不同排序规则的数据库(见数据库名可知). Figure-1: 在SQL_Latin1_General_CP1_CI_AS排序规则下的比较 Figure-2: 在Chinese_PRC_CI_AS排序规则下的比较 在SQL_

你所不知道的html5与html中的那些事(二)

文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作都可以达到真正的云方式呢?这一系列的问题你是否已经想明白了呢? 本系列文章将为您一一解答你所不知道的关于html5与html中的那些事;具体会包括如:html5新的理念与想法,html5的新标签的用意与具体开发中场景应用,html5与css3的感情经历(用法搭配),包括html5的父亲html的一些

你所不知道的html5与html中的那些事(一)

分类: Web开发 文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作都可以达到真正的云方式呢?这一系列的问题你是否已经想明白了呢? 本系列文章将为您一一解答你所不知道的关于html5与html中的那些事;具体会包括如:html5新的理念与想法,html5的新标签的用意与具体开发中场景应用,html5与css3的感情经历(用法搭配),包括html5