42 CPP模板类的示例

230 篇文章 7 订阅
订阅专栏

 

#include "iostream"
using namespace std;
//模板类的实例-栈 简单实现
template <class T>
class Stack
{
private:
    T *m_items; //栈数组
    int m_size;
    int m_top;

public:
    Stack(int size) : m_size(size), m_top(0)
    {
        m_items = new T[m_size];
    }
    ~Stack()
    {
        delete[] m_items;
        m_items = nullptr;
    }
    bool isempty() const
    {
        return m_top == 0;
    }
    bool isfull() const
    {
        return m_top == m_size;
    }
    bool push(const T &item)
    {
        if (isfull())
        {
            return false;
        }
        m_items[m_top++] = item;
        return true;
    }
    bool pop(T &item)
    {
        if (isempty())
        {
            return false;
        }
        item = m_items[--m_top];
        return true;
    }
};
void test()
{
    Stack<string> s(4);
    //入栈
    s.push("a");
    s.push("b");
    s.push("c");
    s.push("d");
    s.push("e"); //这个入栈失败的
    //出栈
    string item;
    while (!s.isempty())
    {
        s.pop(item);
        cout << "item=" << item << endl;
    }
}
int main()
{
    test();
    return 0;
}
item=d
item=c
item=b
item=a

 

#include "iostream"
#include <cstring>
using namespace std;
// #define MAXLEN 10
//模板类的实例-数组 简单实现
// template <class T>
// template <class T, int len=10> //也可以用缺省值
template <class T, int len>
class Array
{
private:
    // T items[MAXLEN];
    T items[len];

public:
    Array()
    {
        memset(items, 0, sizeof(items));
    }
    ~Array() {}
    //重载操作符[],可以修改数组中的元素
    T &operator[](int index)
    {
        return items[index];
    }
    //重载操作符[],不可以修改数组中的元素
    const T &operator[](int index) const
    {
        return items[index];
    }
};
void test()
{
    /*     Array<int> a;
        a[0] = 1;
        a[1] = 2;
        a[2] = 3;
        a[3] = 4;
        a[4] = 5;
        for (int i = 0; i < 5; i++)
        {
            cout << a[i] << endl;
        } */

    /*  Array<string> a;
     a[0] = "啊";
     a[1] = "安大叔大婶抚";
     a[2] = "把";
     a[3] = "报错";
     a[4] = "二";
     for (int i = 0; i < 5; i++)
     {
         cout <<a[i] << endl;
     } */

    //不用宏,使用非通用类型的参数
    //如果用缺省值 template <class T, int len=10>
    // Array<string> a;
    Array<string, 3> a;
    a[0] = "啊";
    a[1] = "安大叔大婶抚";
    a[2] = "把";
    for (int i = 0; i < 5; i++)
    {
        cout << a[i] << endl;
    }
}
int main()
{
    test();
    return 0;
}

 

#include "iostream"
using namespace std;
//模板类的实例-数组 简单实现  变长数组
template <class T>
class Vector
{
private:
    int len;
    T *items;

public:
    Vector(int size = 10) : len(size)
    {
        items = new T[len];
    }
    ~Vector()
    {
        delete[] items;
    }
    void resize(int size)
    {
        if (size <= len)
        {
            return; //这里就规定只能往大的扩
        }
        T *tmp = new T[size];         //分配更大的内存空间
        for (int i = 0; i < len; i++) //把原来数组中的元素复制到新数组
        {
            tmp[i] = items[i];
        }
        delete[] items; //释放原来的数组
        items = tmp;    //让数组指针指向新数组
        len = size;
    }
    int size()
    {
        return len;
    }
    T &operator[](int index)
    {
        if (index >= len)
        {
            resize(index + 1); //这里会频繁扩展,暂不管,可以每次扩的多点.改成10或者20
        }

        return items[index];
    }
    const T &operator[](int index) const
    {
        return items[index];
    }
};
void test()
{
    Vector<string> v(1);
    v[0] = "啊";
    v[1] = "飞啊";
    v[2] = "啊改变";
    for (int i = 0; i < 3; i++)
    {
        cout << v[i] << endl;
    }

    Vector<int> v2(1);
    v2[0] = 1;
    v2[1] = 2;
    v2[2] = 3;
    for (int i = 0; i < 3; i++)
    {
        cout << v2[i] << endl;
    }
}
int main()
{
    test();
    return 0;
}
啊
飞啊
啊改变
1
2
3

下面代码有问题

//不打开注释,程序能正常运行,打开注释,程序报错

// vs[2].push("吧1");

// vs[2].push("吧2");

原因:

//错误原因,如果这里复制的是内置数据类型,亏,但是如果复制的是类,且类中使用了堆区内存,就存在浅拷贝的问题

#include "iostream"
using namespace std;

template <class T>
class Stack
{
private:
    T *items;
    int stacksize;
    int top;

public:
    Stack(int size = 3) : stacksize(size), top(0)
    {
        items = new T[stacksize];
    }
    ~Stack()
    {
        delete[] items;
        items = nullptr;
    }
    bool isempty() const { return top == 0; }
    bool isfull() const { return top == stacksize; }
    bool push(const T &item)
    {
        if (top < stacksize)
        {
            items[top++] = item;
            return true;
        }
        return false;
    }
    bool pop(T &item)
    {
        if (top > 0)
        {
            item = items[--top];
            return true;
        }
        return false;
    }
};

template <class T, int len = 10>
class Array
{
private:
    T item[len];

public:
    Array() {}
    ~Array() {}
    T &operator[](int index)
    {
        return item[index];
    }
    const T &operator[](int index) const
    {
        return item[index];
    }
};
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;
    }
    void resize(int size)
    {
        if (size <= len)
        {
            return;
        }
        T *tmp = new T[size];
        for (int i = 0; i < len; i++)
        {
            //错误原因,如果这里复制的是内置数据类型,亏,但是如果复制的是类,且类中使用了堆区内存,就存在浅拷贝的问题
            tmp[i] = items[i];
        }
        delete[] items;
        items = tmp;
    }
    int size() const
    {
        return len;
    }
    T &operator[](int index)
    {
        if (index >= len)
        {
            resize(index + 1);
        }
        return items[index];
    }
    const &operator[](int index) const
    {
        return items[index];
    }
};

void test()
{
    Vector<Stack<string>> vs;
    Stack<string> vs1[2];
    string vs2[2][3];

    vs[0].push("啊1");
    vs[0].push("啊2");
    vs[0].push("啊3");

    vs[1].push("哦1");
    vs[1].push("哦2");
    vs[1].push("哦3");

    //不打开注释,程序能正常运行,打开注释,程序报错
    // vs[2].push("吧1");
    // vs[2].push("吧2");

    for (int i = 0; i < vs.size(); i++)
    {
        while (!vs[i].isempty())
        {
            string item;
            vs[i].pop(item);
            cout << "item=" << item << endl;
        }
    }
}
int main()
{
    test();
    return 0;
}

Qt FlowLayout
一只程序员的博客
02-14 2077
之前项目需要,动态布局,根据窗体大小,上面的部件可以自动换行,之前都是用QGridLayout,突然发现Qt的例子中提供这个 头文件这样子的: class FlowLayout : public QLayout { public:     FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacin
CPP示例
02-09
总之,"CPP示例"压缩包中的"CPP-example-main"文件为我们提供了一个学习和研究C++编程实践的机会,涵盖了类、对象、模板、异常处理、STL、文件I/O以及现代C++特性等多个方面。通过对这个示例的深入理解和实践,可以...
CPP的简单例子
11-20
谭浩强的C++中的案例,对于C++学习者,这可能不是最好的选择,但是,也给需要的人分享下
c++泛型编程与模板-02类模板
Every moment of My life !!!
03-12 742
c++ 学习笔记
C++ 类模板示例
Hans的博客
03-01 1252
#include "stdafx.h" using namespace std; struct Student { int id; double gpa; }; template&lt;class T&gt; class Store { public: Store(); T &amp;getElem(); void putElem(const T &amp...
cpp模板总结
码农练功房的博客
02-24 2005
总结下c++模板相关的基础知识,便于查阅。 模板: 模板定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或者多个模板参数的列表,用小括号和大括号包围起来。 模板是个半成品,模板编译通过但是使用错误仍然会报错; 可以将模板看作是编译期函数; 运行期函数的参数要为一个对象(不能是模板);编译期函数的参数可以是模板; 声明: 模板声明必须包含模板参数: // 声明但是不定义compare和Blob template<typename T> int compare(cons
cpp学习代码-模板
Hry031012的博客
03-15 654
【代码】cpp学习代码-模板。
C++模板类
一步两步先生的博客
11-19 3529
理解编译器的编译模板过程 如何组织编写模板程序 前言 常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。 我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时...
C++类模板示例-栈
Crush_66的博客
05-14 887
C++类模板示例——栈
C++】泛型编程 ⑦ ( 类模板常用用法 | 类模板声明 | 类模板调用 | 类模板作为函数参数 )
让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 )
11-19 403
一、类模板基础用法 1、类模板声明定义 2、类模板使用 3、类模板做函数参数 二、完整代码示例 1、代码示例 2、执行结果
C++模板之——类模板详解及代码示例
weixin_46935110的博客
10-16 1509
C++模板之——类模板详解及代码示例
C++中的类模板详解及示例
09-04
C++中的类模板是一种强大的工具,它允许程序员创建可以处理多种数据类型的通用类。类模板的概念与函数模板相似,都是为了实现泛型编程,减少代码重复,并提高代码的可复用性。 首先,我们来看一下类模板的基本结构...
cpp代码-模板类有static关键字时
07-14
在`main.cpp`文件中,我们可以预期看到如何在模板类中使用`static`关键字的示例代码。通常,这种代码会展示如何初始化和使用这些静态成员,以及它们如何在不同模板实例间共享状态。`README.txt`文件可能会提供关于...
提示一个示例如何使用模板类
08-30
在编程领域,模板类C++中的一种特性,它允许我们创建可以处理多种数据类型的类或函数。模板类提供了一种泛型编程的方式,使得代码更加灵活和可复用。下面我们将深入探讨如何建立模板类,以及如何在模板类中使用...
Chain模板的定义.rar_模板类
09-21
通过阅读“www.pudn.com.txt”和“Chain模板的定义”这两个文件,您可以更详细地了解具体实现的细节,并根据示例代码进行实践,以加深对链表模板类的理解。在实际开发中,灵活运用模板类可以提高代码质量,减少重复...
模板类与模版函数
Allen Roson
11-12 1337
1.模板类与模版函数 1.1 模版类 template <类型参数表> class 类模板名{ 成员函数和成员变量 }; 类型参数表的写法如下: class类塑参数1, class类型参数2, ... 或者 typename类塑参数1, typename类型参数2, ... 示例: template <class T,class M&gt...
C++刷题】力扣-#121-买卖股票的最佳时机
会写代码的饭桶
10-16 561
给定一个数组 prices,其中 prices[i] 表示第 i 天的股票价格。假设你可以在第 i 天买入并在第 j 天卖出股票(i ≤ j),设计一个算法来计算你所能获取的最大利润。注意你只能持有一股股票,并且你不能同时参与多笔交易(即在再次买入前必须卖出股票)。
青少年编程能力等级测评CPA C++ 四级试卷(2)
最新发布
轻描时光
10-20 456
(3)编程过程中对于程序给定的部分不允许修改,考生仅允许在/****code****/提示行区间内作答。(3)编程过程中对于程序给定的部分不允许修改,考生仅允许在/****code****/提示行区间内作答。CP4_2_13.将A类的成员函数fun()声明为B类的友元函数,则以下叙述中,正确的是( )。编程过程中对于程序给定的部分不允许修改,考生仅允许在/****code****/提示行区间内作答。CP4_2_2.若有如下类A的定义,则下列有关类成员访问权限的叙述中,正确的是( )。
2023-06 GESP C++三级试卷
ya888g
10-17 920
位同学,每位同学有从 0 到?到达的同学都会报出的编号,不会报出别人的编号,但有的同 学很顽皮,会多次报出。10 如果 a 为 int 类型的变量,且表达式((a | 3) == 3)的值为 true,则说 明 a 在从 0 到 3 之间(可能为 0、可能为 3)3 已知大写字符’A’的 ASCII 编码的十六进制表示为 0x41,则字符’F’的 ASCII 编码的十六进制表示为( )12 如果 a 为 int 类型的变量,下列哪个表达式可以正确求出满足“小于等于 a且是 4 的倍数”的整数中最大的( )
c++模板类的代码示例
03-19
下面是一个简单的C++模板类的代码示例: ```cpp template class MyTemplateClass { private: T data; public: MyTemplateClass(T value) { data = value; } T getData() { return data; } void setData...
写文章

热门文章

  • 17 CPP面向对象编程 33533
  • Linux下的压缩解压缩命令详解 27333
  • keepalived的vip无法ping通排查过程 24613
  • 利用XShell上传、下载文件(使用sz与rz命令),超实用 17563
  • centos7安装keepalived记录最新版踩坑 13376

分类专栏

  • 大模型 17篇
  • 后端 75篇
  • 其它 27篇
  • 区块链 3篇
  • Nginx 24篇
  • 数据库 231篇
  • Golang 25篇
  • 开发工具 13篇
  • c++ 230篇
  • rpc 21篇
  • 存储 77篇
  • Java 19篇
  • RDMA 2篇
  • rust 44篇
  • webassembly 1篇
  • 设计模式 3篇
  • SPDK 8篇
  • Linux 222篇
  • PHP 64篇
  • Redis 39篇
  • Python 4篇
  • Docker 18篇
  • 前端 17篇

最新评论

  • graphrag-ui安装使用

    3333333_: 遇到过,忘记怎么解决了。可以尝试下1:设置环境变量PYTHONUTF8=1 。2:如果做了prompt优化,就把prompt还原。3:换个别的文本尝试下

  • graphrag-ui安装使用

    褴褛。: 博主您好,构建索引时总是编码报错怎么解决啊?UnicodeEncodeError: 'gbk' codec can't encode character '\U0001f680' in position 0: illegal multibyte sequence

  • graphrag-ui安装使用

    3333333_: 你就用这个提示里面的命令安装,报版本冲突,不用管,

  • graphrag-ui安装使用

    xuegaoxuegao: 私信你了

  • graphrag-ui安装使用

    xuegaoxuegao: 加个好友交流交流

大家在看

  • 基于nodejs+vue基于Web的景区疫情预警系统设计与实现[开题+源码+程序+论文]计算机毕业设计
  • 如何优化你的 vue-cli 项目?
  • 教育信息化的新动力:Spring Boot平台
  • 教学管理的智能化:Spring Boot平台设计
  • 配置pytorch的CPU环境:Anaconda+pytorch下载 234

最新文章

  • 搭建GraphRAG-Local-UI练习
  • graphrag-ui安装使用
  • Linux Ubuntu设置ollama保存模型的路径和设置监听端口
2024年18篇
2023年580篇
2022年239篇
2021年1篇
2020年125篇
2019年24篇
2018年22篇
2016年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家淮北个性化玻璃钢雕塑供应商汕头玻璃钢卡通雕塑生产黄山五一商场美陈上城区玻璃钢雕塑公司邯郸玻璃钢仿真水果雕塑郑州太湖石玻璃钢彩绘雕塑定做专业的商场美陈临夏玻璃钢雕塑公仔玻璃钢卡通雕塑规格绍兴园林玻璃钢雕塑定制汕头玻璃钢卡通雕塑加工厂家济南动物玻璃钢雕塑销售厂家滁州商场圣诞美陈涟源玻璃钢雕塑户外淮南玻璃钢雕塑商家玻璃钢雕塑定制湖南贵州主题公园玻璃钢卡通形象雕塑清远党建文化玻璃钢雕塑汕头玻璃钢景观雕塑厂家玻璃钢动物雕塑牛商场美陈卡通人物雕塑上饶玻璃钢雕塑销售电话吉林仿铜玻璃钢雕塑制作玻璃钢花盆尺寸结构设计合肥玻璃钢雕塑定做厂家玻璃钢艺术雕塑哪家有巢湖玻璃钢鹿雕塑制作通道商场美陈供货商武汉玻璃钢大象雕塑清远玻璃钢雕塑销售电话香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化