C++模板编程和标准模板库(STL)

1、C++模板编程

1)函数模板

#include <iostream>
using namespace std;// 声明一个泛型类型T,参数化数据类型
template <typename T>
// 定义一个函数模板
T man(T a, T b) {return (a>b?a:b);
}int main()
{// 使用的时候没有指定参数类型,编译器会自动推导cout << "Hello World " << max(6, 2);return 0;
}

2)模板定义

template <typedef T>
// 使用class效果相同,
// 为了不和类的定义发生歧义,尽量使用typedef
template <class T>
// 也可以定义多个类型,但是定义了一定要用,否则报错
template <typedef T1, typedef T2>

3)函数模板调用

显示调用

max<int,int>(1, 2);

隐式调用(自动推导)

max(1, 2);

总结:模板的定义,相当于定义了一个占位符,这个占位符在编译时确定(理解为直接替换,类似宏定义),占位符的类型由参数来确定。
对于一个函数模板的调用(因为是调用的时候能确定参数类型),编译器会在编译时生成对应函数(模板函数)。

4)类模板

#include <iostream>
using namespace std;// 声明一个泛型类型T,参数化数据类型
template <typename T1, typename T2>
// 定义一个类模板
class TempClass {
public:T1 key;T2 val;
public:TempClass(T1 k, T2 v){key=k;val=v;};
};int main()
{// 定义一个模板类对象,指定泛型类型TempClass<int, int> test(5, 2);cout << test.key << " " <<test.val << endl;// 定义一个模板类对象,指定泛型类型TempClass<string, int> test2("123", 2);cout << test2.key << " " <<test2.val << endl;return 0;
}
}

总结:定义了模板之后,在随后定义的类内部如果使用了这个模板类型,那么这就是个类模板,编译器在检测到使用这个类模板实例化对象之后,会根据指定的参数类型得到模板类,该实例就是这个模板类的实例。
由类模板实例化得到的类叫模板类。

5)类内的函数模板

类内的函数模板只有在被调用的时候才会实例化,这点和函数模板特性一致。

#include <iostream>
using namespace std;// 声明一个泛型类型T,参数化数据类型
template <typename T1, typename T2>
// 定义一个类模板
class TempClass {
public:T1 key;T2 val;
public:TempClass(T1 k, T2 v){key=k;val=v;};// 定义一个类内函数模板void PT(T2 a){cout << "PT " << a;};
};int main()
{// 定义一个模板类对象,指定泛型类型TempClass<int, int> test(5, 2);test.PT(666);return 0;
}

注意:模板类型在对象定义的时候就确定了,调用类内模板函数的时候类型要一致。

C++函数模板的详细讲解
C++类模板(模板类)详解
在线测试代码


2、C++标准模板库

1、STL 是 C++ 标准库的一部分
2、STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。

1)容器

图片来源@软件技术爱好者,感谢
在这里插入图片描述

C++之STL(标准模板库)介绍


3、RAII机制

RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。

解决一般的问题,有些操作,比如,分配释放内存,加锁解锁等,需要成对出现,否则就会出现问题,内存泄漏,死锁等。
那么要保证操作的成对,需要在规则上实现,而不是靠用户去操作。

使用资源的一般过程,,
1、获取到资源
2、使用资源
3、释放资源

利用局部变量的自动申请和销毁的特性,结合累的构造和析构方法,实现成对操作的简便化处理。

具体操作如下:

#include <iostream>
using namespace std;class Body {public:Body(){cout << "申请资源(分配/加锁)" << endl;}~Body(){cout << "释放资源(释放/解锁)" << endl;}void useBody() {cout << "使用资源" << endl;}
};int main()
{// 复杂易错的资源管理过程就能做成像使用局部变量那样简单Body body;body.useBody();return 0;
}

QT里面的 QMutexLocker 加锁貌似就是这种思想的体现。

详解C++11 RAII机制

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

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

相关文章

开源3D激光(视觉)SLAM算法汇总(持续更新)

原文连接 目录 一、Cartographer 二、hdl_graph_slam 三、LOAM 四、LeGO-LOAM 五、LIO-SAM 六、S-LOAM 七、M-LOAM 八、livox-loam 九、Livox-Mapping 十、LIO-Livox 十一、FAST-LIO2 十二、LVI-SAM 十三、FAST-Livo 十四、R3LIVE 十五、ImMesh 十六、Point-LIO 一、Cartograph…

canvas基础3 -- 交互

点击交互 使用 isPointInPath(x, y) 判断鼠标点击位置在不在图形内 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

拿到 phpMyAdmin 如何获取权限

文章目录 拿到 phpMyAdmin 如何获取权限1. outfile 写一句话木马2. general_log_file 写一句话木马 拿到 phpMyAdmin 如何获取权限 1. outfile 写一句话木马 尝试使用SQL注入写文件的方式&#xff0c;执行 outfile 语句写入一句话木马。 select "<?php eval($_REQU…

电商独立站前端、后端、接口协议和电商API接口请求方式

前端是做什么的&#xff1f;后端是做什么的&#xff1f;哪些事情&#xff0c;是前端做的&#xff1f;哪些事情&#xff0c;是后端做的&#xff1f;前后端一体是什么意思&#xff1f;接口、接口协议、接口请求方式…… 1、前端所写的程序&#xff0c;主要运行在客户端&#xff…

postgresql14管理(六)-备份与恢复

定义 备份&#xff08;backup&#xff09;&#xff1a;通过物理复制或逻辑导出的方式&#xff0c;将数据库的文件或结构和数据拷贝到其他位置进行存储&#xff1b; 还原&#xff08;restore&#xff09;&#xff1a;是一种不完全的恢复。使用备份文件将数据库恢复到备份时的状…

项目|金额场景计算BigDecimal使用简记

前言 在实际项目开发中&#xff0c;我们经常会遇到一些金额计算&#xff0c;分摊等问题&#xff0c;通常我们都使用java.math.BigDecimal 来完成各种计算&#xff0c;避免使用浮点数float,double来计算金额&#xff0c;以免丢失精度&#xff0c;以下是博主部分使用场景和使用Bi…

[Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷

一.Docker 部署 Nginx 以及端口映射 Docker 部署 Nginx,首先需要下载nginx镜像,然后启动这个镜像,就运行了一个nginx的容器了 1.下载 nginx 镜像并启动容器 #查看是否存在nginx镜像:发现没有nginx镜像 [rootlocalhost zph]# docker images | grep nginx#下载nginx镜像 [rootl…

【Spring】IOC容器与Bean的常用属性配置

文章目录 1.前言2.IOC容器2.1 BeanFactory 容器2.2 ApplicationContext 容器 3.Bean的常用属性配置4. 总结 1.前言 在之前的文章-IOC的快速入门中讲过Bean这个概念. 本来就来介绍容器与Bean的常用属性配置 在Spring框架中&#xff0c;Bean指的是被Spring加载生成出来的对象。 …

12、SpringCloud -- redis库存和redis预库存保持一致、优化后的压测效果

目录 redis库存和redis预库存保持一致问题的产生需求:代码:测试:优化后的压测效果之前的测试数据优化后的测试数据redis库存和redis预库存保持一致 redis库存是指初始化是从数据库中获取最新的秒杀商品列表数据存到redis中 redis的预库存是指每个秒杀商品每次成功秒杀之后…

永恒之蓝漏洞 ms17_010 详解

文章目录 永恒之蓝 ms 17_0101.漏洞介绍1.1 影响版本1.2 漏洞原理 2.信息收集2.1 主机扫描2.2 端口扫描 3. 漏洞探测4. 漏洞利用5.后渗透阶段5.1创建新的管理员账户5.2开启远程桌面5.3蓝屏攻击 永恒之蓝 ms 17_010 1.漏洞介绍 永恒之蓝&#xff08;ms17-010&#xff09;爆发于…

安装虚拟机(VMware)保姆级教程及配置虚拟网络编辑器和安装WindowsServer以及宿主机访问虚拟机和配置服务器环境

目录 一、操作系统 1.1.什么是操作系统 1.2.常见操作系统 1.3.个人版本和服务器版本的区别 1.4.Linux的各个版本 二、VMware Wworkstation Pro虚拟机的安装 1.下载与安装 注意&#xff1a;VMWare虚拟网卡 2.配置虚拟网络编辑器 三、安装配置 WindowsServer 1.创建虚拟…

自动化项目实战 [个人博客系统]

自动化博客项目 用户注册登录验证效验个人博客列表页博客数量不为 0 博客系统主页写博客 我的博客列表页效验 刚发布的博客的标题和时间查看 文章详情页删除文章效验第一篇博客 不是 "自动化测试" 注销退出到登录页面,用户名密码为空 用户注册 Order(1)Parameterized…

QT5.15在Ubuntu22.04上编译流程

在我们日常遇到的很多第三方软件中&#xff0c;有部分软件针对开发人员&#xff0c;并不提供预编译成果物&#xff0c;而是需要开发人员自行编译&#xff0c;此类问题有时候不是问题&#xff08;编译步骤的doc详细且清晰时&#xff09;&#xff0c;但有时候又很棘手&#xff08…

数据结构上机实验——二叉树的实现、二叉树遍历、求二叉树的深度/节点数目/叶节点数目、计算二叉树度为1或2的节点数、判断二叉树是否相似

文章目录 数据结构上机实验1.要求2.二叉树的实现2.1创建一颗二叉树2.2对这棵二叉树进行遍历2.3求二叉树的深度/节点数目/叶节点数目2.4计算二叉树中度为 1 或 2 的结点数2.5判断2棵二叉树是否相似&#xff0c;若相似返回1&#xff0c;否则返回0 3.全部源码测试&#xff1a;Bina…

问题 S: 一只小蜜蜂...(初始化dp)

1.注意点&#xff1a; 该题递推公式为斐波那契数列&#xff0c;而n达到50&#xff0c;是非常大的数 &#xff0c; 故应用循环代替递归&#xff0c;同时记录数据 同时用long long数组储存 ​​ 2.注意点&#xff1a;初始化起点&#xff0c;切忌重新递归找数 可以直接初始化所…

前端重新部署如何通知用户更新

标题解决方案 常用的webSocket解决方案 webSocket; 大致逻辑思考应该是前端在部署好后向服务器发送一个状态变更通知&#xff1b;服务器接收后主动向前端push&#xff1b;前端通过心跳检测&#xff0c;接收到相关更新时弹出提示&#xff0c;让用户确认更新&#xff1b; 缺点&a…

设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)

初始化及打印函数 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #define MaxSize 10//定义最大长度 int InitArr[10] { 1,2,3,4,5,6,7,8,9,10 };typedef struct {int data[MaxSize];//用静态的数据存放数据元素int length;//顺序表当前长度 }Sqlist;//顺序表的类…

Ubuntu自建git服务器

Ubuntu 安装 gitlab-ce sudo apt-get update sudo apt-get install gitlab-ce 安装成功 sudo apt-get install gitlab-ce 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列【新】软件包将被安装&#xff1a;gitlab-ce 升…

私有云:【5】安装VCenter Server

私有云&#xff1a;【5】安装VCenter Server 1、在本地物理机上安装VCenter Server到Esxi1.1、开始安装第一阶段1.2、开始安装第二阶段 2、配置VCenter2.1、分配许可2.2、添加主机2.3、创建数据存储NFS 1、在本地物理机上安装VCenter Server到Esxi 安装前在AD域服务器配置好VC…

MAYA教程之建模基础命令介绍

基础命令 视图相关操作 旋转视图 : ALT 鼠标左键平移视图 : ALT 鼠标中键缩放视图 : 滚动鼠标滚轮 或者 ALT 鼠标右键切换视图 : 空格键回到模型 : F 视图状态 选择状态 : Q移动状态 : W旋转状态 : E缩放状态 : R 视图显示 正常显示 : 1正常圆滑同时显示 : 2圆滑显示 …