C++进阶语法——STL 标准模板库(上)(Standard Template Library)【学习笔记(六)】

文章目录

    • STL 标准模板库
      • 1、 STL简介
      • 2、STL容器的类别
      • 3、STL迭代器的类别
      • 4、STL算法的类别
      • 5、泛型编程(generic programming)
      • 6、C++模板(template)
        • 6.1 函数模板(function template)
        • 6.2 类模板(class template)

STL 标准模板库

推荐 C++ 学习资料网站:C++ 参考手册

1、 STL简介

什么是STL:

  • ⼀个强⼤的、可复⽤的、⾃适应的泛型类和函数集合
  • 使⽤C++ 模板(templates)实现
  • 实现了常⻅的数据结构(data structures)和算法(algorithms)
  • 庞⼤的类库
  • 俄裔美籍程序员:Alexander Stepanov 1994年开发

容器,算法,迭代器是独立设计的,但是它们之间配合的很好

  • 容器(containers)
    • 各种对象或原始类型的集合
    • array、vector、deque、stack、set、map等
  • 算法(algorithms)
    • 处理容器元素序列的各种函数
    • find、max、count、accumulate、sort等
  • 迭代器(iterators)
    • 从容器中⽣成元素的序列
    • forward、reverse、by value、by reference、constant等

sort()算法需要使用元素的序列,这个时候需要使用到标准模板库中迭代器,使用 vec.begin() 和 vec.end() 可以将vec 的第一个元素到最后一个元素传给 sort,

在这里插入图片描述

accumulate(vec.begin(), vec.end(), 0) 中三个参数的表示是:vec.begin(), vec.end()表示迭代器,从哪里开始到哪里结束,0:表示累加的初始值,

在这里插入图片描述

2、STL容器的类别

  • 序列式容器(sequence containers)
    • array、vector、list、forward_list、deque
  • 关联式容器(associate containers)
    • set、multi set、map、multi map
  • 容器适配器(container adapters),无法使用迭代器
    • stack、queue、priority queue

3、STL迭代器的类别

  • 输⼊迭代器(input iterators)
    • 从容器到程序(对数据只读访问)
  • 输出迭代器(output iterators)
    • 从程序到容器(对数据只写访问)
  • 前向迭代器(forward iterators)
    • 向前推进迭代器(读写)
  • 双向迭代器(bi-directional iterators)
    • 向前、向后推进迭代器(读写)
  • 随机访问迭代器(random access iterators)
    • 直接获取容器元素(读写)

4、STL算法的类别

  • 约60个算法
  • ⾮质变的(non-modifying)
    • 不会改变元素内容,如查找、计数等
  • 质变的(modifying)
    • 会改变元素内容,如拷⻉、替换、删除等

5、泛型编程(generic programming)

  • 泛型编程
    • 类型参数化
  • 宏 Macro
  • 函数模板(function template)
  • 类模板(class template)

A、泛型编程

在这里插入图片描述

B、宏 Macro——不太推荐

下面的代码示例定义了 MAX 的宏,当预处理器看到 MAX 的时候会将参数自动替换为 a, b, 需要注意预处理器只会做简单的替换,并不懂C++语法,所以编译器编译的时候可能会出错,

在这里插入图片描述

如下图示例,预处理器只会做简单的替换,

在这里插入图片描述

使用括号,避免出现问题,

在这里插入图片描述

6、C++模板(template)

  • 蓝图(blueprint)
  • 函数和类模板,模板的核心思想就是类型的参数化,这样就可以根据实际需要来替换类型
  • 可以动态替换任何数据类型
  • 编译器会根据蓝图⽣成合适的函数和类
  • 泛型编程(generic programming)/元编程(Meta-programming)
6.1 函数模板(function template)

在这里插入图片描述

将类型泛化成⼀个名称,⽐如:T,当然也可以使用其他合法的标识符

在这里插入图片描述

  • 告诉编译器这是函数模板
  • 同时告诉它 T 是模板参数
  • 这段代码可以通过编译,但不会生成任何代码,只有当调用这个模板时编译器才会生成具体的函数,

在这里插入图片描述

• 此时编译器会根据模板⽣成合适的函数
• 发⽣在编译阶段

在这里插入图片描述

• 编译器可以根据c和d的类型猜出T的类型

在这里插入图片描述

• 适⽤于⼏乎任何类型
这个类型必须⽀持 > 操作符

在这里插入图片描述

• 可以有多个模板参数
• 他们的类型可以不⼀样

在这里插入图片描述

代码:

#include <iostream>
#include <string>using namespace std;template <typename T>
T min_func(T a, T b)
{return a < b ? a : b;
}template <class T1, class T2>
void display(T1 a, T2 b)
{cout << a << " " << b << endl;
}int main()
{// std::cout << min_func<int>(1, 2) << std::endl;// std::cout << min_func(1, 2) << std::endl;// std::cout << min_func('B', 'A') << std::endl;// std::cout << min_func(3.3, 2.2) << std::endl;// std::cout << min_func(5 + 2 * 9, 7 + 2 * 4) << std::endl;display<int, int>(1, 2);display(20, 30);display<char, double>('A', 3.3);display("Hello", "World");display(2000, string{"Hello"});return 0;
}
6.2 类模板(class template)
  • 类似函数模板
  • 允许各种类型的替换
  • 编译器会根据蓝图⽣成特定的类
  • vector 和 智能指针也是通过类模板实现的,

A

在这里插入图片描述

B

在这里插入图片描述

C

在这里插入图片描述

D

在这里插入图片描述

代码:

#include <iostream>
#include <string>
#include <vector>using namespace std;template <typename T>
class Item
{
private:std::string name;T value;public:Item(std::string name, T value): name{name}, value{value}{}std::string get_name() const { return name; }T get_value() const { return value; }
};template <typename T1, typename T2>
struct My_pair
{T1 first;T2 second;
};int main()
{// Item<int> item1{"alice", 100};// cout << item1.get_name() << " " << item1.get_value() << endl;// Item<string> item2{"bob", "C++"};// cout << item2.get_name() << " " << item2.get_value() << endl;// Item<Item<string>> item3{"carol", {"david", "C++"}};// cout << item3.get_name() << " " << item3.get_value().get_name() << " " << item3.get_value().get_value() << endl;// vector<Item<double>> vec;// vec.push_back(Item<double>("Frank", 100.0));// vec.push_back(Item<double>("George", 200.0));// vec.push_back(Item<double>("Harry", 300.0));// for (const auto &item : vec)//     cout << item.get_name() << " " << item.get_value() << endl;cout << "=====================" << endl;My_pair<std::string, int> p1{"hello", 100};My_pair<int, double> p2{200, 3.14};cout << p1.first << " " << p1.second << endl;cout << p2.first << " " << p2.second << endl;return 0;
}

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

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

相关文章

20231102从头开始配置cv180zb的编译环境(欢迎入坑,肯定还有很多问题等着你)

20231102从头开始配置cv180zb的编译环境&#xff08;欢迎入坑&#xff0c;肯定还有很多问题等着你&#xff09; 2023/11/2 11:31 &#xff08;欢迎入坑&#xff0c;本篇只是针对官方的文档整理的&#xff01;只装这些东西你肯定编译不过的&#xff0c;还有很多问题等着你呢&…

3.字符集和比较规则简介

3.字符集和比较规则简介 1.字符集和比较规则简介1.1 字符集简介1.2 比较规则简介1.3 一些重要的比较规则 2. MySQL 中支持的字符集和比较规则2.1 MySQL 的 utf8 和 utf8mb42.2 字符集查看2.3 比较规则查看 3. 字符集和比较规则的应用3.1 各级别的字符集和比较规则1. 服务器级别…

AR眼镜定制开发-智能眼镜的主板硬件、软件

AR眼镜定制开发是一项复杂而又重要的工作&#xff0c;它需要准备相关的硬件设备和软件。这些设备包括多个传感器、显示装置和处理器等。传感器用于捕捉用户的动作和环境信息&#xff0c;如摄像头、陀螺仪、加速度计等;显示装置则用于将虚拟信息呈现给用户;处理器用于处理和协调…

京东科技埋点数据治理和平台建设实践 | 京东云技术团队

导读 本文核心内容聚焦为什么要埋点治理、埋点治理的方法论和实践、奇点一站式埋点管理平台的建设和创新功能。读者可以从全局角度深入了解埋点、埋点治理的整体思路和实践方法&#xff0c;落地的埋点工具和创新功能都有较高的实用参考价值。遵循埋点治理的方法论&#xff0c;…

Web - Servlet详解

目录 前言 一 . Servlet简介 1.1 动态资源和静态资源 1.2 Servlet简介 二 . Servlet开发流程 2.1 目标 2.2 开发过程 三 . Servlet注解方式配置 ​编辑 四 . servlet生命周期 4.1 生命周期简介 4.2 生命周期测试 4.3 生命周期总结 五 . servlet继承结构 5.1 ser…

Content-Type 值有哪些?

1、application/x-www-form-urlencoded 最常见 POST 提交数据的方式。 浏览器的原生 form 表单&#xff0c;如果不设置 enctype 属性&#xff0c;那么最终就会以 application/x-www-form-urlencoded 方式提交数据。 <form action"http://www.haha/ads/sds?name小草莓…

Jmeter调用测试片段 —— 模块控制器

可以使用模块控制器调用测试片段。模块控制器提供了一种在运行时将测试片段替换为当前测试计划的机制。测试片段可以位于任何线程组中。 1、打开一个Jmeter窗口&#xff0c;添加好线程组、用户定义变量、模块控制器、测试片段、察看结果树。 2、用户定义变量同样定义好访问ip及…

NI-9236 国产化10 kS/s/ch,350 Ω四分之一桥应变计,8通道C系列应变/桥输入模块

10 kS/s/ch&#xff0c;350 Ω四分之一桥应变计&#xff0c;8通道C系列应变/桥输入模块 NI‑9236可同步测量所有通道的动态应变&#xff0c;从而实现了高速同步测量。 该功能对于需要在特定时刻对多个通道进行比较的应用&#xff08;例如冲击测试&#xff09;非常重要。\n\nNI…

SSM校园设备管信息管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

选题理由 随着计算机网络及多媒体技术的广泛应用&#xff0c;互联网已成为高校办学的基础设施和必备条件&#xff0c;基于互联网的高校信息管理越来越综合化&#xff0c;越来越多的教学管理、行政管理工作将架构在互联网上&#xff0c;互联网正在变为学校实施教学、科研和管理…

arcgispro中机器学习部分

参考链接 arcgis.learn 模块 |ArcGIS API for Python arcgis包位置 安装路径\GeoScene\Pro\bin\Python\envs\arcgispro-py3\Lib\site-package\arcgis 以automl进行训练工具为例&#xff0c;工具导入模块中涉及机器学习的模块 该模块所在位置 安装路径\GeoScene\Pro\bin\Py…

Flask路由机制分析之二

一、前言 上篇 《Flask 路由机制分析之一》主要讲了Python函数的特性以及装饰器的基本概念&#xff0c;这节我们具体分析一下路由内部机制&#xff0c;Flask路由依赖于werkzegu的routing模块来实现。 二、werkzegu的routing模块介绍 Werkzegu库的routing模块主要功能在于URL…

Selenium学习(Java + Edge)

Selenium /səˈliːniəm/ 1. 简介 ​ Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Safari、Google Chrome、Opera、Edge等。 ​ 适用于自动化测试&#x…

Zabbix监控原理 安装

一、监控介绍 1、监控目的 监控是需要站在公司的业务角度去考虑&#xff0c;而不是针对某个监控技术的使用 对系统不间断时实监控 实际上是对系统不间断的时实监控 实时反馈系统当前状态 我们监控某个硬件、或者系统&#xff0c;都是需要能时实看到当前系统的状态&#x…

进程优先级(nice值,top指令),独立性,竞争性,进程切换(时间片),抢占与出让,并发并行概念

目录 优先级 引入 为什么会存在优先级 特点 优先级值 nice值 更改nice值 top指令 独立性 竞争性 进程切换 引入 时间片 上下文切换 调度器 抢占与出让 强占 出让 并发和并行 并发 并行 优先级 引入 与权限不同的是,权限是能不能做的问题,优先级是什…

前端BOM、DOM

文章目录 BOM操作window对象navigator对象&#xff08;了解即可&#xff09;history对象location对象弹出框警告框确认框提示框 计时相关1.过一段时间之后触发&#xff08;一次&#xff09;2.每隔三秒时间触发一次 DOM操作HTML DOM树 查找标签直接查找间接查找 节点操作操作 获…

OMV 介绍及安装

# Time: 2023/11/02 #Author: Xiaohong # 运行电脑: Lenovo X201I (Intel(R) Core(TM) i3 CPU M 370 2.40GHz) # 功能: OMV 介绍及安装 导图 若OMV6 安装Extras 插件失败&#xff0c;可以参考 OMV6 安装Extras 插件失败的解决方法

Python Django 之模板继承详解(extends)

文章目录 1 概述1.1 目的1.2 标签&#xff1a;block、extends1.3 目录结构 2 templates 目录2.1 base.html&#xff1a;父页面2.2 login.html&#xff1a;子页面 3 其它代码3.1 settings.py3.2 views.py3.3 urls.py 1 概述 1.1 目的 模板继承 和 类继承 的目的是一样的&#…

力扣:148. 排序链表(Python3)

题目&#xff1a; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 示例&#xff1a; 示例 1&a…

vite vue3打包时出现TS类型错误解决最快速解决方案

快速解决看这里或者直接到 解决 packge.json中将build的vue-tsc命令删除 问题描述 在执行 npm build时报错 node_modules/.pnpm/element-plus2.3.4_vue3.3.7/node_modules/element-plus/es/components/tabs/index.d.ts:106:14106 readonly stretch: boolean;~~~~~~~The …

Go语言集成开发环境(IDE):GoLand 2023中文

GoLand 2023是一款由JetBrains开发的现代化、功能丰富的Go语言集成开发环境&#xff08;IDE&#xff09;。它提供了智能代码提示和自动完成、强大的内置调试器以及代码重构工具&#xff0c;帮助开发者提高编码效率并确保代码质量。GoLand 2023还支持多种版本控制系统&#xff0…