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

news2024/11/22 9:42:54

文章目录

    • 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.coloradmin.cn/o/1153535.html

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

相关文章

QVD-2023-19300:致远M1 usertokenservice反序列化RCE漏洞复现

文章目录 致远M1 usertokenservice反序列化RCE漏洞(QVD-2023-19300)复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 致远M1 usertokenservice反序列化RCE漏洞(QVD-2023-19300)复现 0x01 前言 免责声明&…

浅谈Redis的五大数据类型及其应用

前言 Redis是一种开源的内存数据结构存储系统,它支持多种数据类型,包括字符串String、列表list、集合、哈希表和有序集合。这些数据类型在Redis中有着广泛的应用场景,可以满足不同的业务需求。本文将介绍Redis的五大数据类型及其应用。 一、string数据类型 常用命令: …

腾讯云2023年双11活动,云服务器2核2G首年88元,领券最高省9999元!

腾讯云2023年双11大促活动正在火热进行中&#xff0c;腾讯云也是拿出了十足的诚意&#xff0c;个人企业用户均可领取代金券礼包&#xff0c;云服务器首年1.8折起&#xff0c;买1年送3个月&#xff01; 一、活动时间 腾讯云2023年双11大促活动时间比较充足&#xff0c;一直持续…

股权比例设计的九条生命线

股权比例设计——绝对控制线67% 【释义】一些重大事项如公司的股本变化&#xff0c;关于公司的增减资&#xff0c;修改公司章程&#xff0c; 分立/合并、变更主营项目等重大决策&#xff0c;需要2/3以上&#xff08;含2/3&#xff09;票数支持的。 股权比例设计——相对控制线…

大学校园闲置物品出售交易平台源码 二手交易源码

jspssm&#xff08;springspringMVCmybaits&#xff09;mysql实现的校园二手市场交易平台&#xff0c; 前台主要实现的功能有&#xff1a; 按分类显示商品列表、搜索商品、登录注册、关注商品、 评论商品、购买商品、用户登录后购买商品、发布商品、查看订单、查看关注的商品…

CKS真题分析-2023年度

CKS备考 Killercoda Interactive Environments #模拟环境 考试大纲 CKS考试介绍01 kube-bench 修复不安全项有kube-apiserver、etcd和kubelet&#xff0c;要记住3个文件对应的路径02 Pod 指定 ServiceAccount注意 automountServiceAccountToken: false03默认网络策略ingress…

第16期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

微信小程序的踩坑记录

问题记录&#xff1a; 嵌套太深 导致不起作用 点击我的工单 但是打印的结果值却是我的问题 没有点到我的工单上边去 原因&#xff1a;图片粘连在一起 解决方案:给图片100% 达到父元素的100% 最后成功蓝色的不粘连

遥测终端机的工作原理和主要应用领域

遥测终端机是一种关键设备&#xff0c;用于远程监测和数据采集。它在各个领域发挥着重要作用&#xff0c;从工业控制到环境监测、水利水文监测、从航天航空到能源管理。无线数据采集传输终端&#xff0c;它是自动化监测与控制系统的核心装置&#xff0c;将现场的传感仪表与监控…

开源人之歌,献给天下开源人

《开源人之歌》 这是一首献给开源人的中文歌曲&#xff08;很可能是第一首&#xff09; 这是一首用开源精神和开放式协作共同创作的作品 这是一首想让开源人能一起听、一起唱的流行歌曲 这是一首欢迎继续fork、发挥开源无限创新的项目 作者丨林旅强 编辑丨胡欣元 设计丨林旅强、…

最新版本QGIS 开始支持cesium 3D TILE 数据源了

最新版本QGIS 也开始支持3D TILE 数据源了!加载和运行速度也是慢&#xff0c;不过都这样&#xff0c;也不是qgis的问题!这东西对网络和性能要求比较高!据说这是cesium社区提供基金让qgis团队开发的&#xff0c;cesium社区真是很有钱啊&#x1f601;&#xff0c;不过也不奇怪&am…

nginx+keepalived实现nginx服务的高可用

本章教程&#xff0c;简单介绍如何利用keepalived实现nginx服务高可用。 keepalived是一个开源的高可用性解决方案&#xff0c;它可以在Linux系统上实现负载均衡和故障转移。它主要用于确保在服务器集群中的主服务器出现故障时&#xff0c;能够快速切换到备用服务器&#xff0c…

如何处理不稳定的自动化测试?

abluecolor 在解决这个问题之前&#xff0c;请停止编写更多测试&#xff0c;因为这将花费你较高的测试维护成本。你需要尽快行动起来对不稳定的原因进行深入研究&#xff0c;找到不稳定的根因&#xff0c;并且尝试在流程、环境和代码方面做一些优化工作解决它。 MasterKindew…

GB28181和RTSP使用场景区别有哪些?

场景差异 好多开发者纠结&#xff0c;到底使用GB28181还是RTSP&#xff0c;这里简单的谈下二者使用场景区别&#xff0c;GB28181和RTSP&#xff08;Real-Time Streaming Protocol&#xff09;是用于视频监控和流媒体传输的两种不同的协议。 GB28181是中国国家标准委员会发布的…

网页游戏开发引擎的特点

网页游戏开发引擎是用于创建游戏应用程序的工具&#xff0c;可以在网页浏览器中运行。这些引擎通常基于Web技术&#xff0c;如HTML5、JavaScript和CSS&#xff0c;以便在不同平台上实现跨平台的游戏开发。以下是一些流行的网页游戏开发引擎以及它们的主要特点&#xff0c;希望对…

软件项目管理办法

图片来自网络&#xff0c;如有侵权请联系删除

实时检测并识别视频中的汽车车牌

对于基于摄像头监控的安全系统来说,识别汽车牌照是一项非常重要的任务。我们可以使用一些计算机视觉技术从图像中提取车牌,然后我们可以使用光学字符识别来识别车牌号码。在这里,我将引导您完成此任务的整个过程。 要求: import cv2import numpy as npfrom skimage impor…

NUXT前端服务端渲染技术框架

服务端渲染又称SSR&#xff08;Server Side Render&#xff09;实在服务端完成页面的内容&#xff0c;而不是在客户端通过AJAX获取数据 优势&#xff1a;更好的SEO&#xff0c;由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面 Nuxt.js是一个基于Vue.js的轻量级应用框架&a…

数据库的事务四大特性(ACID)、详解隔离性以及隔离级别、锁

文章目录 &#x1f389;数据库的事务四大特性&#xff08;ACID&#xff09;以及隔离性一、事务的四大特性✨1、原子性&#xff08;Atomicity&#xff09;&#x1f38a;2、一致性&#xff08;Consistency&#xff09;&#x1f38a;3、隔离性&#xff08;Isolation&#xff09;&a…

springboot打包时依赖jar和项目jar分开打包;jar包瘦身

概述 最近感觉项目在部署时时jar包传输太慢了&#xff1b; 看了下jar包内容&#xff0c;除了项目代码&#xff0c;其余大部分都是依赖jar&#xff1b; 平时改动较多的只是项目代码&#xff0c;依赖jar改动比较少&#xff1b; 所以就在想能不能分开打包&#xff1b;这样只部署项…