zoukankan      html  css  js  c++  java
  • 数组类模板

    • 模板参数可以是数值型参数(非类型参数)
    template <typename T,int N>
    void func()
    {
        //使用模板参数定义局部数组
        T a[n];
    }
    • 数值型模板参数的限制
    1. 变量不能作为模板参数
    2. 浮点数不能作为模板参数
    3. 类对象不能作为模板参数
    4. 本质:模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确认。
    • 有趣的题目:使用最高效的方法求1+2+3+4+...+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+4+....+100=" << Sum<100>::value << endl;
    }
    • 数组类模板范例程序
    mian.cpp
    #include <iostream>
    #include <string>
    #include "Array.h"
    using namespace std;
    int main()
    {
         Array<int, 5> array;
        for (int i =0;i<array.length();i++)
        {
            array.operator[](i)= i * i;
        }
        for (int i =0;i<array.length();i++)
        {
            cout << array[i] << endl;
        }
        return 0;
    }
    Array.h
    #ifndef _ARRAY_H_
    #define _ARRAY_H_
    template <typename T,int N>
    class Array
    {
            T m_value[N];
    public:
            int   length();
            bool get_value(int index,T& value) ;
            bool set_value(int index,T value);
            //这个地方需要注意:如果数组类对象要做左值,需要返回一个引用,因为函数调用不能做左值
            //例:  
            //Array<int, 5> array;
            //array.operator[](2)= 3;
            T&  operator [] (int index);
            T operator [] (int index) const;
            virtual ~Array();
    };
    template <typename T, int N>
    int Array<T,N>:: length()
    {
            return N;
    }
    template <typename T,int N>
    bool Array<T, N>::get_value(int index, T& value)
    {
            bool ret = (0 <= index) && (index <= N);
            if (ret)
            {
                   value = m_value[index];
            }
            return ret;
    }
    template <typename T, int N>
    bool Array<T, N>::set_value(int index, T value)
    {
            bool ret = (index >= 0) && (index < N);
            if (ret)
            {
                   m_value[index] = value;
            }
            return ret;
    }
    template <typename T, int N>
    T& Array<T, N>::operator[] (int index)
    {
            return m_value[index];
    }
    template <typename T, int N>
    T Array<T, N>::operator[] (int index) const
    {
            return m_value[index];
    }
    template <typename T, int N>
    Array<T, N>::~Array()
    {
    }
    #endif
    • 小结
    1. 模板参数可以是数值型参数
    2. 数值型参数必须在编译期间唯一确认
    3. 数组类模板是基于数值型模板实现的
    4. 数组类模板是简易的线性表数据结构
     
     
    主要记录的是学习听课的笔记
  • 相关阅读:
    转 linux下vi命令大全
    转 html5 canvas 详细使用教程
    怎么让手机网站自适应设备屏幕宽度? 转自百度经验
    转 :<meta http-equiv="X-UA-Compatible" content="IE=edge" /> 的说明
    转自haorooms :网页防止黑客跨框架攻击,及浏览器安全性想到的
    元信息标记<meta>
    Java语言的主要特性
    学习面向对象的三条主线之一 java类及类的成员
    1.5 MySQL信息源
    1.4在MySQL 8.0中添加,不建议使用或删除的服务器和状态变量及选项
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12283654.html
Copyright © 2011-2022 走看看