C++ ——模板 & 标准模板库STL

2023-11-01

C++

  • 知识基础
  • 流操作符
  • 类 & 基础
  • 初始化和重载
  • 类 & 高级
  • 继承和多态
  • 模板 & 标准模板库STL


在函数重载我们会遇到两个函数除了某些形参类型不同外,其余包括操作步骤,形参数量等完全一致;使用重载显然是复杂的,所以提出了模板的概念!

一、模板

在设计过程中出现的与数据类型无关的过程,不论什么数据类型,都有相同的操作集合,可以定义模板–>仅仅描述函数/类的结构,编译系统不会为模板产生任何可执行代码!

1.函数模板

函数模板的定义:

template<类型参数表>
返回值类型 函数名(形参列表){
	函数体;
}
/*例*********************************************************/
template<class T>
T square(T number){
	return number*number;
}

template关键字:模板定义的开始符;
<类型参数列表>:说明模板中可能出现的数据类型种类,使用逗号区分多个类型。以class或typename 参数名,~ 声明,一个参数名代表一种不同的数据类型!
模板函数:在之后的函数中,逻辑意义上可以替换的所有数据类型都用类型参数列表中的参数名表示!

  • 在编译器进行函数调用时,对模板函数,才在内存中创建一个函数实例,根据传递的实参类型和返回值确定模板中的参数数据类型如何替换,完成函数任务。
  • 模板的定义必须出现在调用之前!
  • 在模板使用操作符时,如果传入的参数是用户自定义的对象类型,必须要保证该类重载了使用到的操作符!
  • 函数模板支持重载!

2.类模板

定义方式与函数模板类似,首先在类定义之前加上template关键字,声明数据类型参数列表,然后将整个类中参数类型使用到的地方进行替换!

  • 在实例化模板类的时候,实例化模板类,必须要指明传递给类模板的数据类型;
template <class T>
class test{
	T data;
	数据成员;
	函数成员;
}
/**定义函数成员*********/
test<T>::test(){//这里对于模板类的使用一定要指明“类名<模板类型>”
	构造函数;
}
  • 模板类同样支持继承!
  • 模板类对象的创建必须指明传递给类模板的数据类型,并放在尖括号中;
test<int>t; //定义了一个test类的对象,并且是int类型的
/***继承***********/
class sub_test:public test<T>{//继承自父类
	sub_test(int s):test<T>(s){//调用的是父类的构造函数,初始化父类
		构造函数;
	}
}

二、标准模板库STL

标准模板库(Standard Template Library)是一个C++提供的程序库,包含了常用的数据结构和算法,体现了软件的复用性。我们从它的三个组成部分进行介绍!

1.容器类(Container)

容器类是管理序列的类,容纳一组对象的类,通过容器类提供的成员函数,可以实现向序列中插入、删除、查找元素等操作。

顺序容器:

  • vector:矢量容器,容器后面快速插入删除,直接访问任何元素,基于数组!
    动态数组,自动调整所占内存的大小,常见操作:
#include <iostream>
#include <vector>
using namespace std;int main(){
	//创建容器
    vector<int> t1; //空   
    vector<int> t2(10); //创建初始总容量10的容器
    vector<int> t3(10,1); //创建初始总容量10的容器每个元素的值都为1(可以是变量)
    vector<int> t4(t2); //通过存储元素类型相同的其它vector 创建新的vector//赋值 初始化
	t1.assign(3,1); //元素1复制3份加入容器
	//添加元素
	t1.push_back(elem); //在尾部添加元素
	t2.inster(position, elem); //任意位置插入元素(效率低)
	//读取元素
	t2[0]; //下标运算使用类似数组,list是不支持的
	t3.front(); //返回首元素
	t3.back(); //返回尾元素
	//其他操作
	t3.pop_back(); //删除容器尾元素
	/*通用的:empty,size,clear,关系运算符等*/
    return 0;
}
  • deque:双端队列容器,容器两端的快速插入删除,直接访问任何元素。
    使用类似于vector,内部实现机制和执行性能不同,队头队尾元素出入操作效率高,也可以看作是一个可随机访问的数组;
#include <iostream>
#include <deque>
using namespace std;
  • list:列表容器,容器任意位置快速插入删除,基于双链表!
    使用双向链表实现,适用于经常插入删除元素的场景。
#include <iostream>
#include <list>
using namespace std;
/**list提供了sort成员函数,因为它不是可随机访问的不支持[]**/

以上,三种顺序容器有许多相同的基本成员函数,实现插入删除等基础操作;

关联容器:
这些容器使用映射的方式将元素值与键值相关联,底层采用树形,实现快速操作!

  • set:集合容器,用于快速查找,不允许重复元素;
  • multiset:多重集合容器,快速查找,允许重复元素;

这两种容器,集合中的所有的数值就是关键字,不必有另一组值与关键字相关联,其底层数据结构通常为红黑树,可以在对数时间内实现查找、插入、删除,默认元素按照升序排列,以set为例:

#include<iostream>
#include<set>
using namespace std;

int main(){
	//创建容器
    set<int> t1; //空   
	//添加元素
	t1.insert(elem); 
	//查找元素
	t1.find(key); //查找键值为key的元素是否存在,返回对应的迭代器
	//删除操作
	t1.erase(key); //删除键值为key的元素
	/*其他的:多重集合中有 count(key) 进行计数*/
    return 0;
}
  • map:映射容器,一对一映射,关键字快速查找,不允许重复值;
  • multimap:多重映射容器,一对多映射,关键字快速查找,允许重复值;

用于快速存储和读取关键字与关键值,按照关键字排序,以map为例:

#include<iostream>
#include<map>
using namespace std;

int main(){
   //创建容器
   map<int, string> t1; //分别指出映射前键的类型 映射后值的类型,创建了一个空map
   //添加元素
   t1.insert(pair<int, string>(1, "one")); 
   t1.insert(map<int, string>::value_type<int, string>(1, "two")); 
   t1[3] = "three"; //注意可以使用下标操作,下标是关键字类型的!
   //查找元素
   t1.find(key); //查找键值为key的元素是否存在,返回对应的迭代器
   //删除操作
   t1.erase(key); //删除键值为key的元素
   /*其他的:多重集合中有 count(key) 进行计数*/
   return 0;
}

容器适配器:
并非独立的容器,依附于一种顺序容器进行功能扩展或限制!

  • stack:栈,默认使用deque实现,使用时指明栈中元素类型;
    stack<int>s 创建了一个空栈,元素为int型,操作只有s.pop(); s.push(elem);
  • queue:队列,默认使用deque实现,使用时指明队列中的元素类型;
    queue<int>q 创建了一个空栈,元素为int型,操作只有q.pop(); q.push(elem);

2.迭代器(Iterator)

迭代器提供了顺序访问容器中的每一个元素,不暴露对象内部表示的方法,相当于智能指针,指向容器内部数据,可以通过*获取值,通过++ --移动,遍历容器,每个容器中都定义了这样的迭代器,用来存取容器内的值。
容器内关于迭代器的成员:
begin():返回容器中第一个元素的迭代器;
end():返回容器中最后一个元素的迭代器;
find():返回找到的元素的迭代器,否则返回end() 迭代器;

注意:想要接收成员函数返回的迭代器值,要声明相应的迭代器变量

vector<int>::iterator itr = t.begin(); //对迭代器赋值 首元素迭代器

迭代器 五种四级,通过迭代器可以结合 容器 和 泛型算法 ,泛型算法中使用的迭代器做形参,在容器调用时可以特换成某一中指针!

3.泛型算法

实现与容器类型无关的操作,如排序、查询等操作的算法,所有泛型算法的前两个参数是两个迭代器,指示操作在容器中的开始位置 和 结束位置!

template<typename InputIterator,typename T>
InputeIteator find(InputIterator frist,InputInterator last,const T value){
	for(;frist != last; ++frist){
		if(value == *frist)
			return frist;
	}
	return last;
}

总结

模板只是提高代码复用率的手段而已,对于仅与结构相关的数据结构或者算法有很好的实现效果;所以我们要重点掌握标准模板库中的常用容器的使用,对我们开发有很大的帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ ——模板 & 标准模板库STL 的相关文章

  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • 【金融申请评分卡】目标变量界定

    一 目标变量是什么 目标变量就是假定申请客户的好坏 逻辑回归公式里的Y 先来看下逻辑回归公式 y 11 e z y 1 1 e z
  • c++入门到精通教程 c++11/14/17-王健伟-专题视频课程

    c 入门到精通教程 c 11 14 17 528人已学习 课程介绍 本教程适合那些只有一点点c语言编程知识的新手 也适合那些c 98标准已经掌握的不错但对c 11 14 17新标准基本无所知的c 开发老手 欢迎大家尽早加入学习 请大家从授课
  • 网络流媒体(七)———RTSP

    RTSP协议介绍 RTSP协议的一些分析 一 一些字符串函数的使用 RTSP协议的一些分析 二 printf类似函数 sscanf以及log保存到内存中 printf输入重定位 1 简介 DSP产生的媒体流需要通过网络传送到客户端 如图1
  • python编程遵循哪些规律_Python实操(3):python编程规范

    选择pythoncharm作为Python开发ide也是在网上查了好长时间 这两天了解到visual studio code强大 易用 同时也一直用visual studio做c c 开发 所以决定把以后的开发平台切换到微软系 换平台以后发
  • 前后端分离:SpringBoot项目部署服务器操作步骤详细

    部署后端 SpringBoot到服务器 首先就是对自己项目application yaml进行配置 此处使用过多mysql8 0 spring datasource url jdbc mysql 127 0 0 1 3306 book se
  • 计算机网络笔记and题解

    上次博客就写了一点划分子网和子网掩码相关的计算 然后还要一个重要的五分类编址CIDR 也就是构造超网 无分类编址CIDR Classless Inter Domain Routing 正式名字是无分类域间路由选择 特点 1 CIDR消除了传
  • 秒级数据转化为分钟级数据sql编写

    前言 利用python读取hive 将hive中秒级数据转化为以10分钟为间隔的数据 除时间与设备id外所有字段的值求平均值 代码 连接hive 创建连接通道 并且得到连接通道的钥匙 句柄 conn connect host 地址 port
  • 存储过程解析

    使用存储过程来解决涨工资 涨工资 总裁涨1000 经理涨800 其他人涨400 伪代码 ResultSet rs select empno job from emp While rs next Int eno rs getInt empno
  • Stable diffusion加载safetensors 模型出现Exception: device privateuseone:0 is invalid

    一 问题 博主用CPU硬解 Stable diffusion sd v1 4 ckpt能跑 但换成v1 5 pruned emaonly safetensors等最新格式的模型就出现Exception device privateuseon
  • MATLAB数据可视化

    MATLAB数据可视化 二维绘图 plot命令 plot y plot x y plot x y s 常见的二维绘图常用设置选项 fplot 三维绘图 plot3 mesh 函数 绘制参数网状表面图 surf 函数 绘制三维阴影曲面图 辅助
  • 蓝桥杯:三羊献瑞(答案不唯一)

    目录 题目描述 题目分析 测试用的代码 Java 答案 因为我个人做选择题有把所有可能性列举的习惯 所以我习惯性列举一下 发现答案并不像题目里面说的 三羊献瑞是唯一的 具体看我的测试用例 Test 但是结果呢 题目描述 本题为填空题 只需要
  • 软件测试和软件开发哪个发展更好

    经常有想转IT行业的同学 在了解软件测试和软件开发之后不知道转那个岗位好 今天就系统的 从多个维度来比较软件测试与软件开发 具体包括从基本素质要求 性格要求 入职门槛 知识结构 竞争压力 职业发展 职业前景等 希望能给在选择软件测试与开发朋
  • java设计模式之抽象工厂模式

    什么是抽象工厂设计模式 抽象工厂模式是一种创建型设计模式 它提供了一种创建一系列相关或依赖对象的方法 而无需指定它们具体的类 抽象工厂模式是工厂方法模式的扩展 它使用一组相关的工厂来创建对象 而工厂方法模式只是使用一个单一的工厂 在抽象工厂
  • APP移动端测试+安装+ADB命令的介绍

    重点 app测试的内容 add命令 monkey命令 次重点 模拟器的安装 雷电 夜神 android的自带的模拟器使用 常规测试 真机测试 简单了解云测Testing 腾讯云 在职小伙伴下周演示 了解 市场有的移动端的操作系统有 1 an
  • LeetCode技巧篇(一)prefix sum 前缀和

    介绍 前缀和 prefix sum 是算法题中比较实用的一种技巧 当算法题的背景是整数型数组且出现 子数组和 或者 连续的子数组 既可以考虑使用前缀和来求解会得到不错的效果 假设给定的数组A各个元素分别为 那么我们可以得到一个前缀和数组B
  • ICCV 2023

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 3D点云和Transformer 交流群 本文介绍我们在ICCV 2023上接收的论文 PointCLIP V2 Adapting CLIP for P
  • snull驱动环境搭建与测试分析

    Here are possible values for the network numbers Once you put these lines in etc networks you can call your networks by
  • SpringBoot/Spring Cloud常见注解(面试)

    RequestMapping 在Spring MVC 中使用 RequestMapping 来映射请求 也就是通过它来指定控制器可以处理哪些URL请求 将请求和处理请求的控制器方法关联起来 建立映射关系 这个控制器方法请求路径为http l
  • inno setup的安装及简单使用

    文章目录 安装 使用 1 添加中文安装字体 2 制作使用管理员权限启动的安装包 2 1下载安装 Resource Hacker http www angusj com resourcehacker 2 2 安装并打开ResourceHack
  • C++ ——模板 & 标准模板库STL

    C 知识基础 流操作符 类 基础 初始化和重载 类 高级 继承和多态 模板 标准模板库STL 目录 C 一 模板 1 函数模板 2 类模板 二 标准模板库STL 1 容器类 Container 2 迭代器 Iterator 3 泛型算法 总