C++编程:高阶编程

news2024/9/20 9:40:37

         本阶段主要针对泛型编程和STL技术作详细讲解。

1 模板

1.1 模板的概念

C++提供一种泛型编程,主要利用模板的技术,模板的目的是提高代码复用性,将类型参数化。

C++提供两种模板机制:

  • 函数模板
  • 类模板

模板的特点:

  • 模板不可用直接使用,它指数一个框架;
  • 模板的通用表示万能的,也是由使用范围的。

 

1.2 函数模板

函数模板的作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,而是用一个虚拟的类型来代表。

语法:

template<typename/class T>

template:声明创建模板

typename/class:表明其后面的符号是一种数据类型

T:通用的数据类型,该名称可以替换,通常为大写字母

1.2.1 函数模板的创建与使用

语法:

//声明一个模板,告诉编译器后面紧跟的代码中的T不要报错,T是一个通用类型

template<typename T>

//模板使用的两种方式:1.自动类型推导;2.显示指定类型
//1.自动类型推导
mySwap(a,b);

//2.显示指定类型
mySwap<int>(a,b);

码如下:

#include <iostream>
using namespace std;

//函数模板

//交换两个整形的函数
void swapInt(int a,int b)
{
    int temp=a;
    a=b;
    b=temp;
}

//交换两个浮点数的函数
void swapDouble(double a,double b)
{
    double temp=a;
    a=b;
    b=temp;
}

//函数模板
template<typename T>//声明一个模板,告诉编译器后面紧跟的代码中的T不要报错,T是一个通用类型
void mySwap(T &a, T &b)
{
    T temp=a;
    a=b;
    b=temp;
}

void test01()
{
    int a=4;
    int b=10;

    //swapInt(a,b);

    //利用模板交换,两种方式:1.自动类型推导;2.显示指定类型
    //1.自动类型推导
    ///mySwap(a,b);

    //2.显示指定类型
    mySwap<int>(a,b);
    cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;

    double c=4.66;
    double d=3.22;

    swapDouble(c,d);
    //mySwap(a,c);//错误示例1:自动类型推导,必须推导出一致的数据类型T才能使用
    cout<<"c="<<c<<endl;
    cout<<"d="<<d<<endl;
}

template<class T>
void func()
{
    cout<<"this is func()"<<endl;
}

void test02()
{
    //func();//错误示例2:模板必须确定T的数据类型才能使用
}

int main()
{
    test01();
    test02();
    return 0;
}

注意事项:

  • 自动类型推导,必须推导出一致的数据类型T才能使用
  • 模板必须确定T的数据类型才能使用

错误示例1:

错误示例2:

1.2.2 函数模板案例

案例描述:

  • 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序
  • 排序规则为从大到小,排序算法为选择排序
  • 分别利用char数组和int数组进行测试

代码如下:

#include <iostream>
using namespace std;

//函数模板案例:对不同数据类型的数组进行从大到小的选择排序
template<class T>
void mySort(T buff[],int len)
{
    for(int i=0;i<len;i++)
    {
        int max=i;
        for(int j=i+1;j<len;j++)
        {
            if(buff[j]>buff[max])
            {
                max=j;
            }
        }
        if(max!=i)
        {
            T temp=buff[i];
            buff[i]=buff[max];
            buff[max]=temp;
        }
    }
}

template<class T>
void printArry(T buff,int len)
{
    for(int i=0;i<len;i++)
    {
        cout<<buff[i]<<endl;
    }
}

//测试char数组
void test01()
{
    char arr[]="abcdef";
    int len=sizeof(arr)/sizeof(char);
    mySort(arr,len);
    printArry(arr,len);
    
}

//测试int数组
void test02()
{
    int arr[]={2,4,6,8,3,1};
    int len=sizeof(arr)/sizeof(int);
    mySort(arr,len);
    printArry(arr,len);
}

int main()
{
    test01();
    test02();
    return 0;
}

输出如下:

写错的地方:

1.选择排序比较两个数的大小是用第j个和最大的数比较if(buff[j]>buff[max]),而不是和第i个比较if(buff[j]>buff[i])。

2.计算数组长度时忘记除以数据类型的长度sizeof(arr)/sizeof(int)

考究的地方:

向函数传递数组时似乎可以只写数组名void printArry(T buff,int len),而不一定要写中括号void mySort(T buff[ ],int len)。

1.3  类模板

2 STL

3 容器

3.1 string容器

3.2 vector容器

3.3 deque容器

3.4 stack容器

3.5 queue容器

3.6 list容器

3.7 set容器

3.8 map容器

4 谓词

5 内建函数对象

6 常见算法

6.1 遍历算法

6.2 查找算法

6.3 排序算法

6.4 拷贝和替换算法

6.5 算术生成算法

6.6 集合算法

7综合案例

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实习结束总结20240828

长达两个月的实习终于在今天结束了&#xff0c;不知怎的&#xff0c;心如止水&#xff0c;没有高兴&#xff0c;没有伤心&#xff0c;毫无波澜的内心甚至让自己都感觉可怕&#xff0c;也许&#xff0c;这就是成长吧。 硬件上&#xff1a; 1.cadence需要继续深入学习&#xff…

Transformers for One-Shot Visual Imitation

发表时间&#xff1a;(CoRL 2020&#xff09; 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId4546337571360890881&noteId2424798489658874880 作者单位&#xff1a;Carnegie Mellon University, USA Motivation&#xff1a;人类能够通过推断他们…

每日OJ_牛客_年会抽奖(错排问题)

牛客_年会抽奖&#xff08;错排问题&#xff09; 年会抽奖__牛客网 解析代码 该题为经典的错排问题 用A、B、C……表示写着&#xff4e;位友人名字的信封&#xff0c;a、b、c……表示&#xff4e;份相应的写好的信纸。把错装的总数为记作 D(n)。假设把&#xff41;错装进&…

【ubuntu使用笔记】Ubuntu Desktop 访问SMB共享文件夹

Ubuntu Desktop 访问SMB共享文件夹 Ubuntu Desktop 访问SMB共享文件夹文件夹打开 file managerother location输入 IP地址&#xff0c;smb://IP点击connect按钮正常进入 命令行安装客户端连接 Ubuntu Desktop 访问SMB共享文件夹 文件夹 打开 file manager other location 输入…

WATCH, TRY, LEARN: META-LEARNING FROM DEMONSTRATIONS AND REWARDS

&#xff08;感觉有点从失败中学习的意思&#xff09; 发表时间&#xff1a;30 Jan 2020 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId4545005537963171841&noteId2453371997770644736 作者单位&#xff1a;UC Berkeley Motivation&#xff1a…

2024年高教社杯全国大学生数学建模竞赛

2024年高教社杯全国大学生数学建模竞赛通知 2024数模比赛确定时间为&#xff1a;9月5日18时至9月8日20时 报名截止日期&#xff1a;9月2日&#xff08;周一&#xff09;20时

使用maven 实现版本覆盖案例4【经典版】

一 原理介绍 1.1 原理逻辑 关系图&#xff1a;从使用方xinxiang_demo中引用A_parent的2.13的版本的层级要比B_Module继承A_parent&#xff1a;1.1 版本的层级要短&#xff0c;优先级更高&#xff0c;所以使用2.13&#xff0c;将B_Module继承A_parent 1.1 版本覆盖。 1.2 实操…

约 数个数

对于一个数 其中&#xff1a;是的各个质因数&#xff0c;上式是的质因数乘积式。 约数个数&#xff1a; 约数之和&#xff1a; step1&#xff1a; 采用分解质因数的方法&#xff0c;计算出的每一个质因数的次数 &#xff08;分解质因数的blog&#xff1a;http://t.csdni…

Kali学习(ms17-010、ms08-067漏洞复现)

目录 一、kali网络设置 NAT模式、桥接上网/仅主机 VMnet0、VMnet1、VMnet8 1.NAT模式 VMnet8 &#xff08;1&#xff09;检查服务 &#xff08;2&#xff09;创建虚拟网卡 &#xff08;3&#xff09;创建kali的网卡信息 &#xff08;4&#xff09;验证 2.桥接模式 VMn…

结果一。5.be doing表将来和 表 will的区别

be doing 表⽰近期、眼下就要发⽣的事情; will 表⽰将来的时间,则较远⼀些。如: He is going to write a letter tonight.He will write a book 。 be going to 表⽰根据主观判断将来肯定发⽣的事情。 will+ 动词原形表⽰⼀般将来时。 will ࿰

如何用Java SpringBoot+Vue打造高效产品订单管理系统?

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

【C++ Primer Plus习题】6.9

问题: 解答: #include <iostream> #include <string> #include <fstream> using namespace std;typedef struct _Donor {string name;double money; }Donor;int main() {ifstream file;string filename;int count 0;cout << "请输入文件名:&quo…

PDF合并可以如此简单?!这3种方法,简单又实用!

在日常的忙碌与学习中&#xff0c;我们时常需要将散落的PDF文件整合成一份完整的文档&#xff0c;无论是为了整理报告、汇编学习资料&#xff0c;还是为了提升阅读效率&#xff0c;PDF合并都显得尤为重要。 今天&#xff0c;就让我带你解锁三种既简单又高效的PDF合并方法&#…

进程终止 等待 替换

文章目录 一.进程的终止进程终止实在做什么&#xff1f;进程终止的3种情况自定义退出码 如何终止进程&#xff1f; 二.进程等待为什么要进行进程等待&#xff1f;进程如何等待&#xff1f;waitwaitpid 阻塞等待 && 非阻塞等待 三.进程的程序替换先看代码 && 现…

Windows电脑还在纠结用什么便签软件?

在快节奏的生活中&#xff0c;我们常常需要记录下一些重要的事情或者临时的想法&#xff0c;而便签软件就是我们的好帮手。但是&#xff0c;面对市面上众多的便签软件&#xff0c;Windows电脑用户可能会感到困惑&#xff0c;不知道该如何选择。在这里&#xff0c;小编为你提供一…

Great Wall长城工作站安装银河麒麟V10(SP1)-ARM版桌面操作系统

长城工作站安装银河麒麟V10(SP1)桌面操作系统 1. 硬件信息 [1]. Great Wall 长城台式微型计算机 产品型号&#xff1a;世恒TD120A2 型号代码&#xff1a;世恒TD120A2-019 电源&#xff1a;220V~3A 50Hz [2]. 芯片型号 架构&#xff1a; aarch64 CPU 运行模式&#xff1a…

【Qt窗口】—— 浮动窗口

目录 1.1 浮动窗口的创建 1.2 设置停靠的位置 1.3 示例小结 在Qt中&#xff0c;浮动窗口也称之为铆接部件&#xff0c;俗称为子窗口&#xff0c;浮动窗口是通过QDockWidget类来实现浮动的功能。浮动窗口⼀般是位于核⼼部件的周围&#xff0c;可以有多个。 1.1 浮动窗口的…

LeetCode 热题100-39 对称二叉树

对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中…

【python报错已解决】AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 当我们使用某些Python库&#xff0c;如Pillow&#xff08;PIL的一个分支&#xff09;&#xff0c;进行图像处理时&#x…

设备共享租赁小程序系统开发制作方案

设备共享租赁小程序系统让用户方便地租赁或出租各类设备&#xff0c;包括但不限于工具、电子产品、运动器材等&#xff0c;以满足临时使用需求&#xff0c;同时为设备所有者创造额外收益。 目标用户 个人用户&#xff1a;需要临时使用工具、车辆等设备的个人。 企业用户&#…