C++非类型的模板参数(四)

在开发过程中,尤其在使用容器的时候,虽然其会自动的管理内存,但是在开发的过程中最好限制其大小,所以这里会通过一个非类型的模板参数来进行控制;

这里通过一维数组来进行说明

示例

/*
 * @brief: class complates
 * @complie: g++ -g 4_specialization.cc -o d -std=c++11
 * @autor: your name
 * @date: 2023/08/22
 */

#include <iostream>
#include <vector>
#include <deque>
#include <stdexcept>
#include <string>

//非类型模板参数
template <class T, int MAX_SIZE>
class Stack 
{
private:
    T elems[MAX_SIZE];
    int num_elems;

public:
    Stack();   //构造函数
    void push(T const&);     //插入元素
    void pop();   //删除元素
    T top() const;   //获取栈顶元素
    bool empty() const   //判断是否为空
    {
        return num_elems == 0;
    }    
    int32_t getElemsSize() const   //获取元素的个数
    {
        std::cout<<"not string size"<<std::endl;
        return num_elems;
    }

    bool full() const   //判断元素是否已满
    {
        return num_elems == MAX_SIZE;
    }
};

template <typename T, int MAX_SIZE>
Stack<T, MAX_SIZE>::Stack() : num_elems(0){}

template <typename T, int MAX_SIZE>
void Stack<T, MAX_SIZE>::push(T const& elem)
{
    if(num_elems == MAX_SIZE)
    {
        throw std::out_of_range("stack is full!");   //在项目或者产品开发过程中,建议通过错误码的方式进行判断和处理
    }

    elems[num_elems] = elem;
    num_elems++;
}

template <typename T, int MAX_SIZE>
void Stack<T, MAX_SIZE>::pop()
{
    if(num_elems <= 0) 
    {
        throw std::out_of_range("empty stack");
    }
    num_elems--;
}

template <typename T, int MAX_SIZE>
T Stack<T, MAX_SIZE>::top() const
{
    if(num_elems <= 0) 
    {
        throw std::out_of_range("empty stack");
    }
    return elems[num_elems - 1];
}

int main(int argc, char* argv[])
{
    Stack<int, 10> int_stack;
    int_stack.push(2);
    int_stack.push(5);
    int_stack.push(9);

    std::cout<<"the top elems of int_stack is: "<<int_stack.top()<<std::endl;

    if(int_stack.empty())
    {
        std::cout<<"empty"<<std::endl;
    }
    else
    {
        std::cout<<"not empty"<<std::endl;
    }

    if(int_stack.full())
    {
        std::cout<<"full"<<std::endl;
    }
    else
    {
        std::cout<<"not full"<<std::endl;
    }    

    return 0;
}

输出

the top elems of int_stack is: 9
not empty
not full

这段代码演示了一个具有非类型模板参数的堆栈类(Stack),它接受一个类型参数T和一个整数非类型参数MAX_SIZE

在Stack类中,我们使用一个T类型的数组elems来存储堆栈的元素,数组大小由MAX_SIZE确定。num_elems变量表示堆栈中当前的元素数量。

Stack类提供了构造函数,push()函数用于插入元素,pop()函数用于删除元素,top()函数用于获取堆栈顶部的元素,empty()函数用于判断堆栈是否为空,full()函数用于判断堆栈是否已满。

main()函数中,我们实例化了一个具有最大大小为10的整数类型的Stack对象int_stack,并进行一些操作:使用push()函数插入三个元素,使用top()函数获取堆栈顶部的元素,并使用empty()full()函数检查堆栈是否为空和已满。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值