C++ 嵌套和递归使用模板类

在C++11之前,嵌套使用模板类的时候,> >之间要加空格。


#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。template <class DataType>
class Stack       // 栈类
{
private:DataType* items;               // 栈数组。int   stacksize;         // 栈实际的大小。int   top;                  // 栈顶指针。
public:// 构造函数:1)分配栈数组内存;2)把栈顶指针初始化为0。Stack(int size = 3) :stacksize(size), top(0) {items = new DataType[stacksize];}~Stack() {delete[] items; items = nullptr;}Stack& operator=(const Stack& v)   // 重载赋值运算符函数,实现深拷贝。{delete[] items;         // 释放原内存。stacksize = v.stacksize;     // 栈实际的大小。items = new DataType[stacksize];   // 重新分配数组。for (int ii = 0; ii < stacksize; ii++) items[ii] = v.items[ii];    // 复制数组中的元素。top = v.top;     // 栈顶指针。return *this;}bool isempty() const {            // 判断栈是否为空。return top == 0;}bool isfull() const {                 // 判断栈是否已满。return top == stacksize;}bool push(const DataType& item) {   // 元素入栈。if (top < stacksize) { items[top++] = item; return true; }return false;}bool pop(DataType& item) {               // 元素出栈。if (top > 0) { item = items[--top]; return true; }return false;}
};template <class T>
class Vector           // 动态数组。
{
private:int len;               // 数组元素的个数。T* items;           // 数组元素。
public:// 默认构造函数,分配内存。Vector(int size = 2) :len(size) {items = new T[len];}~Vector() {         // 析构函数delete[] items; items = nullptr;}Vector& operator=(const Vector& v)   // 重载赋值运算符函数,实现深拷贝。{delete[] items;           // 释放原内存。len = v.len;                // 数组实际的大小。items = new T[len];  // 重新分配数组。for (int ii = 0; ii < len; ii++) items[ii] = v.items[ii];    // 复制数组中的元素。return *this;}void resize(int size) {         // 护展数组的内存空间。if (size <= len) return;   // 只能往更大扩展。T* tmp = new T[size];   // 分配更大的内存空间。for (int ii = 0; ii < len; ii++) tmp[ii] = items[ii];     // 把原来数组中的元素复制到新数组。delete[] items;    // 释放原来的数组。items = tmp;      // 让数组指针指向新数组。len = size;           // 扩展后的数组长度。}int size() const { return len; }     // 获取数组长度。T& operator[](int ii) {   // 重载操作符[],可以修改数组中的元素。if (ii >= len) resize(ii + 1);    // 扩展数组。return items[ii];}const T& operator[](int ii) const { return items[ii]; }  // 重载操作符[],不能修改数组中的元素。
};int main()
{// Vector容器的大小缺省值是2,Stack容器的大小缺省值是3。// 创建Vector容器,容器中的元素用Stack<string>。Vector<Stack<string>> vs;         // C++11之前,>>之间要加空格。// 手工的往容器中插入数据。vs[0].push("西施1"); vs[0].push("西施2"); vs[0].push("西施3");        // vs容器中的第0个栈。vs[1].push("西瓜1"); vs[1].push("西瓜2"); vs[1].push("西瓜3");        // vs容器中的第1个栈。vs[2].push("冰冰");   vs[2].push("幂幂");                                            // vs容器中的第2个栈。 // 用嵌套的循环,把vs容器中的数据显示出来。for (int ii = 0; ii < vs.size(); ii++)         // 遍历Vector容器。{while (vs[ii].isempty() == false)      // 遍历Stack容器。{string item; vs[ii].pop(item); cout << "item = " << item << endl;}}// 创建Stack容器,容器中的元素用Vector<string>。Stack<Vector<string>> sv;Vector<string> tmp;       // 栈的元素,临时Vector<string>容器。// 第一个入栈的元素。tmp[0] = "西施1"; tmp[1] = "西施2";  sv.push(tmp);// 第二个入栈的元素。tmp[0] = "西瓜1"; tmp[1] = "西瓜2";  sv.push(tmp);// 第三个入栈的元素。tmp[0] = "冰冰1"; tmp[1] = "冰冰2";   tmp[2] = "冰冰3";  tmp[3] = "冰冰4";  sv.push(tmp);// 用嵌套的循环,把sv容器中的数据显示出来。while (sv.isempty() == false){sv.pop(tmp);   // 出栈一个元素,放在临时容器中。for (int ii = 0; ii < tmp.size(); ii++)   // 遍历临时Vector<string>容器,显示容器中每个元素的值。cout << " vs[" << ii << "] = " << tmp[ii] << endl;}// 创建Vector容器,容器中的元素用Vector<string>。Vector<Vector<string>> vv;       // 递归使用模板类。vv[0][0] = "西施1"; vv[0][1] = "西施2";  vv[0][2] = "西施3";vv[1][0] = "西瓜1"; vv[1][1] = "西瓜2";vv[2][0] = "冰冰1"; vv[2][1] = "冰冰2";   vv[2][2] = "冰冰3";  vv[2][3] = "冰冰4";// 用嵌套的循环,把vv容器中的数据显示出来。for (int ii = 0; ii < vv.size(); ii++){for (int jj = 0; jj < vv[ii].size(); jj++)// cout << " vv[" << ii << "][" << jj << "] = " << vv[ii][jj] << endl;cout << vv[ii][jj] << " ";cout << endl;}
}

推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/3Zqhgt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scp和rsync

全量和增量 全量就是把所有文件一股脑的全部传输过去&#xff0c;也不管他一不一样&#xff0c;比如scp 增量就是在传输前先对比一下两边的文件一不一样&#xff0c;有一样的部分&#xff0c;哪一样的部分就不传输&#xff0c;只传输不一样的部分&#xff0c;和新增的部分 &…

android 通过gradle去除aar的重复资源图片

背景&#xff1a;项目中引入了aar包&#xff0c;结果导致资源出问题了&#xff0c;于是需要对下面aar包进行重复资源去除操作 操作具体如下&#xff1a; 目录&#xff1a;app/build.gradle 末尾配置 apply from: "${project.rootDir}/scripts/excludewidgetAar.gradle&qu…

【web】2、集成插件

1、element-plus 官网地址:设计 | Element Plus 安装 plus 及 icon 图标库 1.1 官网提供plus安装方法&#xff1a; 1.2 官网提供 icon 安装方法 1.3 安装 pnpm install element-plus element-plus/icons-vue main.ts全局安装element-plus,element-plus默认支持语言英语设…

《战神4》开发团队繁忙的一天

早晨&#xff1a;准备与规划 8:00 AM - 团队到达 《战神4》开发团队的成员们陆续到达位于加利福尼亚圣莫尼卡的Santa Monica Studio。每个人先整理自己的工作站&#xff0c;准备迎接一天的工作。大家彼此问候&#xff0c;分享昨天的灵感和想法。 8:30 AM - 早会 整个开发团队…

【TensorFlow深度学习】“自我监督学习框架解析:生成模型、对比学习与混合方法“

"自我监督学习框架解析&#xff1a;生成模型、对比学习与混合方法" 在人工智能的快速迭代中&#xff0c;自我监督学习&#xff08;Self-supervised Learning, SSL&#xff09;作为一股新兴力量&#xff0c;正逐步改变着深度学习的面貌。它通过巧妙利用数据内部结构作…

matlab编辑稀疏单位方阵

创建 10001000 稀疏单位方阵&#xff0c;并查看稀疏模式。 &#xff08;1&#xff09; I speye(1000); spy(I)&#xff08;2&#xff09; S speye(400,800); spy(S)此命令等同于 speye([400 800])。

Nginx中封装的数据结构

Nginx中封装的数据结构 Nginx中封装的数据结构整型ngx_str_t【字符串】ngx_list_t【链表】ngx_table_elt_t【key/value】ngx_buf_tngx_chain_t Nginx中封装的数据结构 整型 typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t;ngx_str_t【字符串】 typ…

qt6开发环境配置杂记

很多同学不重视环境配置问题&#xff0c;这是工程问题&#xff0c;实际工作中&#xff0c;如果不真正搞懂环境配置&#xff0c;后期可能会遇到各种坑。 QT是一套开发框架&#xff0c;最终要翻译成c去执行。总体而言&#xff0c;就是下面三张框图&#xff1a; &#xff08;工程…

Spring底层原理之bean的加载方式一 用XML方式声明bean 自定义bean及加载第三方bean 2024详解

目录 用XML方式声明bean 首先我们创建一个空的java工程 我们要导入一个spring的依赖 注意在maven工程里瞅一眼 我们创建一个业务层接口 还有四个实现类 我们最初的spingboot生命bean的方式是通过xml声明 我们在resources文件夹下创建一个配置文件 我们书写代码 首先初…

AI Agent:技术原理与未来趋势

在人工智能的快速发展中&#xff0c;AI Agent作为一项创新技术&#xff0c;正逐渐成为研究和应用的热点。AI Agent不仅仅是执行命令的程序&#xff0c;它们能够感知环境、做出决策并采取行动&#xff0c;展现出类似人类的群体协作能力。本文将探讨AI Agent的技术原理、开源框架…

使用vite官网和vue3官网分别都可以创建vue3项目

问: npm init vitelatest 和 npm create vuelatest创建的vue3项目有什么区别? 回答: npm init vitelatest 和 npm create vuelatest 分别是使用 Vite 和 Vue CLI 工具创建 Vue 项目的两种方式&#xff0c;它们之间有几个主要区别&#xff1a; 1. **构建工具&#xff1a;** …

【PYG】定义数据集报错AttributeError: can‘t set attribute

当你遇到 AttributeError: cant set attribute 错误时&#xff0c;通常是因为你试图在一个类的实例上设置一个属性&#xff0c;但该类不允许直接设置属性。在Python中&#xff0c;某些类&#xff0c;特别是那些继承自某些基类&#xff08;比如 torch.utils.data.Dataset&#x…

忍法:声音克隆之术

前言&#xff1a; 最近因为一直在给肚子里面的宝宝做故事胎教&#xff0c;每天&#xff08;其实是看自己心情抽空讲下故事&#xff09;都要给宝宝讲故事&#xff0c;心想反正宝宝也看不见我&#xff0c;只听我的声音&#xff0c;干脆偷个懒&#xff0c;克隆自己的声音&#xf…

Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程

方法一&#xff1a;PHP_diseval_extension禁用 Linux CentOS 禁用php的eval函数详细图文教程_centos php 禁用 eval-CSDN博客 这个方法make报错&#xff0c;懒得费时间处理&#xff0c;直接用第二种 方法二&#xff1a;suhosin禁用 不支持PHP8&#xff0c;官方只支持PHP7以下…

【电源专题】为什么带电量计芯片的电池MOS保护要放在高侧

在实际的电量计电池开发中,发现一个很奇怪的现象。传统电池保护IC往往都是将充电保护和放电保护的两个MOS管放在低侧的。如下所示是文章:【电源专题】读一读单节锂电池保护IC规格书 可以看到M1和M2两个MOS管是放在PB-(也就是电池的负端),我们叫做低端。 而BQ28Z610电…

Python爬虫背后技术详解

在互联网时代&#xff0c;信息量巨大&#xff0c;如何高效地获取和处理这些信息变得尤为重要。Python 爬虫作为一种自动化获取网页信息的技术&#xff0c;已成为许多程序员和数据分析师必备技能之一。本文将深入探讨 Python 爬虫背后的技术原理&#xff0c;并结合实际代码示例来…

股票回购(Stock repurchases)和派发股息(Dividend distributions)有什么相同点和不同点?

中文版 股票回购和派发股息是公司将利润返还给股东的两种主要方式&#xff0c;二者各有优缺点。下面是它们的相同之处和不同之处&#xff0c;并通过具体公司数据进行说明。 相同之处 股东回报&#xff1a;股票回购和派发股息都是公司向股东返还利润的一种方式。股东从中受益…

目标检测常用涨点方法:注意力机制小结(空间注意力、通道注意力、CBAM等)

1.通道注意力 通道注意力&#xff08;Channel Attention&#xff09;是在通道维度上对输入数据进行学习&#xff0c;再对不同的通道分配相应的权重表示重要性&#xff0c;从而达到“分配注意力”的效果。SENet&#xff08;Squeeze and Excitation networks) 是一个典型的使用通…

论基于架构的软件设计方法及应用(ABSD)

论基于架构的软件设计方法及应用&#xff08;ABSD&#xff09; 一、引言 随着信息技术的快速发展&#xff0c;软件系统的复杂性和规模性不断增加&#xff0c;传统的软件开发方法已难以满足现代软件项目的需求。基于架构的软件设计方法&#xff08;Architecture-Based Softwar…

Swift宏的实现

上篇介绍了Swift宏的定义与生声明&#xff0c;本篇主要看看是Swift宏的具体实现。结合Swift中Codable协议&#xff0c;封装一个工具让类或者结构体自动实现Codable协议&#xff0c;并且添加一些协议中没有的功能。 关于Codable协议 Codable很好&#xff0c;但是有一些缺陷&…