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