C++ 模板

2023-11-03

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。

每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector <int> 或 vector <string>

您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。

函数模板

模板函数定义的一般形式如下所示:

template <class type> ret-type func-name(parameter list)
{
   // 函数的主体
}

在这里,type 是函数所使用的数据类型的占位符名称。这个名称可以在函数定义中使用。

下面是函数模板的实例,返回两个数中的最大值:

实例

#include <iostream>
#include <string>
 
using namespace std;
 
template <typename T>
inline T const& Max (T const& a, T const& b) 
{ 
    return a < b ? b:a; 
} 
int main ()
{
 
    int i = 39;
    int j = 20;
    cout << "Max(i, j): " << Max(i, j) << endl; 
 
    double f1 = 13.5; 
    double f2 = 20.7; 
    cout << "Max(f1, f2): " << Max(f1, f2) << endl; 
 
    string s1 = "Hello"; 
    string s2 = "World"; 
    cout << "Max(s1, s2): " << Max(s1, s2) << endl; 
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Max(i, j): 39
Max(f1, f2): 20.7
Max(s1, s2): World

类模板

正如我们定义函数模板一样,我们也可以定义类模板。泛型类声明的一般形式如下所示:

template <class type> class class-name {
.
.
.
}

在这里,type 是占位符类型名称,可以在类被实例化的时候进行指定。您可以使用一个逗号分隔的列表来定义多个泛型数据类型。

下面的实例定义了类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作:

实例

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>
 
using namespace std;
 
template <class T>
class Stack { 
  private: 
    vector<T> elems;     // 元素 
 
  public: 
    void push(T const&);  // 入栈
    void pop();               // 出栈
    T top() const;            // 返回栈顶元素
    bool empty() const{       // 如果为空则返回真。
        return elems.empty(); 
    } 
}; 
 
template <class T>
void Stack<T>::push (T const& elem) 
{ 
    // 追加传入元素的副本
    elems.push_back(elem);    
} 
 
template <class T>
void Stack<T>::pop () 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::pop(): empty stack"); 
    }
    // 删除最后一个元素
    elems.pop_back();         
} 
 
template <class T>
T Stack<T>::top () const 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::top(): empty stack"); 
    }
    // 返回最后一个元素的副本 
    return elems.back();      
} 
 
int main() 
{ 
    try { 
        Stack<int>         intStack;  // int 类型的栈 
        Stack<string> stringStack;    // string 类型的栈 
 
        // 操作 int 类型的栈 
        intStack.push(7); 
        cout << intStack.top() <<endl; 
 
        // 操作 string 类型的栈 
        stringStack.push("hello"); 
        cout << stringStack.top() << std::endl; 
        stringStack.pop(); 
        stringStack.pop(); 
    } 
    catch (exception const& ex) { 
        cerr << "Exception: " << ex.what() <<endl; 
        return -1;
    } 
}

当上面的代码被编译和执行时,它会产生下列结果:

7
hello
Exception: Stack<>::pop(): empty stack
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 模板 的相关文章

  • C++ 字符串

    C 提供了以下两种类型的字符串表示形式 C 风格字符串 C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言 并在 C 中继续得到支持 字符串实际上是使用 null 字符 0 终止的一维字符数组 因此 一个以
  • C++ 动态内存

    了解动态内存在 C 中是如何工作的是成为一名合格的 C 程序员必不可少的 C 程序中的内存分为两个部分 栈 在函数内部声明的所有变量都将占用栈内存 堆 这是程序中未使用的内存 在程序运行时可用于动态分配内存 很多时候 您无法提前预知需要多少
  • C++类结构规范定义

    后期私有类肯定还会有很多 为了自己和读者方便阅读 在后面的设计中将严格按照制定格式来定义类的变量和函数 pragma once class CClassxxx public CClassBase DECLARE DYNAMIC CClass
  • C++ 数组

    C 支持数组数据结构 它可以存储一个固定大小的相同类型元素的顺序集合 数组是用来存储一系列数据 但它往往被认为是一系列相同类型的变量 数组的声明并不是声明一个个单独的变量 比如 number0 number1 number99 而是声明一个
  • GPAC MP4文件写入(支持H264、H265)

    1 GPAC模块下载链接https github com gpac gpac或https gpac wp imt fr downloads 2 编译指导https github com gpac gpac wiki Build Introd
  • C++ 正则表达式regex(一)

    匹配字符串的基本规则 1 匹配固定的字符串 regex e abc 2 匹配固定字符串 不区分大小写 regex e abc regex constants icase 3 匹配固定字符串之外多一个字符 不区分大小写 regex e abc
  • C++类上使用属性(__declspec property)

    原始代码如下 class A private int m nIndex public int getIndex return m nIndex void setIndex int value m nIndex value 如果采用属性方式实
  • C++ 模板

    模板是泛型编程的基础 泛型编程即以一种独立于任何特定类型的方式编写代码 模板是创建泛型类或函数的蓝图或公式 库容器 比如迭代器和算法 都是泛型编程的例子 它们都使用了模板的概念 每个容器都有一个单一的定义 比如 向量 我们可以定义许多不同类
  • C++ 标准库中数据类型转换

    头文件引用
  • C++ 正则表达式regex(二)

    正则匹配 查找与替代 书写好模式字符串后 需要将待匹配的字符串和模式字符串进行一定规则的匹配 包括三种方式 匹配 regex match 查找 regex search 替换 regex replace 匹配很简单 直接将待匹配字符串和模式
  • VC++ 设定Windows程序自启动(非管理员权限)

    Windows程序自启动方式有很多种 任务计划 注册表 启动项等等 创建任务计划和启动项 都需要程序具有管理员权限才能写入 在此略过 只介绍启动项方式 要实现启动项方式 必须要知道当前用户下启动项方式的目录 我们才好将程序或程序的快捷方式存
  • C++ Web 编程

    什么是 CGI 公共网关接口 CGI 是一套标准 定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的 CGI 规范目前是由 NCSA 维护的 NCSA 定义 CGI 如下 公共网关接口 CGI 是一种用于外部网关程序与信息服务器
  • C++ 日期 & 时间

    C 标准库没有提供所谓的日期类型 C 继承了 C 语言用于日期和时间操作的结构和函数 为了使用日期和时间相关的函数和结构 需要在 C 程序中引用
  • C++ 多态

    多态按字面的意思就是多种形态 当类之间存在层次结构 并且类之间是通过继承关联时 就会用到多态 C 多态意味着调用成员函数时 会根据调用函数的对象的类型来执行不同的函数 下面的实例中 基类 Shape 被派生为两个类 如下所示 实例 incl
  • C++ 基本的输入输出

    C 标准库提供了一组丰富的输入 输出功能 我们将在后续的章节进行介绍 本章将讨论 C 编程中最基本和最常见的 I O 操作 C 的 I O 发生在流中 流是字节序列 如果字节流是从设备 如键盘 磁盘驱动器 网络连接等 流向内存 这叫做输入操
  • C++ 函数

    函数是一组一起执行一个任务的语句 每个 C 程序都至少有一个函数 即主函数 main 所有简单的程序都可以定义其他额外的函数 您可以把代码划分到不同的函数中 如何划分代码到不同的函数中是由您来决定的 但在逻辑上 划分通常是根据每个函数执行一
  • C/C++ 打印菱形图案

    设计思路 以n行菱形为例 n为奇数 图形分为上下2部分 左上角坐标为 0 0 顶点坐标为 0 n 2 图形上半部分 0 n 2 从第1行到第n 2行 每行菱形数递增1个单位 同时每行菱形的起始坐标递减1个单位 图形下半部分 n 2 1 n
  • C++ 标准库

    C 标准库可以分为两部分 标准函数库 这个库是由通用的 独立的 不属于任何类的函数组成的 函数库继承自 C 语言 面向对象类库 这个库是类及其相关函数的集合 C 标准库包含了所有的 C 标准库 为了支持类型安全 做了一定的添加和修改 标准函
  • C++ 继承

    面向对象程序设计中最重要的一个概念是继承 继承允许我们依据另一个类来定义一个类 这使得创建和维护一个应用程序变得更容易 这样做 也达到了重用代码功能和提高执行效率的效果 当创建一个类时 您不需要重新编写新的数据成员和成员函数 只需指定新建的
  • C/C++ 课题解答(1)

    随机产生100个字符 a z 数组arrayOfChar 输入字符c 计算字符c在数组中出现的次数和位置 include

随机推荐

  • springboot2+shiro+redis限制同一账号同时在线人数

    springboot2 shiro redis限制同一账号同时在线人数 我们在写系统的时候 需要注意账号安全问题 最好的处理方法就是同一个账号只能在一个地方登录 原理 大概的原理就是每次登录的时候将登录的sessionId存入缓存 然后登录
  • c# 二维码生成

    dll下载 https pan baidu com s 1MDQalDEoV4iDXRYsEzDXtw 生成图片 此dll适合Framework版本较多 Imports ThoughtWorks QRCode Codec Dim qrCod
  • 技术人修炼之道阅读笔记(七)系统性思维方法

    在工作中有两种高手 一种是他们有成体系的逻辑 术法清晰 另一种是他们悟性高 对大多数人来说 前一种可借鉴性更高 但前提是要足够努力和坚持 塑造系统性思维并进行验证和升级 一 什么是系统性思维 系统性思维 是把物质系统当作一个整体进行思考的思
  • matlab 中num2str函数的使用

    参考 https zhidao baidu com question 431413920 html 问题描述 先前使用num2str函数只是使用了该函数最常用的功能 将数字转换为字符串 但其实该函数还有额外格式上的功能 今天使用图像批处理的
  • vue中使用echarts词云

    1 安装 cnpm install echarts wordcloud 2 创建模板组件 WordCloudChart
  • 自制Jlink OB

    简言 bin 2020 for 6 6 bin 适用最新版的Jlink驱动 6 6x版本号 关于修改SN 打开Jlink Commander 输入exec setsn xxxxxxxx即可修改成功 依据网上的资源 做了一些修改 将原来的输出
  • 快速排序及三种排序方法 Hoare法/挖坑法/前后指针法

    快速排序 算法思想 基于分治的思想 是冒泡排序的改进型 同冒泡排序一样 快速排序也属于交换排序 通过元素之间的比较和交换位置来达到排序的目的 不同的是 冒泡排序在每一轮只把一个元素冒泡到数列的一端 而快速排序在每一轮挑选一个基准元素 并让其
  • 高性能的Web网关,一个工具等于 Nginx + Https证书 + 内网穿透 + 图片切割水印 + 网关登录...

    一 开源项目简介 Apiumc Gateway 它一个工具等于 Nginx Https证书 内网穿透 图片切割水印 网关登录 Apiumc Gateway 是高性能的Web网关 它从底层Socket原始通信层开始 采用多线程 多任务模式从新
  • HyperMesh 2D网格划分

    Hypermesh具有很强的二维四边形网格划分能力 核心思想是将二维几何模型划分为一个个四边形区域 然后在四边形区域内进行进一步的网格划分 常用工具是Geom gt quick edit和2D gt automesh 下面举例看一下 1 常
  • 图文并茂使用CocosBuilder制作Cocos2D游戏 分享0

    图文并茂使用CocosBuilder制作Cocos2D游戏 分享 0 目 录 The Game 设置工程 创建动画类型的主界面 本文由Zynga 工程师原创 翻译 Iven 张作宸 Butterfly 手把手教你使用CocosBuilder
  • 广东公需科目公需课十四五答案考试查询器

    QQ录屏20200723111627 效果看上面这个视频 其中需要data pkl文件 这上面无法上传 如果的可以联系我发给你 博客头像边上有我wx号 import pickle file open data pkl rb data pic
  • 010 - STM32学习笔记 - SysTick系统定时器

    010 STM32学习笔记 SysTick系统定时器 1 SysTick简介 SysTick是属于Cortex M内核的一个外设 嵌套在NVIC中 系统定时器是一个24位的递减计数器 每次计数事件位1 SYSCLK 在F429中之前配置的S
  • 最多变的混合模式-实色混合HardMix

    最多变的混合模式 实色混合HardMix 之前写过一篇介绍27种图层混合模式的非常详细 如果你想完全了解底层的原理 这篇文章不会让你失望 PS图层混合模式超详细解答 图层混合模式的原理 王先生的副业的文章 知乎 https zhuanlan
  • 合并两个无序数组java_Java实现把两个数组合并为一个的方法总结

    Java实现把两个数组合并为一个的方法总结 发布时间 2020 10 25 10 40 46 来源 脚本之家 阅读 76 作者 jaycee110905 本文实例讲述了Java实现把两个数组合并为一个的方法 分享给大家供大家参考 具体如下
  • 数据处理技巧(7):MATLAB 读取数字字符串混杂的文本文件txt中的数据

    MATLAB 读取数字字符串混杂的文本文件txt中的数据 目标 介绍 纯数字的情况 需要读取的文本文件 判断文件路径 matlab 读取数据的结果 代码块 文字开头 数字在后的情况 需要读取的文本文件 matlab 读取数据的结果 代码块
  • cmake--编译器设置

    前言 cmake支持多种不同方式设置编译器标志 1 使用 target compile definitions 设置编译器标志 2 使用CMAKE C FLAGS和CMAKE CXX FLAGS设置编译标志 一 目录结构 CMakeList
  • 复习C语言指针---函数指针

    复习C语言指针 函数指针 文章目录 复习C语言指针 函数指针 函数 函数指针 函数指针数组 回调函数 结束语 函数 一个函数表达式其实是不存在直接的 操作符的 操作符要求操作数是函数指指针 或者一些类类型 实际上 当用 f1 这样调用f1时
  • 华为服务器系统崩了怎么办,服务器崩溃重装系统

    服务器崩溃重装系统 内容精选 换一换 裸金属服务器操作系统无法正常启动 操作系统中毒 或裸金属服务器系统运行正常 但需要对系统进行优化 使其在最优状态下工作时 用户可以使用重装裸金属服务器的操作系统功能 重装操作系统是以原镜像进行系统重装
  • jackson 驼峰注解_springboot jackjson驼峰转下划线

    有如下几种方法 1 通过ObjectMapper设置 mapper setPropertyNamingStrategy com fasterxml jackson databind PropertyNamingStrategy SNAKE
  • C++ 模板

    模板是泛型编程的基础 泛型编程即以一种独立于任何特定类型的方式编写代码 模板是创建泛型类或函数的蓝图或公式 库容器 比如迭代器和算法 都是泛型编程的例子 它们都使用了模板的概念 每个容器都有一个单一的定义 比如 向量 我们可以定义许多不同类