C++ STL 概述

目录

  • 什么是 STL
  • STL 的组成
  • 迭代器
  • 常用容器
  • 算法
  • 函数对象

什么是 STL

STL ( The C++ Standard Template Library ),C++标准模板库,是一个算法、数据结构和其他组件的集合,可用于简化C++程序的开发。STL提供了一系列的 容器 (container),如 vector、list、map,以及搜索、排序和操作数据的 算法 (algorithm)。

STL的主要优点之一是它提供了一种编写通用的、可重复使用的代码的方法,可以应用于不同的数据类型。这意味着,你可以一次写好一个算法,然后将其用于不同类型的数据,而不必为每种类型单独写代码。

STL 的组成

  1. 容器 (Container): STL 提供了一系列的容器,如 vector、list、map、set 和 stack 等,它们可以用来存储和操作数据。
  2. 算法 (Algorithm): STL 提供了一系列的算法,比如 sort、find 和 binary_search,这些算法可以用来操作存储在容器中的数据。
  3. 迭代器(Iterator): 迭代器是提供遍历容器中元素的方法的对象。STL提供了一系列的迭代器,比如前向迭代器 (forward iterator)、双向迭代器 (bidirectional iterator) 和随机访问迭代器 (random access iterator),它们可以与不同类型的容器一起使用。
  4. 函数对象(Function objects): 函数对象,也被称为functors,是可以作为算法的函数参数使用的对象。它们提供了一种将函数传递给算法的方法,允许你自定义其行为。
  5. 分配器(Allocator):分配器是一种用于管理内存分配和释放的工具。
  6. 适配器(Adapter):适配器是一种用于在现有的容器或迭代器(或上面其他组件,没有算法适配器)上添加新功能的工具,其本质还是容器和迭代器。

迭代器

常用的迭代器包括:输入迭代器(Input Iterator)、输出迭代器(Output Iterator)、前向迭代器(Forward Iterator)、双向迭代器(Bidirectional Iterator)、随机访问迭代器(Random Access Iterator)5种。输入迭代器和输出迭代器,它们不是把数组或容器当做操作对象,而是把输入流/输出流作为操作对象。这里简单介绍后面3种迭代器。

  • 前向迭代器

前向迭代器支持以下运算:

运算说明
*解引用,得到迭代器指向元素的值
++it前置递增,将迭代器指向下一个元素
it++后置递增,将迭代器指向下一个元素,并返回指向当前元素的迭代器副本
==,!=比较两个迭代器是否相等
  • 双向迭代器

双向迭代器支持以下运算:

运算说明
*解引用,得到迭代器指向元素的值
++it前置递增,将迭代器指向下一个元素
it++后置递增,将迭代器指向下一个元素,并返回指向当前元素的迭代器副本
–it前置递减,将迭代器指向前一个元素
it–后置递减,将迭代器指向前一个元素,并返回指向当前元素的迭代器副本
==,!=比较两个迭代器是否相等
  • 随机访问迭代器

随机访问迭代器则支持更多的运算:

运算说明
*解引用,得到迭代器指向元素的值
++it前置递增,将迭代器指向下一个元素
it++后置递增,将迭代器指向下一个元素,并返回指向当前元素的迭代器副本
–it前置递减,将迭代器指向前一个元素
it–后置递减,将迭代器指向前一个元素,并返回指向当前元素的迭代器副本
==、!=、<、<=、>、>=关系运算,用于比较两个迭代器的大小关系
it + n加法,用于将迭代器向前移动 n 个元素
it1 - it2 和 it - n减法,用于计算两个迭代器之间的距离,或将迭代器向后移动 n 个元素
it [ n ]返回指向 it 后面第 n 个位置的元素的引用
  • 实现一个简单的迭代器:
template <typename T>
class ArrayIterator {
public:ArrayIterator(T* ptr) : ptr_(ptr) {}T& operator*() const {return *ptr_;}T* operator->() const {return ptr_;}ArrayIterator& operator++() {++ptr_;return *this;}ArrayIterator& operator--() {--ptr_;return *this;}
private:T* ptr_;
};int main() {int my_array[] = {1, 2, 3, 4, 5};ArrayIterator<int> it(my_array); // 创建一个迭代器for (; it != ArrayIterator<int>(my_array + 5); ++it) {std::cout << *it << " "; // 输出数组元素}return 0;
}

常用容器

容器类型说明
序列式容器(Sequence containers)这种容器按照元素在容器中的位置存储元素,可以按照索引访问元素。包括 vectordequelistforward_listarray
关联式容器(Associative containers)这种容器按照元素的键值存储元素,可以按照键值进行查找和访问元素,查找效率高。包括 setmapmultisetmultimap
无序关联式容器(Unordered associative containers)这种容器也是按照元素的键值存储元素,但是它们使用哈希表来存储元素,因此它们不保证元素的顺序,另外容器的查找效率高。包括 unordered_setunordered_mapunordered_multisetunordered_multimap
容器适配器(Container adapters)这种容器是对其他容器的封装,提供了不同的接口。包括 stackqueuepriority_queue
  • 不同容器支持的迭代器不一样,主要是和容器的功能有关:
容器对应的迭代器类型
array随机访问迭代器
vector随机访问迭代器
deque随机访问迭代器
list双向迭代器
set / multiset双向迭代器
map / multimap双向迭代器
forward_list前向迭代器
unordered_map / unordered_multimap前向迭代器
unordered_set / unordered_multiset前向迭代器

其中,容器适配器因为其只是用于完成特殊的功能(先进先出 FIFO,后进先出LIFO)而不使用迭代器。在每个容器中,可以使用成员函数 begin( ) 获取对应的迭代器。

算法

STL 实现了数据结构与算法的分离,不需要在每个容器中单独地实现排序,查找什么的算法。通过迭代器可以将算法运用在不同的容器中,这也是迭代器的重要作用之一。这些算法也适用于普通数组。

#include <algorithm>
#include <iostream>int main() {int my_array[] = {5, 2, 1, 7, 4};std::sort(my_array, my_array + 5);//默认升序for (int i = 0; i < 5; ++i) {std::cout << my_array[i] << " ";}return 0;
}

函数对象

简单来说就是实现了 ( ) 运算符重载的类,这个类的实例对象就是一个函数对象。在使用这个对象时看上去像函数调用,而实际也执行了函数调用,所以叫做函数对象。

template<typename T>
class plus{
public:T operator()(const T a, const T b){return a+b;}
};
int main() {plus<int> a;std::cout << a(1,2) <<std::endl; // 3return 0;
}

STL 函数对象类模板:

  • std::lessstd::greater:这些模板用于比较两个值的大小。std::less返回true如果第一个参数小于第二个参数,而std::greater则返回true如果第一个参数大于第二个参数。
int a = 5, b = 10;
std::less<int> less_than;
std::greater<int> greater_than;
bool result1 = less_than(a, b); // result1 = true
bool result2 = greater_than(a, b); // result2 = false
  • std::plusstd::minus:这些模板用于执行加法和减法运算。
int a = 5, b = 10;
std::plus<int> add;
std::minus<int> subtract;
int result1 = add(a, b); // result1 = 15
int result2 = subtract(a, b); // result2 = -5
  • std::multipliesstd::divides:这些模板用于执行乘法和除法运算。
int a = 5, b = 10;
std::multiplies<int> multiply;
std::divides<int> divide;
int result1 = multiply(a, b); // result1 = 50
int result2 = divide(a, b); // result2 = 0

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

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

相关文章

深入理解安卓ARouter:集成与应用

摘要 在Android开发中&#xff0c;页面间的导航和参数传递是一个重要的组成部分。ARouter&#xff08;Android Router&#xff09;是一个轻量级、模块化的路由框架&#xff0c;旨在简化页面间的跳转和参数传递。本文将详细介绍安卓ARouter的概述、集成步骤、优劣分析及应用场景…

Jupyter Notebook更改默认打开的浏览器和工作目录

Jupyter Notebook更改工作目录 打开cmd&#xff0c;输入&#xff1a;jupyter notebook --generate-config&#xff0c;可以得到Jupyter Notebook配置文件的路径&#xff0c;找到路径下的jupyter_notebook_config.py文件&#xff0c;用记事本或者Sublime打开文件 找到&#xff…

统一SQL-支持unpivot列转行

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;TDSQL-MySQL 操作目标 在Oracle中&#xff0c;可以使用unpivot将列转换成行&#xff0c;在TDSQL-MySQL中没有对应的功能&#xff0c;由…

HDMI to TYPE-C芯片|HDMI2.0转TYPE-C转接器方案|CS5802设计方案|ASL CS5802

CS5802输入端可以是1080P、4K30、4K60HZ这三种规格,输出的接口可以是TYPE-C信号接口,或者是TYPE-C信号接口,输入端HDMI由4路信号组成&#xff0c;支持1.62Gbps、2.7Gbps、5.4Gbps链路速率。内置可选SSC功能可降低EMI的干扰状况。 ASL CS5802芯片概述&#xff1a; 符合HDMI规范…

定时任务 作业调度框架

单体 Cron: 特点&#xff1a;Linux和类Unix系统中的一个内置工具。功能&#xff1a;通过crontab文件配置&#xff0c;可以定期执行脚本或命令。 Spring Scheduler: 特点&#xff1a;Spring框架的一部分。功能&#xff1a;允许在Spring应用程序中创建定时任务&#xff0c;支持注…

二分查找详解

二分查找是一种查找方式&#xff0c;用于在已经排好序的数组中寻找某个特定的数 我们直接来介绍二分查找的查找方法 左边界与右边界 左闭右闭&#xff1a; n为数组元素个数&#xff0c;a为目标数字 我们以左闭右闭区间为例&#xff0c;left为左边界0,right为右边界n-1&…

不同条件累加(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;float result1 0;float result2 0;float result…

牛客小白月赛91 ----- Bingbong的回文路径 ---- 题解

Bingbong的回文路径&#xff1a; 题目描述&#xff1a; 思路解析&#xff1a; 现在有一棵树&#xff0c;树上每个结点上都有一个小写字母&#xff0c;那么如果唯一确定了x和y两个结点&#xff0c;那么就唯一确定了一个字符串路径&#xff08;最短路径&#xff09;。 -现在给出…

CSS 画一个三角形

一、前言 在前端开发的时候&#xff0c;我们有时候会需要用到一个三角形的形状&#xff0c;比如地址选择或者播放器里面播放按钮 通常情况下&#xff0c;我们会使用图片或者svg去完成三角形效果图&#xff0c;但如果单纯使用css如何完成一个三角形呢&#xff1f; 实现过程似…

3、MATLAB中矩阵和多维矩阵介绍

文章目录 一、矩阵二、矩阵举例三、定义变量四、定义矩阵五、获取变量值 一、矩阵 MATLAB中数据的基本格式是矩阵&#xff1b; 二维矩阵是一个带有以行和列排列的元素的矩阵表&#xff1b;如果右m行、n列&#xff0c;这个矩阵的大小就是m x n&#xff1b;多维矩阵的维数大于2…

[jinja2]模板访问对象属性

甚至可以用. 访问字典 .访问一般用得是最多的

单例模式可以被破坏

通过反射的方式破坏单例模式 解决&#xff1a;在构造函数中添加判断 private Singleton() {if (singleton ! null) {throw new RuntimeException("Singleton constructor is called... ");} } 序列化和反序列化破坏单例模式 解决&#xff1a;在Sinleton中增加rea…

【java解决线程间变量不可见性的方案】

解决线程间变量不可见性的方案 一、 背景 所有的实例变量和类变量都存储在主内存&#xff0c;但每个线程都有自己的工作内存&#xff0c;保留了主内存的共享变量的副本&#xff0c;线程修改的是共享变量&#xff0c;但是每个线程每次只能读取工作内存里的值&#xff0c;所以会…

Linux系统的账号和权限管理

目录 一、管理用户账号和组账号 1、useradd 2、passwd 3、usermod 4、userdel 二、管理目录和文件的属性 1、组账号管理 1&#xff09;groupadd 2&#xff09;gpasswd 3&#xff09;groupdel 4&#xff09;groups 2、文件权限 1&#xff09;chmod 2&#xff09…

【python】活学活用之字典用法实战——计数器

【python】活学活用之字典用法实战——计数器 字典也可以用作计数器。例如,我们可以使用字典来统计一段文本中每个单词出现的次数: # 定义一个名为 word_count 的函数,它接受一个参数:text def word_count(text):# 创建一个空字典,用于存储每个单词及其出现的次数counts…

Elasticsearch:(二)2.安装kibana

1.环境安装介绍: 安装java环境安装Elasticsearch安装kibana安装Elasticsearch-head插件 本节文章主要讲解kibana的安装。 2.下载 下载Elasticsearch对应的版本,参考官方自身产品兼容版本:支持一览表 | Elastic 下载地址:Kibana 7.17.20 | Elastic Kibana 7.17.20 | Ela…

操作教程丨MaxKB+Ollama:快速构建基于大语言模型的本地知识库问答系统

2024年4月12日&#xff0c;1Panel开源项目组正式对外介绍了其官方出品的开源子项目——MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB是一款基于LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB的产品命名内涵为“Max …

C++ stl容器stack,queue,priority_queue的底层模拟实现

目录 前言&#xff1a; 文档借鉴&#xff1a;Reference - C Reference 1.deque a.deque的结构特点&#xff1a; b.deque的迭代器结构&#xff1a; c.面试题&#xff1a; 2.stack 3.queue 4.仿函数 5.priority_queue 总结&#xff1a; 前言&#xff1a; 本篇一共简单…

04节-51单片机-数码管模块

1.静态数码管显示 LED数码管&#xff1a;数码管是一种简单、廉价的显示器&#xff0c;是由多个发光二极管封装在一起组成“8”字型的器件 下图展示了数码管的线路连接 数码管的连接方式分为&#xff0c;公共端&#xff0c;共阴极和共阳极连接&#xff1a; 多个数码管共用引…

存储过程的查询

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 在实际使用中&#xff0c;经常会需要查询数据库中已有的存储过程或者某一个存储过程的内容&#xff0c; 下面就介绍-下如何查询存储过程。 这需要使用到数据字典 user_sou…