【C++】手搓实现模板类

news2024/9/23 15:32:17

myTamplate.h

#ifndef MYTAMPLATE_H
#define MYTAMPLATE_H
#include <iostream>
using namespace std;

template<typename T>
class Node
{
    T *data;     //数据域
    int size; //指针域
    int len;//实际长度
public:
    //无参构造
    Node():size(10),len(0)
    {
        data = new T[size]();
    }
    //有参构造
    Node(T e);
    //析构函数
    ~Node()
    {
        delete []data;
    }
    //给容器适配器赋值
    Node &operator=(Node &other);
    //访问第一个元素
    T front_element();
    //二倍扩容
    void double_fold();
    //判断是否为空
    bool empty();
    //头插
    bool head_push(T e);
    //头删
    bool head_pop();
    //尾插
    bool tail_push(T e);
    //尾删
    bool tail_pop();
    //访问任意一个元素
    T at(int index);
    //返回实际大小
    int my_len();
    //返回开辟空间
    int my_size();
    //遍历
    void show();
};
//有参构造
template<typename T>
Node<T>::Node(T e) : size(10), len(1) {
    data = new T[size]();
    data[0] = e; // 初始化第一个元素
}

template<typename T>
//给容器适配器赋值
Node<T> &Node<T>::operator=(Node &other)
{
    if(this!=other)
    {
        delete []data;
        this->size = other.size;
        this->len = other.len;
        data = new T[size]();
        for(int i = 0;i<size;i++)
        {
            data[i] = other.data[i];
        }
    }
    return *this;
}
//访问第一个元素 Node<T>::front_element()
template<typename T>
T Node<T>::front_element()
{
    return data[0];
}
//判断是否为空
template<typename T>
bool Node<T>::empty()
{
    return len == 0;
}
//头插
template<typename T>
bool Node<T>::head_push(T e)
{
    len++;
    double_fold();
    //循环前移
    for(int i = len;i>0;i--)
    {
        data[i] = data[i-1];
    }
    data[0] = e;
    return true;
}
//头删
template<typename T>
bool Node<T>::head_pop()
{
    if(len<=0)
    {
        cout<<"没有数据"<<endl;
        return false;
    }else
    {
        for(int i=0;i<len-1;i++)
        {
            data[i] = data[i+1];
        }
        //data[len-1]=NULL;//第len-1个置空
        len--;
        return true;
    }

}
//尾插
template<typename T>
bool Node<T>::tail_push(T e)
{
    len++;
    double_fold();
    data[len-1] = e;
    return true;
}
//尾删
template<typename T>
bool Node<T>::tail_pop()
{
    if(len<=0)
    {
        cout<<"没有数据"<<endl;
        return false;
    }else
    {
        //data[len-1]=NULL;
        len--;
        return true;
    }

}
//访问任意一个元素
template<typename T>
T Node<T>::at(int index)
{
    if(index<0 ||index>len)
    {
        cout<<"参数错误"<<endl;
        return 0;
    }
    else
    {
       return data[index-1];
    }

}
//返回实际大小
template<typename T>
int Node<T>::my_len()
{
    return len;
}
//返回开辟空间
template<typename T>
int Node<T>::my_size()
{
    return size;
}
//遍历
template<typename T>
void Node<T>::show()
{
    for(int i=0;i<len ;i++)
    {
        cout<<data[i]<<" ";
    }
    cout<<endl;
}

//二倍扩容
template<typename T>
void Node<T>::double_fold()
{
    if(len >=size)
    {
        T *temp = new T[size * 2]();
        for(int i = 0;i<size;i++)
        {
            temp[i] = data[i];
        }
        delete[] data;
        data = temp;
        size *= 2;
    }
}
#endif // MYTAMPLATE_H

main.cpp

#include "myTamplate.h"

int main() {
    Node<int> intNode(5); // 使用有参构造函数

    // 测试头插
    intNode.head_push(1);
    cout << "头插1后: ";
    intNode.show();

    // 测试头删
    intNode.head_pop();
    cout << "头删后: ";
    intNode.show();

    // 测试尾插
    intNode.tail_push(2);
    intNode.tail_push(3);
    intNode.tail_push(4);
    cout << "尾插2, 3, 4后: ";
    intNode.show();

    // 测试尾删
    intNode.tail_pop();
    cout << "尾删后: ";
    intNode.show();

    // 测试访问第一个元素
    cout << "第一个元素: " << intNode.front_element() << endl;

    // 测试判断是否为空
    cout << "是否为空: " << (intNode.empty() ? "是" : "否") << endl;

    // 测试访问任意一个元素
    cout << "索引1处的元素: " << intNode.at(1) << endl;

    // 测试返回实际大小
    cout << "实际大小: " << intNode.my_len() << endl;

    // 测试遍历
    cout << "遍历元素: ";
    intNode.show();
    cout<<"*******************下面是字符串类型******************"<<endl;
    // 创建一个字符串类型的Node容器
    Node<string> strNode("第一个"); // 使用有参构造函数

    // 测试头插
    strNode.head_push("第一个");
    cout << "头插 '第一个' 后: ";
    strNode.show();

    // 测试头删
    strNode.head_pop();
    cout << "头删后: ";
    strNode.show();

    // 测试尾插多个字符串
    strNode.tail_push("第二个");
    strNode.tail_push("第三个");
    strNode.tail_push("第四个");
    cout << "尾插 '第二个', '第三个', '第四个' 后: ";
    strNode.show();

    // 测试尾删
    strNode.tail_pop();
    cout << "尾删后: ";
    strNode.show();

    // 测试访问第一个元素
    cout << "第一个元素: " << strNode.front_element() << endl;

    // 测试判断是否为空
    cout << "是否为空: " << (strNode.empty() ? "是" : "否") << endl;

    // 测试访问任意一个元素
    cout << "索引1处的元素: " << strNode.at(1) << endl;

    // 测试返回实际大小
    cout << "实际大小: " << strNode.my_len() << endl;

    // 测试遍历
    cout << "遍历元素: ";
    strNode.show();

    return 0;
}

代码展示

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

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

相关文章

写的一致性问题之双写模式

文章目录 1、先写mysql&#xff1a;mysql会回滚&#xff0c;而redis不会回滚2、先写redis&#xff1a; 1、先写mysql&#xff1a;mysql会回滚&#xff0c;而redis不会回滚 写入msql成功&#xff0c;写入redis也成功&#xff0c;但是后续事务提交失败&#xff0c;mysql会回滚&a…

Django学习(一)

一、创建django项目 二、修改settings.py里的配置&#xff1a; 1、修改语言和时区&#xff1a; # 语言编码 LANGUAGE_CODE zh-hansTIME_ZONE UTCUSE_I18N True# 不用时区 USE_TZ False 2、配置数据库&#xff1a; DATABASES {default: {ENGINE: django.db.backends.m…

Python中的self有什么作用

你是否曾经好奇过,为什么Python类中的方法总是有一个神秘的self参数?为什么有时它似乎可有可无,有时却又不可或缺?今天,让我们一起深入探讨Python中self的奥秘,揭开面向对象编程的神秘面纱! 目录 引言:self的重要性self的本质:实例的引用为什么需要self?self的工作原理self的…

极米科技:走出舒适圈,推动数据架构现代化升级 | OceanBase 《DB大咖说》

《DB 大咖说》第 13 期&#xff0c;邀请到了极米科技软件与创新产品线高级架构师施刘凡来进行分享。 在小红书平台上&#xff0c;“是否应将家里的电视升级为投影仪&#xff1f;”这一话题激发了上百万篇笔记的分享与推荐&#xff0c;反映出年轻群体对投影仪的偏好。随着手机、…

Java MVC

1. MVC模式 1.1. JavaBean JavaBean&#xff1a;符合特定规范的Java类&#xff0c;是一种可重用的组件 特定规范&#xff1a; public, class, 提供无参数构造方法属性private提供public的getter和setter方法 功能分类&#xff1a; 封装数据&#xff1a;数据Bean&#xff0c…

【gtokentool】什么是数字货币?怎么使用?

一、什么是数字货币 数字货币是一种基于密码学原理&#xff0c;独立于传统银行体系运行的电子货币形式。数字货币具有以下特点&#xff1a; 去中心化&#xff1a;数字货币采用去中心化的交易验证方式&#xff0c;不依赖于任何中央机构或政府。安全性高&#xff1a;通过加密算法…

STM32G474之DAC

STM32G474分别使用CORDIC硬件和“math.h”的正弦值&#xff0c;从DAC1和DAC2输出。 1、DAC特点 PA4的附加功能为DAC1_OUT1&#xff0c;无需映射&#xff0c;直接将它配置为模拟功能&#xff0c;就可以使用了。 PA6的附加功能为DAC2_OUT1&#xff0c;无需映射&#xff0c;直接将…

数据结构-栈、队列-详解

数据结构-栈、队列-详解 1.前言2.栈2.1是什么2.2函数实现struct StackStackInitStackDestroyStackPushStackSizeStackEmptyStackTopStackPop 2.3小结 3.队列3.1是什么3.2函数实现struct QueueQueueInitQueueDestroyQueueEmptyQueuePushQueuePopQueueFrontQueueBackQueueSize 3.…

Verilog基础,原码,反码与补码的概念

Verilog模块初认识 1、Verilog模块(Module) Verilog中的module可以看成一个具有输入输出端口的黑盒子&#xff0c;该黑盒子有输入和输出接口(信号)&#xff0c;通过把输入在盒子中执行某些操作来实现某项功能。(类似于C语言中的函数) 图1 模块示意图 1.1 模块描述 图1 所示的…

【408DS算法题】035进阶-17年真题_二叉树转中缀表达式

Index 真题题目分析实现总结 真题题目 请设计一个算法&#xff0c;将给定的表达式树&#xff08;二叉树&#xff09;转换为等价的中缀表达式&#xff08;通过括号反映操作符的计算次序&#xff09;并输出。 例如&#xff0c; 当下列两棵表达式树作为算法的输入时&#xff0c; …

vivado 定义约束设置和文件

步骤2&#xff1a;定义约束集和文件 首先创建一个新的约束集&#xff0c;并向其中添加一个空的XDC约束文件 示例设计已经包含两个约束集&#xff0c;但您没有在本实验室中使用它们。 1.在“流导航器”中&#xff0c;单击“项目管理器”部分中的“添加源”。 2.从“添加源”对话…

【自考zt】【软件工程】【21.10】

关键字&#xff1a; 软件需求基本性质、软件系统需求挑战、耦合&#xff08;高内容&#xff0c;低无直接&#xff09;、内聚&#xff08;初始化时间&#xff09;、uml包、rup边界类、测试首要目标、单元测试最后工作、性能需求 软件开发本质、软件需求规约三种风格、提炼、用…

windows C++ 并行编程-并发和UWP(二)

下面例程用于演示在UWP中进行并发编程。 示例: 创建 C Windows 运行时组件并从 C# 中使用它 假设有一个使用 XAML 和 C# 的应用&#xff0c;可用它来定义 UI 和 C Windows 运行时组件以执行计算密集型操作。 在此示例中&#xff0c;C 组件会计算给定范围中的哪些数字是质数。…

Sqoop 数据迁移

Sqoop 数据迁移 一、Sqoop 概述二、Sqoop 优势三、Sqoop 的架构与工作机制四、Sqoop Import 流程五、Sqoop Export 流程六、Sqoop 安装部署6.1 下载解压6.2 修改 Sqoop 配置文件6.3 配置 Sqoop 环境变量6.4 添加 MySQL 驱动包6.5 测试运行 Sqoop6.5.1 查看Sqoop命令语法6.5.2 测…

Maven与Gradle差异

作为Java 开发者&#xff0c;你平时用 Maven 还是 Gradle&#xff1f; 我一直用的都是 Maven&#xff0c;但是前几天做了一个小项目&#xff0c;用的是 Gradle&#xff0c;因工作需要就去了解了Gradle的相关信息。 直到看到 Spring 和 Spring Boot 都从 Maven 切换到 Gradle了…

鸿蒙界面开发——组件(4):图标小符号 (SymbolGlyph/SymbolSpan) 气泡提示Popup

SymbolGlyph 创建图标 SymbolGlyph通过引用Resource资源来创建&#xff0c;资源引用类型可以通过$r创建Resource类型对象。不支持子组件。 SymbolGlyph(value?: Resource)SymbolGlyph($r(sys.symbol.ohos_folder_badge_plus)).fontSize(96).renderingStrategy(SymbolRenderi…

【GD32】---- 使用GD32调试串口并实现printf打印输出

1 复制工程模板 直接复制工程模板里的系统文件和固件库文件到新的工程文件01_USART_Printf 2 新建keil工程 参考上一篇博文&#xff1a;【GD32】---- 移植工程模板及点灯测试 3 编写代码 3.1 创建USART文件 创建一个USART.c文件&#xff0c;放于05_UserDriver文件夹中 …

macOS安装Maven

安装Java Java Downloads | Oracle 官网下载默认说最新的Java22版本&#xff0c;注意这里我们要下载的是Java8&#xff0c;对应的JDK1.8 需要登陆Oracle&#xff0c;没有账号的可以百度下。账号:908344069qq.com 密码:Java_2024 Java8 jdk1.8配置环境变量 open -e ~/.bash_p…

关于edge浏览器登陆CSDN安全验证不跳出验证码

前言 也就是最近这几天才出现这个问题&#xff0c;以前用edge浏览器登陆csdn时即使需要安全验证也能正常弹出验证码&#xff0c;现在根本没反应。 正文 我用edge浏览器登陆时&#xff0c;显示如下界面&#xff0c;就卡住不动了。 起初我以为是我浏览器可能设置了拦截的问题…

数据分析利器:Java与MySQL构建强大的数据挖掘系统

数据分析在当今信息时代具有重要的作用&#xff0c;它可以帮助企业和组织深入理解数据&#xff0c;发现隐藏在数据中的模式和规律&#xff0c;并基于这些洞察进行决策和优化。Java与MySQL作为两个强大的工具&#xff0c;结合起来可以构建出一个高效、可靠且功能丰富的数据挖掘系…