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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MAMP Pro 6.8.1

MAMP Pro是一款MacPHP/MySQL开发环境软件&#xff0c;可以将电脑变成一个完整的Web开发环境。无论个人开发者、网站管理员还是团队协作&#xff0c;MAMP Pro都提供了强大的工具和便捷的管理方式&#xff0c;能够更加高效地构建和测试网站。 MAMP Pro的基本功能包括集成AMP环境&…

【网络协议】聊聊套接字socket

网络编程我们知道是通过socket进行编程的&#xff0c;其实socket也是基于TCP和UDP协议进行编程的。但是在socket层面是感知不到下层的&#xff0c;所以在设置参数的时候&#xff0c;其实是端到端协议智商的网络层和传输层。TCP是数据流所以设置为SOCK_STREAM&#xff0c;而UDP是…

实现基于 Azure DevOps 的数据库 CI/CD 最佳实践

数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节&#xff0c;也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中&#xff0c;像处理代码那样处理数据库变更呢&#xff1f; DORA 调研报告 DORA&#xff08;DevOps Research &am…

​学习一下,什么是预包装食品?​

预包装食品&#xff0c;指预先定量包装或者制作在包装材料和容器中的食品&#xff1b;包括预先定量包装以及预先定量制作在包装材质和容器中并且在一定量限范围内具有统一的质量或体积标识的食品。简单说&#xff0c; 就是指在包装完成后即具有确定的量值&#xff0c;这一确定的…

Ajax学习笔记第4天

做决定之前仔细考虑&#xff0c;一旦作了决定就要勇往直前、坚持到底&#xff01; 【1 模仿百度招聘】 整个流程展示&#xff1a; 1.文件目录 2.页面效果展示及代码 data中的page1数据展示 2.1 主页 index.html:index里面代码部分解释 underscore.js :模板页面的相关代码 &…

2023最新版本 FreeRTOS教程 -1-标准库移植FreeRTOS

源码下载 官网下载驱动 点击直达 源码剪裁 剪裁之后的图片,找我免费获取 添加进MDK 配置滴答定时器 全部工程获取 查看下方头像

微服务框架SpringcloudAlibaba+Nacos集成RabbiMQ

目前公司使用jeepluscloud版本&#xff0c;这个版本没有集成消息队列&#xff0c;这里记录一下&#xff0c;集成的过程&#xff1b;这个框架跟ruoyi的那个微服务版本结构一模一样&#xff0c;所以也可以快速上手。 1.项目结构图&#xff1a; 配置类的东西做成一个公共的模块 …

省市区三级联动查询redis(通过python脚本导入数据)

最近工作有一个工作需求是实现省市区联动&#xff0c;点击省下拉框&#xff0c;选中一个省&#xff0c;然后再选市&#xff0c;最后选区&#xff0c;当然最重要的首先自然是数据了&#xff0c;没数据怎么测试接口&#xff0c;我数据是在 https://hxkj.vip/demo/echartsMap/ 这里…

小程序request请求封装

以上为本人的项目目录 1.首先在utils中创建request.js文件封装request请求&#xff0c;此封装带上了token&#xff0c;每次请求都会自带token&#xff0c;需要你从后端获取后利用wx.setStorageSync(token,返回的token),不使用的话就是空。 直接复制即可&#xff0c;需要改一下…

关于 MapboxGL 在 Vue 中的简单使用

前言问题 关于我为什么使用了 在线的 js引入方法&#xff0c;而不是使用 npm 直接下载依赖问题&#xff0c;之前有一篇文章讲过原因&#xff1a;关于 Vue-iClient-MapboxGL 的使用注意事项 网上提供的 vue-iclient-mapboxgl 比较多&#xff0c;但是我这里使用的是 iclient-su…

视频剪辑达人教您:如何运用嵌套合并技巧制作固定片尾

在视频剪辑的过程中&#xff0c;嵌套合并技巧是一种非常实用的技术&#xff0c;可以帮助您将多个素材叠加在一起&#xff0c;制作出更加丰富多彩的视频。本文将由视频剪辑达人为您详细介绍如何运用云炫AI智剪嵌套合并技巧制作固定片尾&#xff0c;让您的视频剪辑水平更上一层楼…

【Apache Flink】Flink DataStream API的基本使用

Flink DataStream API的基本使用 文章目录 前言1. 基本使用方法2. 核心示例代码3. 完成工程代码pom.xmlWordCountExample测试验证 4. Stream 执行环境5. 参考文档 前言 Flink DataStream API主要用于处理无界和有界数据流 。 无界数据流是一个持续生成数据的数据源&#xff0…

vue引入字体

假定已经下了字体包 1、在src/assets文件夹下新建一个font文件夹&#xff0c;放入字体文件与配置文件 这个与两个字体&#xff0c;优设标题黑和DIN字体&#xff0c;font.css用于给字体取名&#xff0c;将字体引入网站。 font-face { font-family: YouSheBiaoTiHei; src: url(…

美术如何创建 skybox 贴图资源?

文章目录 目的PS手绘Panorama To CubemapPS手绘Pano2VRSkybox & Cubemap Tutorial (Maya & Photoshop)Unity 中使用 ReflectionProbe 生成 Cubemap 然后再 PS 调整PS直接手绘 cubemapBlender 导入 Panorama&#xff0c;然后烘焙到 cubemap&#xff0c;再导入unity中使用…

动态表单生成Demo(Vue+elment)

摘要&#xff1a;本文将介绍如何使用vue和elment ui组件库实现一个简单的动态表单生成的Demo。主要涉及两个.vue文件的书写&#xff0c;一个是动态表单生成的组件文件&#xff0c;一个是使用该动态表单生成的组件。 1.动态表单生成组件 这里仅集成了输入框、选择框、日期框三种…

字符集详解

常见字符集介绍 字符集基础知识&#xff1a; 计算机底层不可以直接存储字符的。 计算机中底层只能存储二进制(0、1) 。 二进制是可以转换成十进制的。 结论&#xff1a;计算机底层可以表示成十进制编号。计算机可以给人类字符进行编号存储&#xff0c;这套编号规则就是字符…

国内内卷太严重,还不考虑一下在海外接单?那这几个平台你知道吗?

作为一个程序员&#xff0c;在平台上接单赚点外快是再正常不过的事情了&#xff0c;但是现今国内各个平台都内卷比较严重&#xff0c;你是否考虑过去“外面的世界”看看&#xff1f; 如果想过&#xff0c;那么这几个外国的接单平台你都知道吗&#xff1f; 接下来就和我一起来看…

超实用的企业防范数据泄露小技巧!

超实用的企业防范数据泄露小技巧&#xff01; 小技巧1、加强员工培训&#xff0c;提高防范思想 及时向员工传达有关安全信息&#xff0c;加强员工意识、认识和执行安全措施&#xff0c;以防止数据泄露发生。 小技巧2、建立安全政策&#xff0c;明确处理流程 企业应该建立安…

Tower for Mac—Git客户端 支持M1

Tower是一款Mac OS X系统上的Git客户端软件&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户更加方便地管理和使用Git版本控制系统。以下是Tower的一些特点&#xff1a; 1. 界面友好&#xff1a;Tower的界面友好&#xff0c;使用户能够轻松地掌握软件的使用方法。 …

MySQL扩展语句和约束方式

一、扩展语句 复制&#xff0c;通过like这个语法直接复制bbb的表结构。只是复制表结构&#xff0c;不能复制表里面的数据 把bbb表里面的数据&#xff0c;复制到test&#xff0c;两个表数据结构要一致 创建一张表&#xff0c;test1,数据从bbb来&#xff0c;表结构也是bbb delete…