在开发过程中,尤其在使用容器的时候,虽然其会自动的管理内存,但是在开发的过程中最好限制其大小,所以这里会通过一个非类型的模板参数来进行控制;
这里通过一维数组来进行说明
示例
/*
* @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()
函数检查堆栈是否为空和已满。