当前位置: 首页 > news >正文

C++复习笔记8

       泛型编程:编写的是与类型无关的通用代码,是代码复用的一种手段,模板是泛型编程的基础。

       1.函数模板:类型参数化,增加代码复用性。例如对于swap函数,不同类型之间进行交换都需要进行重载,但是函数体不变,就可以体现模板的优越性。

模板参数两种给出方法1.自动类型推导2.显示类型确定

#include<iostream>
using namespace std;//都是进行交换
//不同类型参数的重载代码冗余,复用性低
//模板是将类型当作参数进行传递//函数模板
template< typename T>
void Swap(T& a, T& b)
{cout << typeid(T).name() << endl;T tmp = a;a = b;b = tmp;
}void test01()
{int i1 = 10, i2 = 20;char c1 = 'a', c2 = 'b';double d1 = 1.5, d2 = 5.1;Swap(i1, i2);//自动类型推导Swap<char>(c1, c2);//显示类型指定Swap<double>(d1, d2);cout <<"i1= "  << i1  <<" i2=" <<i2 << endl;cout << "c1= " << c1 << " c2=" << c2 << endl;cout << "d1= " << d1 << " d2=" << d2 << endl;
}void main()
{test01();system("pause");
}

在自动类型推导中,T类型必须一致,不然出现二义性。 

解决方案1:

void test02()
{int a = 10;//4字节double b = 1.23;//8字节Swap(a, (int&)b);//Swap((double&)a, b);//报错 涉及引用修改了原空间范围Swap<int>(a, (int&)b);
}

解决方案2:

template< typename T1, typename T2>
void Swap(T1& a, T2& b)
{cout << typeid(T1).name() << endl;T1 tmp = a;a = b;b = tmp;
}

另一个例子:

#include<iostream>
using namespace std;template<typename T>
T Func(T a, T b)
{T value = a + b;return value;
}void  test01()
{int a = 10;double b = 1.35;Func(a, (int)b);Func((double)a, b);//不修改原空间大小,可以强转Func<int>(a, b);
}void main()
{test01();system("pause");
}

        在调用函数模板时,并不是直接执行函数模板,在编译器底层,模板会根据不同的类型传入生成不同的模板函数。所以母体就是函数模板,实际执行的是模板函数。所以模板看起来比较简洁,但是执行效率不高。

        模板实例化:调用函数模板,生成特定版本函数的过程。隐式实例化->模板类型推导,显式实例化通过<类型>确定。

       注意模板不会进行隐式类型转换,也就是类型的传入不能产生二义性。普通函数支持隐式类型转换。

       当函数模板和普通函数都匹配调用时,会采用最佳匹配原则。

#include<iostream>
using namespace std;template<typename T>
T Func(T a, T b)
{T value = a + b;return vale;
}int Func(int a, int b)
{int value = a + b;return value;
}void test01()
{Func(1, 2);//调上面Func(1.1, 2.2);//调下面Func('a', 'b');//调下面Func<int>('a', 'b');//调下面Func<int>(1, 2);//调下面;Func(1, 2.1);//调上面
}

 类模板:类中的数据类型参数化就可以得到类模板。注意函数模板的每一个成员函数在类外实现时都是函数模板,需要带上template<typename T>,在作用域限定符中也要加上<T>。

c++的类中需要常量可以用这三种方法给出:宏定义、 枚举(私有成员变量)、const常量(私有成员变量)。

#define AAA 8enum 
{ BBB=8};const int CCC = 8;

模板类的参数可以是一个已经实例化的模板类,例如使用vector实现二维数组。

vector<vector<int>> arr;

类模板:实例化时需要指定参数类型,它不能推导类型,利用类名<数据类型> 对象名来实例化。

类模板和函数模板都可以用于处理自定义数据类型,自定义类需要用到运算符重载。

内置类型的零初始化,固定写法,系统自动生成,不会发生隐式类型转换。其实就是赋各种0值。

零初始化也可以用于类模板,用于自定义数据类型。比较灵活。零初始化语法:T 变量名 = T();

调动默认构造函数(或者全缺省构造函数)进行赋值。

#include<iostream>
using namespace std;void main()
{int a = int();char ch = char();double d = double();float f = float();system("pause");
}

 类模板不支持分离编译,类模板的成员函数的创建时机在调用时,分文件编写时链接不到,所以一般通过包含.cpp或者.hpp(声明和定义放一起)的方式来给出。

extern 关键字:让全局变量在同一工程下被不同的.cpp文件外部引入并使用。

STL:标准模板库开个头:

六大组件:容器、算法、仿函数、迭代器、适配器(配接器)、空间配置器。

STL缺点:更新慢、不支持线程安全、追求效率导致内部复杂、存在代码膨胀的问题。但是作为大佬造好的轮子,不会不行!

P.J.版本对应vc6.0    SGI版本对应STL源码剖析。

#include<iostream>
#include<list>
using namespace std;void test01()
{list<int> mylist;for (int i = 0; i < 10; i++){mylist.push_back(i);}for (auto e : mylist){cout << e << "->";}cout << "over." << endl;for (list<int>::iterator it = mylist.begin(); it != mylist.end(); it++){cout << *it << "->";}cout <<"over."<<endl;
}void main()
{test01();system("pause");
}

        

相关文章:

C++复习笔记8

泛型编程&#xff1a;编写的是与类型无关的通用代码&#xff0c;是代码复用的一种手段&#xff0c;模板是泛型编程的基础。 1.函数模板&#xff1a;类型参数化&#xff0c;增加代码复用性。例如对于swap函数&#xff0c;不同类型之间进行交换都需要进行重载&#xff0c;但是函数…...

RabbitMQ入门

目录1. 搭建示例工程1.1. 创建工程1.2. 添加依赖2. 编写生产者3. 编写消费者4. 小结需求 官网&#xff1a; https://www.rabbitmq.com/ 需求&#xff1a;使用简单模式完成消息传递 步骤&#xff1a; ① 创建工程&#xff08;生成者、消费者&#xff09; ② 分别添加依赖 ③ 编…...

【计算机网络】Linux环境中的TCP网络编程

文章目录前言一、TCP Socket API1. socket2. bind3. listen4. accept5. connect二、封装TCPSocket三、服务端的实现1. 封装TCP通用服务器2. 封装任务对象3. 实现转换功能的服务器四、客户端的实现1. 封装TCP通用客户端2. 实现转换功能的客户端五、结果演示六、多进程版服务器七…...

idekCTF 2022 比赛复现

Readme 首先 []byte 是 go 语言里面的一个索引&#xff0c;比如&#xff1a; package mainimport "fmt"func main() {var str string "hello"var randomData []byte []byte(str)fmt.Println(randomData[0:]) //[104 101 108 108 111] }上面这串代码会从…...

jvm的类加载过程

加载 通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.Class对象&#xff0c;作为方法区这个类的各种数据的访问入口链接 验证 验证内容的合法性准备 把方法区的静态变量初…...

VOC数据增强与调整大小

数据增强是针对数据集图像数量太少所采取的一种方法。 博主在实验过程中&#xff0c;使用自己的数据集时发现其数据量过少&#xff0c;只有280张&#xff0c;因此便想到使用数据增强的方式来获取更多的图像信息。对于图像数据&#xff0c;我们可以采用旋转等操作来获取更多的图…...

Linux 安装jenkins和jdk11

Linux 安装jenkins和jdk111. Install Jdk112. Jenkins Install2.1 Install Jenkins2.2 Start2.3 Error3.Awakening1.1 Big Data -- Postgres4. Awakening1. Install Jdk11 安装jdk11 sudo yum install fontconfig java-11-openjdk 2. Jenkins Install 2.1 Install Jenkins 下…...

Pandas——Series操作【建议收藏】

pandas——Series操作 作者&#xff1a;AOAIYI 创作不易&#xff0c;觉得文章不错或能帮助到你学习&#xff0c;可以点赞收藏评论哦 文章目录pandas——Series操作一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.创建Series2.从具体位置的Series中访问数据3.使…...

JUC并发编程Ⅰ -- Java中的线程

文章目录线程与进程并行与并发进程与线程应用应用之异步调用应用之提高效率线程的创建方法一&#xff1a;通过继承Thread类创建方法二&#xff1a;使用Runnable配合Thread方法三&#xff1a;使用FutureTask与Thread结合创建查看进程和线程的方法线程运行的原理栈与栈帧线程上下…...

基于vue-admin-element开发后台管理系统【技术点整理】

一、Vue点击跳转外部链接 点击重新打开一个页面窗口&#xff0c;不覆盖当前的页面 window.open(https://www.baidu.com,"_blank")"_blank" 新打开一个窗口"_self" 覆盖当前的窗口例如&#xff1a;导入用户模板下载 templateDownload() {wi…...

【C语言学习笔记】:通讯录管理系统

系统中需要实现的功能如下&#xff1a; ✿ 添加联系人&#xff1a;向通讯录中添加新人&#xff0c;信息包括&#xff08;姓名、性别、年龄、联系电话、家庭住址&#xff09;最多记录1000人 ✿ 显示联系人&#xff1a;显示通讯录中所有的联系人信息 ✿ 删除联系人&#xff1a;按…...

开关电源环路稳定性分析(10)——OPA和OTA型补偿器传递函数

大家好&#xff0c;这里是大话硬件。 在前面9讲的内容中将开关电源环路分析进行了梳理&#xff0c;我相信很多人即使都看完了&#xff0c;应该还是不会设计&#xff0c;而且还存在几个疑问。比如我随便举几个&#xff1a; 开关电源的带宽怎么设定&#xff1f;开关电源精度和什…...

2.11知识点整理(关于pycharm,python,pytorch,conda)

pycharm 设置anaconda环境&#xff1a; File -> Settings->选择左侧的project xxx再选择打开Project Interpreter页->选择add添加解释器->添加Anaconda中Python解释器&#xff08;Anaconda安装目录下的python.exe&#xff09; (选择existing environment &#xff…...

Linux服务器开发-2. Linux多进程开发

文章目录1. 进程概述1.1 程序概览1.2 进程概念1.3 单道、多道程序设计1.4 时间片1.5 并行与并发1.6 进程控制块&#xff08;PCB&#xff09;2. 进程的状态转换2.1 进程的状态2.2 进程相关命令查看进程实时显示进程动态杀死进程进程号和相关函数3. 进程的创建-fork函数3.1 进程创…...

Excel中缺失数据值的自动填充

目录简单方法示例1&#xff1a;数据满足线性趋势示例2&#xff1a;数据满足增长(指数)趋势参考实验做完处理数据&#xff0c;发现有一组数据因为设备中途出现问题缺失了&#xff0c;之前做过的数据也找不到&#xff0c;为了不影响后续处理&#xff0c;这里使用Excel插入缺失值。…...

路由器刷固件

前言 我希望可以远程访问我的电脑。但&#xff0c;我不希望电脑总是处于运行状态&#xff0c;因为那样比较费电。所以需要一个方案&#xff0c;能将睡眠/关机中的电脑唤醒。 方案一&#xff1a;选用智能插座&#xff0c;远程给电脑上电。电脑设置上电自启。但&#xff0c;这存…...

leetcode: Two Sum II - Input Array is Sorted

leetcode: Two Sum II - Input Array is Sorted1. 题目2. 解答3. 总结1. 题目 Given a 1-indexed array of integers numbers that is already sorted in non-decreasing order, find two numbers such that they add up to a specific target number. Let these two number…...

STL——list

一、list介绍及使用 1. list文档介绍 &#xff08;1&#xff09;list是可以在常数范围内&#xff0c;在任意位置进行插入、删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 &#xff08;2&#xff09;list的底层是带头结点的双向循环链表&#xff0c;其中每个元素…...

实战打靶集锦-004-My-Cmsms

**写在前面&#xff1a;**记录一次艰难曲折的打靶经历。 目录1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 WEB服务探查4.1.1 浏览器访问4.1.2 目录枚举4.1.3 控制台探查4.1.4 其他目录探查4.2 阶段小结5. 公共EXP搜索5.1 CMS搜索5.2 Apache搜索5.3 PHP搜索5.4 MySQL搜索5…...

c++代码实现我的世界(14)

c代码实现我的世界14|生成地貌兼工作台1前言的前言~前言生成地貌函数结构体struct dimao根据比例生成地貌工作台函数准备的东西写在最后前言的前言~ 实在对不起大家&#xff0c;有挺长时间没更新了。 前言 今天我们将写生成地形的函数与工作台前传的代码&#xff1b; 注&…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...