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.hqwc.cn/news/154882.html

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

相关文章

Java模块化应用实践之精简JRE | 京东云技术团队

导语 Java9及以后的版本引入了模块化特性&#xff0c;但是直到今天JDK21都发布了&#xff0c;依然没有被大量使用起来&#xff0c;那么这个特性就真的没啥意义了吗&#xff1f; 别忘了&#xff0c;Java本身可是把模块化做到了极致的&#xff0c;所以可以利用这个特性对JRE本身…

电商数据采集抓取封装数据、淘宝、天猫、京东等平台商品详情API接口参数详解

电商数据采集抓取数据、淘宝、天猫、京东等平台的电商数据抓取&#xff0c;网页爬虫、采集网站数据、网页数据采集软件、python爬虫、HTM网页提取、APP数据抓包、APP数据采集、一站式网站采集技术、BI数据的数据分析、数据标注等成为大数据发展中的热门技术关键词。那么电商数据…

基于物联网、大数据、云计算、人工智能等技术的智慧工地源码(Java+Spring Cloud +UniApp +MySql)

智慧工地是指利用物联网、大数据、云计算、人工智能等技术手段&#xff0c;为建筑施工现场提供智能硬件及物联网平台的解决方案&#xff0c;实现建筑工地的实时化、可视化、多元化、智慧化、便捷化。智慧工地的建设目标是实现全天候的管理监控&#xff0c;提高施工效率和质量&a…

【设计模式】第24节:行为型模式之“模板方法模式”

一、简介 模板方法模式在一个方法中定义一个算法骨架&#xff0c;并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下&#xff0c;重新定义算法中的某些步骤。 模板模式有两大作用&#xff1a;复用和扩展。其中&#xff0c;复用指的是&#…

【软考】14.3 设计模式

《设计模式》 有下划线&#xff1a;类模式 / 对象模式无下划线&#xff1a;对象模式 创建型 设计模式 创建对象 构建器&#xff08;Builder&#xff09;&#xff1a;类和构造分离抽象工厂&#xff08;Abstract Factory&#xff09;&#xff1a;抽象接口工厂&#xff08;Factor…

PHP/MySQL开发本地服务器软件 MAMP Pro for Mac

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

Python 应用 之 转换音频格式

目录 一、python音频转换 1、pydub 音频包安装 2、 ffmpeg安装 1&#xff09;、解压后&#xff0c;添加到环境变量中 2&#xff09;、可以直接放在python安装目录下 3、python程序 1&#xff09;、引入相关包 2&#xff09;、重命名 3&#xff09;、to Mp3 4&#xf…

【POI-EXCEL-下拉框】POI导出excel下拉框数据太多导致下拉框不显示BUG修复

RT 最近在线上遇到一个很难受的BUG&#xff0c;我一度以为是我代码逻辑出了问题&#xff0c;用了Arthas定位分析之后&#xff0c;开始坚定了信心&#xff1a;大概率是POI的API有问题&#xff0c;比如写入数据过多。 PS&#xff1a;上图为正常的下拉框。但是&#xff0c;当下拉…

2000-2021年上市公司产融结合度量数据

2000-2021年上市公司产融结合度量数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;股票代码、年份、是否持有银行股份、持有银行股份比例、是否持有其他金融机构股份、产融结合 3、来源&#xff1a;上市公司年报 4、范围&#xff1a;上市公司 5、样本量&#xff…

react-hook-form。 useFieldArray Controller 必填,报错自动获取较多疑问记录

背景 动态多个数据Controller包裹时候&#xff0c;原生html标签input可以add时候自动获取焦点&#xff0c;聚焦到最近不符合要求的元素上面 matiral的TextField同样可以可是x-date-pickers/DatePicker不可以❌ 是什么原因呢&#xff0c;内部提供foucs&#xff1f;&#xff1f;属…

arcpy.describe

描述 根据输入的数据&#xff0c;返回输入数据的属性 arcpy.da.Describe与arcpy.Describe返回的数据是一样的但是返回的的类型不一样&#xff0c;arcpy.da.Describe返回的是字典&#xff0c;arcpy.Describe返回的是string 如果要访问数据对象不存在的属性&#xff0c;将返回…

对话式AI驱动的计算机辅助设计【CAD】

大型语言模型 (LLM) 为 CAD 软件公司提供了通过对话式 AI 增强设计工作流程的新机会。 工程师无需浏览复杂的菜单&#xff0c;而是可以用简单的语言描述需求并接收由集成数据支持的智能响应。 例如&#xff0c;工程师可以通过询问“2 盎司以下的铝支架”来查询零件数据库。 LL…