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

news/2024/11/8 22:36:00/

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

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

示例

/** @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()函数检查堆栈是否为空和已满。


http://www.ppmy.cn/news/1059824.html

相关文章

车联网技术介绍

上图是目前车联网架构图&#xff0c;基于“云-管-端”的车联网系统架构以支持车联网应用的实现&#xff0c; “云”是指 V2X 基础平台、高基于精度定位平台等基础能力&#xff0c;可实现车辆动态厘米级定位&#xff0c;这将满足现阶段以及未来车联网应用场景的定位精度需求。 “…

比特币是怎么回事?

比特币是怎么回事&#xff1f; 一句话描述就是&#xff0c;初始化几个比特币&#xff0c;申请成为矿工组织&#xff0c;发生交易时抢单记账成功可以比特币奖励&#xff0c;随着比特币数量的增加&#xff0c;奖励越来越少。怎么记账成功呢&#xff0c;通过交易信息幸运数字哈希…

RTSP流媒体服务器EasyNVR视频平台设备通道时间与服务器录像时间不一致的问题解决步骤

EasyNVR平台优秀的视频能力在于通过RTSP/ONVIF协议&#xff0c;将前端接入设备的音视频资源进行采集&#xff0c;并转码成适合全平台、全终端分发的视频流格式&#xff0c;包括RTMP、RTSP、FLV、HLS、WebRTC等格式。平台已经在智慧水利、智慧工厂、智慧校园、智慧仓储等场景中应…

Vue项目:项目初始化+项目配置+项目集成

目录 初始化项目 创建项目 下载node_modules 运行测试 项目启动&#xff0c;自动打开 项目配置 配置eslint 安装eslint 生成配置文件: .eslint.cjs 安装Vue3环境代码校验插件 修改 .eslint.cjs 配置文件 为eslint生成 .eslintignore 忽略文件 为eslint添加运行脚…

Linux系统安装(虚拟机安装;系统分区;Linux系统安装;远程登录管理工具)

文章目录 1. VMware虚拟机安装与使用2. 系统分区2.1 磁盘分区2.2 格式化2.3 硬件设备文件名2.4 分区设备文件名2.5 挂载2.6 文件系统结构2.7 总结 3. Linux系统安装4. 远程登录管理工具 1. VMware虚拟机安装与使用 VMware是一个虚拟PC的软件&#xff0c;可以在现有的操作系统上…

【sql】MongoDB 新增 高级用法

【sql】MongoDB 新增 高级用法 批量插入数据, 遇到错误跳过并继续执行 方案一 ordered:false 使用场景: 1: 数据存在时则跳过插入 //批量插入 db.res_phone.insertMany( [ {"_id":1, "phone":10086}, {"_id":2, "phon…

怎么看待格力董事长董明珠说:不想招只关心工资待遇的人?

董明珠是格力电器的董事长&#xff0c;她一向以直言不讳而闻名。最近&#xff0c;她在接受采访时再次引起了人们的关注。 董明珠表示&#xff0c;她不喜欢招聘那些只关心工资待遇的人。她认为&#xff0c;年轻人应该知道自己的能力和潜力&#xff0c;而不仅仅是对金钱的追求。…

企培版edusoho对接第三方云视频点播 最新版本代码披露 支持m3u8视频加密

edusoho企培系列版本更新日志&#xff1a;新增功能和优化历史 倍数播放功能、视频分类、支持m3u8视频加密 \plugins\AliVideoPlugin\DependencyInjection\Configuration.php <?php namespace AliVideoPlugin\DependencyInjection; use Symfony\Component\Config\Definiti…