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 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

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

    一 目标变量是什么 目标变量就是假定申请客户的好坏 逻辑回归公式里的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 泛型算法 总