C++模板——数组类模板

本文参照于狄泰软件学院——《C++深度剖析课程》

问题:之前我们在类模板都是使用泛指类型的。但是当我们需要定义一个模板数组时,不仅仅需要定义数组的类型,还需要指定数组的大小。
而当我们在指定数组大小时,需要指定一个整形数。那么在模板中如何设定呢?

模板参数可以是数值型参数(非类型参数)

template
< typename T, int N >
void func()
{
  T a[N];          //使用模板参数定义局部数组
}
func<double, 10>();

数值型模板也有相应的限制。

  1. 变量不能作为模板参数
  2. 浮点数不能作为模板参数
  3. 类对象不能作为模板参数
  4. 。。。

本质:模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确定。
这跟数组的定义时一样的。数组的大小在编译阶段必须确定。所以并不能使用变量来指定数组的大小。而却数组的大小也不可能是浮点数。

示例代码:数组类模板

#ifndef _ARRAY_H_
#define _ARRAY_H_

template< typename T, int N >
class Array
{
    T m_array[N]
public:
    int length();
    bool set(int index, T value);
    bool get(int index, T& value);
    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>::set(int index, T value)
{
    bool ret = (0<=index) && (index<N);

    if( ret )
    {
        m_array[index] = value;
    }

    return ret;
}

template
< typename T, int N >
bool Array<T, N>::get(int index, T& value)
{
    bool ret = (0 <= index) && (index < N);

    if( ret )
    {
        value = m_array[index];
    }

    return ret;
}

template
< typename T, int N >
T& Array<T, N>::operator[] (int index)
{
    if( (0<=index) && (index<N) )
    {
        return m_array[index];
    }
    else
    {
        throw 0;
    }
}

template
< typename T, int N >
Array<T, N>::~Array()
{

}

#endif
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在这个问题中,用户提供了两段代码,分别是引用\[1\]和引用\[2\]。这两段代码都是用来在一个数组中查找指定数的位置。 引用\[1\]是一个C++代码示例,它使用了iostream和stdio.h头文件,并使用了命名空间std。代码中使用了一个while循环来不断读取输入的n值,然后创建一个大小为n的整型数组a,并通过for循环读取数组的元素。接下来,代码读取了一个整数m,并使用for循环遍历数组a,查找是否有与m相等的元素。如果找到了相等的元素,则将其位置赋值给变量t,并跳出循环。最后,根据t的值输出结果。 引用\[2\]是另一个C代码示例,它使用了stdio.h头文件。代码中同样使用了一个while循环来不断读取输入的n值,然后创建一个大小为n的整型数组a,并通过for循环读取数组的元素。接下来,代码读取了一个整数m,并使用for循环遍历数组a,查找是否有与m相等的元素。如果找到了相等的元素,则将其位置赋值给变量count,并将flag设置为1,表示找到了。最后,根据flag的值输出结果。 综上所述,这两段代码都是用来在一个数组中查找指定数的位置。它们的实现方式略有不同,但都能达到相同的目的。 #### 引用[.reference_title] - *1* [1143: 零起点学算法50——数组中查找数](https://blog.csdn.net/weixin_43965597/article/details/113104995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [问题 C: 零起点学算法82——数组中查找数](https://blog.csdn.net/chenhannan0024/article/details/127568844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值