zoukankan      html  css  js  c++  java
  • 数组类模板(上)------一种高效的使用

    预备知识
    模板参数可以是数值型参数(非类型参数)
    template
    <typename T, int N>
    void func()
    {
      T a[N]; //使用模板参数定义局部数组
    }
    func<double, 10>();

    数值型模板参数的限制
    -变量不能作为模板参数(变量是不能在编译期就唯一确定的)
    -浮点数不能作为模板参数(浮点数在计算机内部的表示是不精确的)
    -类对象不能作为模板参数

    ........

    本质:
    模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确定

    #include <iostream>
    #include <string>
    
    
    using namespace std;
    
    template
    //<typename T, double N>   //将此处的int 修改为double编译出错,因为double不能作为数值型参数的类型
    <typename T ,int N>
    void func()
    {
        T a[N] = {0};
        for(int i=0; i<N; i++)
        {
            a[i] = i;
        }
    
        for(int i=0; i<N; i++)
        {
            cout << a[i] <<endl;
        }
    }
    
    int main()
    {
        func<int,10>();  //编译通过,正常运行
       // int a = 10;
      //  func<int ,a>() ; //编译出错,数值型参数你能是变量
    
    
        return 0;
    }

    有趣的面试题
    用你觉得最高效的方法求1+2+3+...+N的值

    数值型模板参数编程实验

    #include <iostream>
    #include <string>
    
    
    using namespace std;
    
    template
    <int N>
    class Sum
    {
    public:
        static const int VALUE = Sum<N-1>::VALUE + N;
    };
    
    //做一个特化
    template
    < >
    class Sum<1>
    {
    public:
        static const int VALUE = 1;
    };
    
    int main()
    {
       cout << "1+2+3+...+10" << "=" << Sum<10>::VALUE <<endl;  //在这里没有加减乘除法,也没有函数调用,也没有循环,这个地方的VALUE是一个常量,这个常量值在编译的时候就已经确定了。因此在这里仅仅是访问一个常量的值,
                                         //这个地方n为10,编译器就通过上面的类模板来推导VALUE的值,当计算到n为1时,就用下面的完全特化实现。相加求和是在编译程序的时候得到的,在程序运行时直接取得该值即可。
       //依赖的技术有:类模板技术、类模板的完全特化技术、数值型参数的模板技术
      cout
    << "1+2+3+...+100" << "=" << Sum<100>::VALUE <<endl; return 0; }
  • 相关阅读:
    20155226《网络攻防》 实验4 恶意代码分析
    20155226《网络攻防》 Exp3 免杀原理与实践
    20155226 Exp2 后门原理与实践
    20155226 《网络攻防》 Exp1 PC平台逆向破解(5)M
    2017-2018-1 20155226 《信息安全系统设计基础》课程总结
    《基于Arm实验箱的国密算法应用》课程设计 结题报告
    2015520吴思其 基于《Arm试验箱的国密算法应用》课程设计个人报告
    20155220 Exp9 Web安全基础实践
    20155220 《网络对抗》Exp 8 Web基础
    20155220 《网络对抗》实验七 网络欺诈防范
  • 原文地址:https://www.cnblogs.com/-glb/p/12000088.html
Copyright © 2011-2022 走看看