【C++】探索C++模板编程

文章目录

  • 什么是C++模板?
  • 模板的基本语法
  • 类型模板参数
  • 模板函数的示例
  • 类模板的示例
  • 总结

C++模板是一种强大的编程工具,它可以实现泛型编程,使代码更加灵活和可重用。本篇博客将介绍C++模板的基本语法、类型模板参数和模板函数的使用,并通过示例代码演示模板在实际开发中的应用。

什么是C++模板?

C++模板是一种通用的代码蓝图,允许根据不同类型的参数生成特定的函数或类。模板可以在编译时进行类型安全检查,并在运行时生成对应的代码,提高代码的复用性和性能。

模板的基本语法

在C++中,我们可以使用template关键字来定义模板。模板可以包含类型参数和非类型参数,用于接收不同的参数类型和值。下面是一个使用模板的基本语法:

template <typename T>
// 或者
template <class T>

// 使用模板定义函数
void print(T value) {
    // 函数体
}

// 使用模板定义类
template <typename T>
class MyTemplateClass {
    // 类定义
};

类型模板参数

类型模板参数允许我们以泛型的方式接受不同类型的参数。例如,我们可以定义一个模板函数来比较两个数的大小:

template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

在上面的代码中,typename T表示我们将接受一个类型为T的参数。模板函数max可以接受不同类型的参数(如int、float、double等),并返回较大的值。

模板函数的示例

下面是一个使用模板函数的示例,计算数组的平均值:

template <typename T, int size>
T average(T arr[]) {
    T sum = 0;
    for (int i = 0; i < size; i++) {
        sum += arr[i];
    }
    return sum / size;
}

int main() {
    int intArr[] = {1, 2, 3, 4, 5};
    double doubleArr[] = {1.5, 2.5, 3.5, 4.5, 5.5};

    int intAvg = average<int, 5>(intArr);
    double doubleAvg = average<double, 5>(doubleArr);

    // 输出结果
    cout << "Int average: " << intAvg << endl;
    cout << "Double average: " << doubleAvg << endl;

    return 0;
}

在这里插入图片描述
在上面的代码中,我们定义了一个模板函数average,它接受一个类型为T的数组和一个非类型参数size,用于指定数组的大小。在main函数中,我们分别传递了一个int类型的数组和一个double类型的数组,并调用了average函数来计算它们的平均值。

类模板的示例

当涉及到类模板时,我们可以将模板应用于整个类定义,以便在不同类型的参数下生成具体的类。以下是一个示例,演示了如何使用类模板创建一个通用的栈(stack)类:

template <typename T>
class Stack {
private:
    T* data; // 存储数据的数组
    int size; // 栈的大小
    int top; // 栈顶位置

public:
    Stack(int s) : size(s), top(-1) {
        data = new T[size]; // 动态分配内存
    }

    ~Stack() {
        delete[] data; // 释放内存
    }

    void push(T value) {
        if (top == size - 1) {
            cout << "Stack is full." << endl;
        } else {
            data[++top] = value;
        }
    }

    T pop() {
        if (top == -1) {
            cout << "Stack is empty." << endl;
            return T(); // 返回默认值
        } else {
            return data[top--];
        }
    }
};

在上述示例中,我们定义了一个名为Stack的类模板,它接受一个类型参数T。类模板有一个私有数据成员data,用于存储栈中的元素;还有三个私有成员变量size、top,分别表示栈的大小和栈顶的位置。公共成员函数pushpop用于向栈中添加元素和移除元素。

通过使用类模板,我们可以在不同的类型参数下创建具体的栈对象。以下是一个示例,展示了如何使用Stack类模板创建整数栈和浮点数栈:

int main() {
    Stack<int> intStack(5); // 创建一个整数栈,大小为5
    Stack<float> floatStack(3); // 创建一个浮点数栈,大小为3

    intStack.push(1);
    intStack.push(2);
    intStack.push(3);

    floatStack.push(1.5);
    floatStack.push(2.5);

    cout << "Popped value from intStack: " << intStack.pop() << endl;
    cout << "Popped value from floatStack: " << floatStack.pop() << endl;

    return 0;
}

在上述示例中,我们创建了一个int类型的栈和一个float类型的栈。然后,我们分别向两个栈中压入一些元素,并从栈顶弹出一个元素。通过类模板,我们可以方便地创建不同类型的栈,并在编译时进行类型安全检查。

总结

C++模板是一种强大的编程工具,可以实现泛型编程,提高代码的灵活性和复用性。通过使用模板,我们可以根据不同类型的参数生成特定的函数或类。本文介绍了C++模板的基本语法、类型模板参数和模板函数的示例,并展示了模板在实际开发中的应用。合理利用C++模板可以简化代码编写并提高程序的性能和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第20章:多线程

20.1 线程简介 在Java中&#xff0c;并发机制非常重要&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每个线程完成一个功能&#xff0c;并与其他线程并发执行&#xff0c;这种机制被称为多线程。但是&#xff0c;并不是所有编程语言都支持多线程。 线程的特点&#…

集群 CPU 利用率均值达 45% ,揭秘小红书规模化混部技术实践

根据 Gartner 预测数据显示&#xff1a;2024 年全球 IT 支出预计将达到 5.1 万亿美元&#xff0c;比 2023 年增长 8 %。然而&#xff0c;该机构的另一项调查数据显示&#xff1a;全球数据中心服务器平均 CPU 利用率普遍低于 20%&#xff0c;存在巨大的资源浪费。据测算&#xf…

Python内置函数与标准库函数的解释示例

一、内置函数与标准库函数的区分 Python 解释器自带的函数叫做内置函数&#xff0c;这些函数可以直接使用&#xff0c;不需要导入某个模块。 Python 解释器也是一个程序&#xff0c;它给用户提供了一些常用功能&#xff0c;并给它们起了独一无二的名字&#xff0c;这些常用功能…

C语言——标识符

一、标识符是什么 标识符是C程序的最基本组成部分&#xff0c;例如&#xff1a;变量名称、函数名称、数据类型等等&#xff0c;都是一个标识符。标识符的要求是&#xff1a;必须由字母&#xff08;区分大小写&#xff09;、数字、下划线组成。而且&#xff0c;标识符的第一个字…

Django回顾【一】

一、Web应用程序 Web应用程序是一种可以通过Web访问的应用程序&#xff0c;程序的最大好处是用户很容易访问应用程序&#xff0c;用户只需要有浏览器即可&#xff0c;不需要再安装其他软件。应用程序有两种模式C/S、B/S。 C/S&#xff1a;客户端<----->服务端 例如My…

共筑关基安全防线,开源网安加入中关村华安关键信息基础设施安全保护联盟

近日&#xff0c;开源网安正式加入“中关村华安关键信息基础设施安全保护联盟”&#xff08;以下简称&#xff1a;关保联盟&#xff09;成为会员单位&#xff0c;进一步加强与行业内重要机构、企业的协同合作&#xff0c;推动关键信息基础设施安全保护领域的生态建设。 未来&am…

9.Spring 整合 Redis

引入依赖&#xff1a;spring-boot-starter-data-redis配置 Redis&#xff1a;配置数据库参数、编写配置类&#xff0c;构造 RedisTemplate访问 Redis&#xff1a; redisTemplate.opsForValue() redisTemplate.opsForHash() redisTemplate.opsForList() redisTemplate.opsForSe…

Codebeamer—软件全生命周期管理轻量级平台

产品概述 Codebeamer涵盖了软件研发的生命周期&#xff0c;在一个整合的平台内支持需求管理、测试管理、软件开发过程管理以及项目管理等&#xff0c;同时具有IToperations&DevOps相关的内容&#xff0c;并支持变体管理的功能。对于使用集成的应用程序生命周期管理&#xf…

LVS-DR实验

实验前准备 DR服务器&#xff1a;192.168.188.11 192.168.188.15 NFS服务器&#xff1a;192.168.188.14 Web服务器1&#xff1a;192.168.188.12 Web服务器2&#xff1a;192.168.188.13 Vip&#xff1a;192.168.188.188 客户端&#xff1a;192.168.188.200 配置负载均衡调度…

Stable Video Diffusion重磅发布:基于稳定扩散模型的AI生成视频

最近&#xff0c;stability.ai发布了稳定视频扩散&#xff0c;这是stability.ai第一个基于图像模型稳定扩散的生成视频基础模型。现在可以在研究预览中看到&#xff0c;这个最先进的生成人工智能视频模型代表着stability.ai在为每种类型的人创建模型的过程中迈出了重要的一步。…

C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解

这个示例创建了一个主窗口&#xff0c;其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框&#xff0c;第二个按钮点击时会执行一个特定的操作&#xff08;在这个例子中&#xff0c;仅打印一条调试信息&#xff09;。 功能描述&#xff1a; 创建窗口和布局&#xff1a;…

linux 内核线程

内核线程类似于用户进程&#xff0c;通常用于并发处理些工作&#xff0c;它是一种在内核空间实现后台任务的方式&#xff0c;并且可以参与时间片轮转调度。 内核线程可以进行繁忙的异步事件处理&#xff0c;也可以睡眠等待某事件的发生&#xff0c;内核线程可以访问内核函数和…

名词解释之EID和SR

大家在聊辅助驾驶时&#xff0c;经常会发现有名词叫SR&#xff0c;或者EID&#xff0c;理想的环境感知界面叫EID&#xff0c;而其他很多车型里大家管那个界面叫SR。我们下面具体看下这两个词具体指什么。 SR是“Situational Awareness”的缩写,意思是环境感知或场景认知。 SR系…

【2023CANN训练营第二季】——Ascend C自定义算子工程介绍及实验

一、自定义算子工程介绍与创建 自定义算子工程是一个包含用户编写的host侧和kerne|侧算子实现文件的&#xff0c;用于编译和安装自定义算子run包的工程框架。 CANN软件包中提供了工程创建工具msopgen&#xff0c;开发者可以输入算子原型定义文件生成Ascend C算子开发工程。 需…

每日一题--寻找重复数

蝶恋花-王国维 阅尽天涯离别苦&#xff0c; 不道归来&#xff0c;零落花如许。 花底相看无一语&#xff0c;绿窗春与天俱莫。 待把相思灯下诉&#xff0c; 一缕新欢&#xff0c;旧恨千千缕。 最是人间留不住&#xff0c;朱颜辞镜花辞树。 目录 题目描述&#xff1a; 思路分析…

JVM运行时数据区域、对象内存分配、内存溢出异常总结

深入理解java虚拟机第二章 二、运行时数据区域2.2.1 程序计数器2.2.2 Java虚拟机栈2.2.3 本地方法栈2.2.4 Java堆2.2.5 方法区2.2.6 运行时常量池2.2.7 直接内存 三、HotSpot虚拟机对象解密2.3.1 对象的创建对象如何分配内存&#xff1f;对象的创建如何处理并发问题&#xff1f…

浏览器触发下载Excel文件-Java实现

目录 1:引入maven 2:代码实现 3.导出通讯录信息到Excel文件 4.生成并下载Excel文件部分解释 1:引入maven 添加依赖:首先,在你的项目中添加EasyExcel库的依赖。你可以在项目的构建文件(如Maven的pom.xml)中添加以下依赖项:<dependency><groupId>com.alib…

vue3 setup语法糖,常用的几个:defineProps、defineEmits、defineExpose、

vue3和vue2组件之间传参的不同 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。 <script setup> 中的代码会在每次组件实例被创建的时候执行。 任何在 <script setup> 声明的顶层的绑定 (包括变量&#xff0c;函数声明&#xff0…

Spring中的循环依赖问题

目录 1、什么是Spring的循环依赖&#xff1f; 2、如何避免循环依赖问题&#xff1f; 3、Spring的三级缓存 小结 1、什么是Spring的循环依赖&#xff1f; Spring框架中的循环依赖问题是指两个或多个bean之间相互依赖&#xff0c;形成闭环&#xff0c;导致无法完成实例化的问…

儿童绘本故事:鱼小乐的海洋奇幻之旅

《鱼小乐的海洋奇幻之旅》Chapter 1: 美好的计划一个晴朗的日子&#xff0c;鱼小乐和她的同学们聚在一起&#xff0c;兴奋地计划着一场奇妙的冒险。他们决定一起前往珠海海洋王国&#xff0c;展开一场海洋奇幻之旅。On a sunny day, Fishy Joy and her classmates gathered tog…