简述C++泛型化编程思想

C++泛型算法 记录泛型算法的相关知识 阅读详情

简述C++泛型化编程思想

 https://blog.youkuaiyun.com/Mary19920410/article/details/61914091

1、泛型的基本思想

泛型编程(Generic Programming)是一种语言机制,通过它可以实现一个标准的容器库。像类一样,泛型也是一种抽象数据类型,但是泛型不属于面向对象,它是面向对象的补充和发展。泛型编程在C++上的应用主要体现在两方面:函数模板和类模板,接下来我们通过两个例子说明。

1)函数模板

泛型,也就是我们说的任何类型,即不依赖于任何具体的类型。通常我们的操作都是依赖于具体的数据类型的,比如:

 


 
  1. int add(int a, int b)

  2. {

  3. return a + b;

  4. }


这个add函数依赖于int类型。你只能以int类型调用(即使是float,也会被转换为int型)。得到的结果也只能是int。那如果我们还需要一个float类型的add算法,就需要再写一个重载程序:

 

 


 
  1. float add(float a, float b)

  2. {

  3. return a + b;

  4. }

 

虽然在C++中可以通过函数重载来解决这个问题,但是反复写相同算法的函数是比较辛苦的,更重要的是函数重载是静态编译,运行时占用过多内存。

而泛型依赖于模板技术,可以支持任意数据类型,比如:

 

template <class T>

 
  1. T add( T a, T b)

  2. {

  3. return a + b;

  4. }

 

这个函数就可以用int,float等类型进行实例化,然后进行调用,这就不依赖任何具体的数据类型。例如:

 


 
  1. int result = add<int>(1,2);

  2. string result = add<string>("hello","world");

 

2)类模板

比如对栈的描述:

class stack{

push(参数类型);  //入栈

pop(参数类型);  //出栈

}

如果把上面的伪代码看作算法描述,没问题,因为算法与参数类型无关。但是如果把它写成可编译的源代码,就必须指明类型,否则是无法通过编译的。使用重载来解决这个问题,即对N种不同的参数类型写N个push和pop算法,这样是很麻烦的。

若对上面的描述进行改造如下:

首先指定一种通用类型T,不具体指明是哪一种数据类型:

class stack<参数模板T>

{

push(T);  //入栈算法

pop(T);  //出栈算法

}

这里的参数模板T相当于一个占位符,当我们实例化stack时,T会被具体的数据类型替换掉。

若定义对象S为stack类型,在实例化S时若我们将T指定int型,则:

 


 
  1. class S

  2. {

  3. push(int); //入栈

  4. pop(int); //出栈

  5. }


这时,我们可以称class stack<参数模板T>是类的类,通过它可以生成具体参数类型不同的类。

 

综上,可以看出泛型在C++中的应用主要是模板函数和模板类。

2、定义模板函数

函数模板是一个独立于类型的函数,可以产生函数的特定类型版本。

 

模板定义以关键字template开始,后接尖括号括住的模板形参表。

模板形参可以是表示类型的类型形参(type parameter),也可以是表示常量表达式的非类型形参(nontype parameter)。如下面的程序中的T是类型形参。

 


 
  1. /*

  2. implement strcmp-like generic compare function

  3. */

  4. #include <iostream>

  5. #include <string>

  6. using namespace std;

  7.  
  8.  
  9. template <typename T> //类型形参,若多个类型形参,则<typename T1, typename T2>

  10. int compare(const T &v1, const T &v2)

  11. {

  12. if(v1 < v2) return -1;

  13. if(v2 < v1) return 1;

  14. return 0;

  15. }

  16.  
  17.  
  18. int main()

  19. {

  20. cout << compare(1,2) << endl;

  21.  
  22. string s1 = "hello", s2 = "world";

  23. cout << compare(s1, s2) << endl;

  24. return 0;

  25. }

 

使用函数模板时,编译器会将模板实参绑定到模板形参。编译器将确定用什么类型代替每个类型形参,用什么值代替每个非类型形参,然后产生并编译(称为实例化)该版本的函数。

上面的例子中,编译器用int代替T创建第一个版本,用string代替T创建第二个版本。

3、定义模板类

在定义的类模板中,使用模板形参作为类型或值的占位符,在使用类时再提供具体的类型或值。例如:

 


 
  1. template <typename T>

  2. class Queue

  3. {

  4. public:

  5. Queue();

  6. T &front();

  7. const T & front() const;

  8. void push(const T&);

  9. void pop();

  10. bool empty()const;

  11. private:

  12. //...

  13. };


与调用函数模板不同,实用类模板时,必须为模板形参指明指定数据类型,例如:

 

 


 
  1. Queue<int> qi; // Queue that holds ints

  2. Queue<string> qs; // Queue that holds strings

 

 

 

 

C++ 的泛型编程 这个思想其实有两个层面,1、编写与数据类型无关的代码;2、使用模版元; 阅读详情

相关推荐

C++和C#之泛型编程对比

摘要泛型编程的思想由来已久,由STL之父-Alex Stepanov提出。Ada、C++、以及最近的Java和C#都相继加入了对泛型编程的支持。其中已纳入C++标准的STL ,就是泛型编程的一个成功的应用。由于每种语言的特性不同,因此在泛型的实现上大有差别,那么这些编程语言在泛型的实现机制和编程应用方面到底有什么区别呢?本文试图从这两个方面来探讨C++和C#在泛型编程支持方面的区别。关键词

麦田里的守望者 6824

泛型程序设计与STL

泛型程序设计的基本概念         所谓泛型程序设计,就是编写不依赖于具体数据类型的程序。泛型程序设计的主要思想是将算法从特定的数据结构中抽象出来,使算法成为通用的、可以作用于各种不同的数据结构。 泛型程序设计的数据类型T的协议: 从函数模板的声明来看,类型参数T可以是任何数据类型,但实际上并非如此。类型T必须具备3个功能: ①类型T的变量之间能够比较大小 ②类型T必须具有公有的

tf_apologize的博客 1641

泛型编程——模板及模板的特例化

1. 简介   面向对象编程(OOP)和泛型编程都能处理在编写程序时不知道类型的情况。不同之处在于:OOP能处理类型在程序运行之前都未知的情况;而泛型编程中,在编译时就能获知类型了。   模板是C++中泛型编程的基础。一个模板就是一个创建类或函数的蓝图或者说公式。当使用一个vector这样的泛型类型,或者find这样的泛型函数。这种转换发生在编译时。   编写单一模板,使之对任何可能的模板实

huangjh2017的博客 1153

泛型程序设计

泛型程序设计 从Java程序的设计语言1.0版本发布以来,变化最大的部分就是泛型。致使Java SE5.0中增加泛型机制的主要原因为了满足在1999年制定的最早的Java规范需求之一(JSR14).专家组花费了5年左右的时间来定义规范和测试实现。泛型正是我们需要的程序设计手段。使用泛型机制编写的代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。泛型对于集...

qq_43078445的博客 366

Cpp-泛型编程基础

Cpp-泛型编程基础 哇,很久没有写cpp了,写得太挫了,主要是。emm,好像数据结构作业是实现线程池,趁此机会好好学一遍cpp吧,不要再吹水了。只希望。 C++是一门很强大的语言,泛型编程一般来说可望而不可及,今天来啃一下这小基础吧。 函数重载 假设要比较两个数的值,我们可以使用两个函数进行重载: int compare(const int&a, const int&b) { if

Cutepingping的博客 1498

【Spring源码三千问】哪些循环依赖问题Spring解决不了?

哪些循环依赖问题Spring解决不了?前言版本约定正文场景一: prototype 类型的循环依赖场景二: constructor 注入的循环依赖场景三:Proxy 类型的 Bean 的循环依赖小结 系列博文: 【老王读Spring IoC-0】Spring IoC 引入 【老王读Spring IoC-1】IoC 之控制反转引入 【老王读Spring IoC-2】IoC 之 BeanDefinition 扫描注册 【老王读Spring IoC-3】Spring bean 的创建过程 【老王读Spring I

老王的专栏 7319

C++ 模板与泛型详解

/Code }模板形参表使用typename或者class定义都可以,没有任何区别,为了区分类的定义,一般使用typename//对于任意类型的两个对象相加,的函数模板 template < typename T > T sum(T a , T b) {}

ylh的博客 2155

不用买显示器!用USBMMID虚拟显示器软件在Win10上扩展4个屏幕(保姆级教程)

本文提供了一份详细的保姆级教程,指导用户如何在Windows 10系统上,无需购买额外硬件,通过USBMMID虚拟显示器软件扩展出多达4个虚拟屏幕。文章深入解析了虚拟显示器的核心原理,并基于微软IDD框架,手把手教学从软件获取、环境检查到安装配置的全过程,帮助开发者和多任务用户构建高效、免费的虚拟多屏工作站,实现生产力的飞跃。

backprop5master的博客 660

泛型技巧系列:用泛型打造可复用的抽象工厂

注意:本文版权所有,不得擅自转载 泛型不仅能用来做容器,还能够提供代码复用的手段。在泛型的参与下,许多设计就可能更精妙,更具扩展性。今天我就来演示一个利用泛型增强的抽象工厂模式。我们知道,抽象工厂(Abstract Factory)模式是将工厂和产品全部抽象化,一个抽象工厂生成一组抽象产品,而一个具体工厂则生成具体产品的一个特定组合。它能够维持这种相关对象组合的一致性,并使得用户不需要了解工厂...

weixin_34342992的博客 201

避坑指南:STM32H7不同DMA控制器(MDMA/DMA2D/BDMA)到底该用哪个?

本文深入解析STM32H7系列芯片的DMA控制器选型策略,涵盖MDMA、DMA2D、BDMA等不同控制器的架构原理与性能对比。通过实际项目案例,提供高速TCM数据搬运、GUI加速、低功耗传输等场景的选型决策树,并分享性能优化与调试技巧,帮助工程师避开常见陷阱,提升系统效率。

weixin_26876073的博客 447

Jitsi中的Prosody(谐音:破扫敌)介绍

凭借其灵活的插件系统、强大的安全性和出色的性能,Prosody 成为许多企业和开发者构建定制化通信解决方案的首选。在 Jitsi 的多方视频会议场景中,Prosody 不仅处理基本的信令任务,还需要与其他组件(如 Jitsi Videobridge)协作,确保视频流的正确分发和控制。Prosody 提供了丰富的插件系统,允许开发者通过模块扩展其功能。Prosody 就是一个实现 XMPP 协议的服务器,它支持 XMPP 协议的标准功能,如消息传递、群组聊天、传送状态信息等,并提供了高效、可扩展的服务。

江左散人的专栏 1166

C++泛型编程思想方法总结

C++用模板来实现泛型编程,模板分为函数模板和类模板。 基本概念:泛型编程范式GP:模板也叫参数类型多态化。 在编译时期确定,相比面向对象的虚函数多态,能够有更高的效率。 泛型编程是从一个抽象层面描述一种类型的算法,不管容器类型是什么,是一种不同于OOP的角度来抽象具体算法。 C++0X目前对GP的支持的趋势来看,确实如此,auto/varadic templates这些特性的加入象征着C

自由理想的足迹 1万+

【python】import pandas as pd用法

是 Python 里最常用的数据分析库之一。 的意思是:导入 pandas 库,并给它起个别名 。这样用起来更简洁: 下面总结 pandas 的常见用法(配例子)。目录🔹 1. 数据结构(1) Series(一维数据,类似于数组 + 标签)(2) DataFrame(二维数据表,类似于 Excel 表格)🔹 2. 数据读写🔹 3. 数据查看🔹 4. 数据选择与索引🔹 5. 数据清洗🔹 6. 数据运算🔹 7. 数据筛选(布尔索引)🔹 8. 分组与聚合🔹 9. 排序 Pandas 常用方

2401_86285609的博客 1533

C++泛型编程

C++泛型编程与STL总结1. 泛型编程1.1 模板1.2 函数模板1.2.1 语法1.2.2 使用函数模板方式1.2.3 普通函数和函数模板的区别1.2.4 普通函数与函数模板的调用规则1.2.5 模板的局限性1.3 类模板2. STL技术 1. 泛型编程 泛型编程最初诞生于C++中。目的是为了实现C++的STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T。(参考自Bai

蹦跶跶 6889

使用 MATLAB/Simulink 构建一个基于PID控制的直流电机速度调节系统模型

直流电机(DC Motor)因其结构简单、成本低廉、易于控制等特点,广泛应用于各种工业自动化和家用电器中。PID控制器作为最常用的控制策略之一,在直流电机的速度调节系统中具有重要应用价值。通过合理调整比例(P)、积分(I)、微分(D)三个参数,可以实现对电机速度的精确控制。本教程将带你使用构建一个基于PID控制的直流电机速度调节系统模型,涵盖电机模型构建、PID控制器设计、系统仿真与调试等多个方面。本文介绍了如何使用构建一个基于PID控制的直流电机速度调节系统模型。

amy_mhd的博客 217

2024年厦门市第31届小学生C++信息学竞赛试题与解析(第一部分选择题1-10)

2024年厦门市第31届小学生C++信息学竞赛试题与解析(第一部分选择题1-10)

汉克老师的博客 108

C++泛型详解

如果要在函数模板内部使用这样的类型,必须显示告诉编译器这个名字是一个类型,否则编译器无法得知它是一个类型还是一个值。模板形参可以是表示类型的类型形参(type parameter),也可以是表示常量表达式的非类型形参(nontype parameter)。编译器将确定用什么类型代替每个类型形参,用什么值代替每个非类型形参,然后产生并编译(称为实例化)该版本的函数。在定义的类模板中,使用模板形参作为类型或值的占位符,在使用类时再提供具体的类型或值。函数模板是一个独立于类型的函数,可以产生函数的特定类型版本。

程序猿老樊的博客 5252

《Python星球日记》 第73天:情感分析与主题建模

《Python星球日记》 第73天:情感分析与主题建模,今天我们将探索两个自然语言处理领域的重要技术:情感分析和主题建模。这两项技术在社交媒体分析、用户反馈处理、市场研究等多个领域有着广泛应用。

Code_流苏:在代码中寻诗意,在实践中觅真知 919

C++泛型和泛型编程(通俗理解+模板程序)

1、泛型是什么? 泛型编程是什么? 实质上就是不使用具体数据类型(int、double、float等),而是使用一种通用类型来进行程序设计的方法,泛泛的描述一下数据,这个方法可以大规模的减少程序代码的编写量。 模板函数如下: 其中,T是一个占位符(数据类型占位符),也就是说,将来T这个位置是一个真实的、具体的数据类型。 所以,可以把T这种类型占位符也称为一种数据类型,就叫泛型(generic type)。使用这种类型占位符的编程方式就叫泛型编程。 总之,泛型也是一种数据类型,但它是用来代替所有类型的“通用类

weixin_45758146的博客 6846

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【C++】泛型编程

函数模板是C++泛型编程的基础之一,它允许我们定义一个通用的函数框架,能够处理不同数据类型的操作。其定义方式需要借助template关键字,后面紧跟尖括号,在尖括号内声明类型参数。a : b;/*在这个例子中,template 声明了这是一个函数模板,其中typename表明T是一个类型参数,你也可以使用class关键字来代替typename,效果是一样的。在函数体中,T就如同一个占位符,可以代表任意数据类型。

2302_78829275的博客 2245

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

c++ 泛型

目录 1. 什么是泛型 2. 为什么需要泛型 3.泛型如何用 参考泛型是什么,C++泛型编程又是什么? 参考多篇文章整合而成 1. 什么是泛型 泛型是什么,C++泛型编程又是什么? 泛型,实质上就是不使用具体数据类型(例如 int、double、float 等),而是使用一种通用类型来进行程序设计的方法,该方法可以大规模的减少程序代码的编写量,让程序员可以集中精力用于业务逻辑的实现。 维基-Generic programming Generic programming .

q306507291的博客 3304

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

泛型编程思想、模板思想

泛型编程思想 泛型编程与C++ templates和STL不该混为一谈,模板是泛型编程的基础,而STL是泛型编程思想的实现,是以泛型编程为指导而产生的。STL是泛型编程的第一份重要实现品。可以这样理解,STL是泛型编程思想的产物,是以泛型编程为指导而产生的。因此,在介绍STL之前,先了解泛型编程的思想是必要的。 《泛型编程与STL》的前言中指出,泛型编程和模型对象编程...

你又来看我了,一起学习吧 650

C++:泛型算法

泛型算法(Generic Algorithm)​是 C++ Standard Template Library (STL) 的核心组成部分,其本质是与容器类型无关的通用操作逻辑。通过模板和迭代器机制,泛型算法能够对任意满足迭代器接口的容器(如vectorlistmap)进行操作,实现代码复用和高度灵活性。核心特征​容器无关性:不依赖具体容器类型,只要求容器提供迭代器。​类型安全:通过模板参数推导类型,编译期检查错误。​高性能:针对不同容器底层数据结构优化(如vector的连续内存访问、list。

永远怀着至诚之心拥抱世界 1497

C#中的泛型,与java。C++中泛型的区别

原著 :Bill Venners、Bruce Eckel  2004.2.26 原文 :http://www.artima.com/intv/generics.html  翻译 :lover_P [人物介绍]     Anders Hejlsberg , 微软著名工程师,带领他的小组设计了C#(读作:C-Sharp)程序设计语言。Hejlsberg第一次登上软件界历史舞台是在80年

nabila的专栏 3302

c#泛型使用详解:泛型特点、泛型继承、泛型接口、泛型委托

泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。在.NET类库中处处都可以看到泛型的身影,尤其是数组和集合中,泛型的存在也大大提高了程序员的开发效率。更重要的是,C#的泛型比C++的模板使用更加安全,并且通过避免装箱和拆箱操作来达到性能提升的目的。因此,我们很有必要掌握并善用这个强大的语言特性。 C#泛型特点: 1、如果实例

zdhlwt2008的博客 1万+
上一篇: 常见字符编码简介:ASCII、Unicode、UTF-8、UTF16
下一篇: C/C++中内存区划分、堆和栈的比较
TuxedoLinux
博客等级 码龄9年 268粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值