我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++数据结构模板进阶实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++数据结构模板进阶实例分析

本文小编为大家详细介绍“C++数据结构模板进阶实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++数据结构模板进阶实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

非类型模板参数

模板参数分类类型形参与非类型形参。

  • 类型模板形参:出现在模板参数列表中,跟在class或者typename后面的参数类型名称。

  • 非类型模板形参:用一个常量作为模板的一个参数,必须是整形家族中的类型参数,否则不行。他在模板中可以当常量使用。

实例:

// 类型模板参数namespace wxj{// 非类型模板参数 N 是一个常量参数,只能是整形家族的:int short char long  long long    自定义类型和其他类型都不能作费类型模板参数// 必须在编译期就能确认结果template<class T, size_t N = 10>class Array{public:Array():_size(N){}T& operator[](size_t i){return _arr[i];}const T& operator[](size_t i) const{return _arr[i];}size_t size(){return _size;}bool empty(){return _size == 0;}private:T _arr[N];size_t _size;};void TestArray(){Array<int, 5> arr;for (size_t i = 0; i < arr.size(); ++i){arr[i] = i;}for (size_t i = 0; i < arr.size(); ++i){cout << arr[i] << " ";}cout << endl;}}int main(){wxj::TestArray();return 0;}

代码运行结果如下:

C++数据结构模板进阶实例分析

看上面,我们定义了一个数组类,空间大小由N决定,类型是Array<T, size_t>

注意:

  • 非类型形参必须是整形家族中的类型,浮点数和类对象都不行。

  • 非类型的模板形参必须在编译期间就能确认结果。

模板的特化

模板特化:在原模板类的基础上,针对特殊类型所进行的特殊化的实现。分为函数模板特化 和类模板特化。

函数模板的特化

特化的步骤

  • 必须先有一个基础的函数模板

  • 关键字template后面接一对空的尖括号<>

  • 函数名后跟一对尖括号<>,里面指定需要的特化的类型

  • 函数形参列表:必须和函数模板的基础参数类型完全一致

实例

// 模板的特化    模板的特殊化template<class T>bool IsEqual(T& left, T& right){return left == right;} // 特化  针对某些类型进行特殊化处理template<>bool IsEqual<const char* const>(const char* const& left, const char* const& right){return strcmp(left, right) == 0;}

注意: 一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给出。

bool IsEqual(char* left, char* right){return strcmp(left, right) == 0;}

类模板的特化

类模板的特化分为全特化和偏特化。

全特化: 对类模板参数列表的类型全部都确定(明确指定)

template <class T1, class T2>class Date{public:Date(){cout << "Date<T1, T2>" << endl;}private:T1 _d1;T2 _d2;};// 全特化template<>class Date<int, double>{public:Date(){cout << "Date<int, double>" << endl;}private:int _d1;double _d2;};

偏特化: 堆类模板的参数列表中部分参数进行确定化分为部分特化和参数进一步限制

部分特化

// 部分template<class T2>class Date<int, T2>{public:Date(){cout << "Date<int, T2>" << endl;}private:int _d1;T2 _d2;};

参数进一步限制 如下有T*和T&,是模板的类型转为指针类型和引用类型

// 参数进一步限制  堆模板参数更进一步的条件限制template <class T1, class T2>class Date<T1*, T2&>{public:Date(int& a):_d2(a){cout << "Date<T1*, T2&>" << endl;}private:T1* _d1;T2& _d2;};

实例 我们试着实例化几个对象,看他们用的是哪个模板

int main(){Date<int, int> d1;Date<int, double> d2;Date<int, float> d3;int a = 10;Date<int*, int&> d4(a);return 0;}

代码运行结果:

C++数据结构模板进阶实例分析

模板的分离编译

分离编译: 我们对这个应该是不陌生的,就是把函数的声明放在一个叫**.h的文件中,实现都放在一个叫.cpp**的文件中,这样方便我们管理。

下面我们试着对模板进行分离编译:

C++数据结构模板进阶实例分析

// a.h#pragma once// 普通函数void Swap(int& a, int& b);// 函数模板template<class T>T Add(const T& a, const T& b);// a.cpp#define _CRT_SECURE_NO_WARNINGS 1#include "a.h"// 普通函数void Swap(int& a, int& b){int tmp = a;a = b;b = tmp;}// 函数模板template<class T>T Add(const T& a, const T& b){return a + b;}// test.cpp#include "a.h"int main(){int a = 3;int b = 4;Swap(a, b);cout << "a = " << a << " b = " << b << endl;cout << Add(a, b) << endl;return 0;}

代码运行结果如下

C++数据结构模板进阶实例分析

代码运行时发生了报错,说Add这个函数是没有见过的。得出结论:函数模板不能分离编译,普通函数可以。

为什么会这样呢?

C++程序运行一般经过几个阶段:预处理——>编译——>汇编——>链接(更详细的内容可以参考往期博客——程序的编译)

  • 模板在.cpp中定义了,由于不知道T的类型,所以没有对模板进行实例化。

  • a.h 和 a.cpp 走的是两条不同的路,两条路都没有对模板进行实例化(因为不知道T的类型)。

  • 因为没有对模板进行实例化,所以没有函数参数,也就没有函数地址,所以在链接时,test.cpp中的调用Add函数时,没有函数地址,call调用不到Add函数,所以报错。

解决方法:

  • 暴力:不分离编译,统一放在一个.h或.hpp的文件中

  • 模板定义位置显示实例化(不推荐,这样就失去了泛型的特点)

读到这里,这篇“C++数据结构模板进阶实例分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++数据结构模板进阶实例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++数据结构模板进阶实例分析

本文小编为大家详细介绍“C++数据结构模板进阶实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++数据结构模板进阶实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。非类型模板参数模板参数分类类型形参
2023-06-29

基于C++的数据结构实例分析

本篇内容介绍了“基于C++的数据结构实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!数据结构通常情况下,精心选择的数据结构可以带来更高
2023-07-02

C++模板使用实例分析

这篇文章主要介绍了C++模板使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++模板使用实例分析文章都会有所收获,下面我们一起来看看吧。非类型模板参数模板参数分类类型形参与非类型形参。类型形参:出现
2023-06-30

C++数据结构的栈与队列实例分析

今天小编给大家分享一下C++数据结构的栈与队列实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 栈1.1 栈的概念
2023-06-30

JavaScript数据结构Number实例分析

本文小编为大家详细介绍“JavaScript数据结构Number实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript数据结构Number实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-06-29

C#结构体构造函数的实例分析

这期内容当中小编将会给大家带来有关C#结构体构造函数的实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#结构体构造函数的应用是如何的呢?C#结构体构造函数的实例1、 /// ﹤summary
2023-06-18

C++数据结构中list的示例分析

小编给大家分享一下C++数据结构中list的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言list相较于vector来说会显得复杂,它的好处是在任意位置插入,删除都是一个O(1)的时间复杂度。一、list的节点
2023-06-25

Python数据结构的栈实例分析

这篇文章主要介绍“Python数据结构的栈实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python数据结构的栈实例分析”文章能帮助大家解决问题。1. 栈的基本概念1.1 栈的基本概念栈 (
2023-06-29

C++数据结构红黑树的示例分析

这篇文章给大家分享的是有关C++数据结构红黑树的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概念和性质红黑树的概念: 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或
2023-06-29

C++11模板函数的默认模板参数举例分析

这篇文章主要介绍“C++11模板函数的默认模板参数举例分析”,在日常操作中,相信很多人在C++11模板函数的默认模板参数举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11模板函数的默认模板参数举
2023-06-19

C语言结构体实例分析

这篇文章主要介绍“C语言结构体实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言结构体实例分析”文章能帮助大家解决问题。1. 动态内存管理C语言代码----->编译----->链接----
2023-06-29

Python Pandas中的数据结构实例分析

今天小编给大家分享一下Python Pandas中的数据结构实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:Pa
2023-07-02

Java数据结构之AVL树实例分析

这篇文章主要介绍“Java数据结构之AVL树实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java数据结构之AVL树实例分析”文章能帮助大家解决问题。AVL树的引入搜索二叉树有着极高的搜索效
2023-06-30

PHP 高阶数据结构的使用实例

php 高阶数据结构的使用实例:数组: 存储有序键值对集合;列表: 存储有序数字键数据集合;集合: 存储唯一值集合,无序;堆: 优先队列,元素按优先级排序;哈希表: 快速查找键值的键值对集合。实战案例:用户数据库,使用数组存储用户数据,并通
PHP 高阶数据结构的使用实例
2024-05-07

C++数据结构关于栈迷宫示例分析

这篇文章主要讲解了“C++数据结构关于栈迷宫示例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++数据结构关于栈迷宫示例分析”吧!一、实验目的理解栈的抽象数据类型定义及操作特点。掌握顺
2023-06-21

C++ 数据结构中单链表的示例分析

小编给大家分享一下C++ 数据结构中单链表的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、链表是什么链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接依次实现的。由图,链
2023-06-29

C语言数据结构堆排序示例分析

今天小编给大家分享一下C语言数据结构堆排序示例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。TOP.堆排序前言什么是堆排
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录