C++:标准模板库(STL)介绍

news2024/9/9 7:25:30

1.STL基本概念

从C到C++,C++语言的核心优势之一就是便于软件的重用。前面我们提到过C++程序的面向对象思想,即继承和多态、标准类库等可以实现重用。除此之外,通过泛型程序设计(generic programming)的思想,即模板机制以及标准模板库STL的使用,我们也可以实现重用。

简单地说,泛型程序设计就是使用模板的程序设计发来编写不依赖于具体数据类型的程序。从而将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么类型对象,算法针对什么类型的对象,则都不必重新实现数据结构,重新编写算法。

而所谓的标准模板库(Standard Template Library)就是一些常用的数据结构和算法的模板的集合。

STL中有如下基本的概念:

①容器:可容纳各种数据类型的通用数据结构,使类模板。如vector,list等

②迭代器:可用于依次存取容器中的元素,类似于指针

③算法:用来操作容器中的元素的函数模板,如sort,find等

2.容器概述

可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是类模版, 分为三种:

1 顺序容器:vector, deque,list

2 关联容器:set, multiset, map, multimap

3 容器适配器:stack, queue, priority_queue

一、容器类型

①顺序容器:容器并非排序的,元素的插入位置同元素的值无关。有 vector,deque,list 三种。

1)vector 头文件 <vector>

动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能 (大部分情况下是常数时间)。

2)deque 头文件 <deque>

双向队列。元素在内存连续存放。随机存取任何元素都能在常数时间完成 (但次于 vector)。在两端增删元素具有较佳的性能 (大部分情况下是常数时间)。

3)list 头文件 <list>

双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取。

②关联容器:元素是排序的, 插入任何元素,都按相应的排序规则来确定其位置在查找时具有非常好的性能, 通常以平衡二叉树方式实现,插入和检索的时间都是 O(log(N))

1)set/multiset 头文件 <set>

set 即集合。set 中不允许相同元素,multiset 中允许存在相同的元素。

2)map/multimap 头文件 <map>

map 与 set 的不同在于 map 中存放的元素有且仅有两个成员变量,一个名为 first, 另一个名为 second, map 根据 first 值对元素进行从小到大排序,并可快速地根据 first 来检索元素。map 同 multimap的不同在于是否允许相同 first 值的元素。

③容器适配器

简单的理解容器适配器,其就是将不适用的序列式容器(包括 vector、deque 和 list)变得适用。即通过封装某个序列式容器,并重新组合该容器中包含的成员函数,使其满足某些特定场景的需要。

容器适配器本质上还是容器,只不过此容器模板类的实现,利用了大量其它基础容器模板类中已经写好的成员函数。当然,如果必要的话,容器适配器中也可以自创新的成员函数。

1)stack : 头文件 <stack>

栈。是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项(栈顶的项)。后进先出。

2)queue 头文件 <queue>

队列。插入只可以在尾部进行。删除只能在头部进行。检索和修改只能在头或尾进行。先进先出。

3)priority_queue 头文件 <queue>

优先级队列。最高优先级元素总是第一个出列

二、成员函数

①顺序容器和关联容器中都有的成员函数:

1.begin 返回指向容器中第一个元素的迭代器

2.end 返回指向容器中最后一个元素后面的位置的迭代器

3.rbegin 返回指向容器中最后一个元素的迭代器

4.rend 返回指向容器中第一个元素前面的位置的迭代器

5.erase 从容器中删除一个或几个元素

6.clear 从容器中删除所有元素

②顺序容器的常用成员函数:

1.front : 返回容器中第一个元素的引用

2.back : 返回容器中最后一个元素的引用

3.push_back : 在容器末尾增加新元素

4.pop_back : 删除容器末尾的元素

5.erase : 删除迭代器指向的元素 (可能会使该迭代器失效),或删除一个区间,返回被删除元素后面的那个元素的迭代器

3.迭代器

用于指向顺序容器和关联容器中的元素,迭代器用法与指针类似,类型有const和非const两种,通过迭代器可以读取它所指向的元素,通过非const迭代器还能修改其指向的元素。

①定义一个容器类的迭代器的方法:

非const迭代器:容器类名::iterator 变量名

const迭代器:容器类名::const_iterator 变量名

②访问一个迭代器指向的元素的方法:

 迭代器变量名

迭代器上可以执行 ++ 操作, 以使其指向容器中的下一个元素。如果迭代器到达了容器中的最后一个元素的后面,此时再使用它,就会出错,类似于使用 NULL 或未初始化的指针一样。

迭代器类型:

①双向迭代器

②随机访问迭代器

随机访问迭代器适用的容器:vector,deque

双向迭代器适用的容器:list,set/multiset,map/multimap

而适配器stack,queue,priority_queue不支持迭代器

需要注意的是,有些算法如sort,binary_search需要通过随机访问迭代器来访问容器中的元素,那么list以及关联容器就不支持该算法(list类有自己的sort函数)

例如:

若我们要遍历vector中的元素,可以用如下方法

但是我们遍历list中的元素时,由于其迭代器时双向迭代器,应该用如下方法:

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

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

相关文章

微软:警惕利用VMware ESXi进行身份验证绕过攻击

微软于7月29日发布警告&#xff0c;称勒索软件团伙正在积极利用 VMware ESXi 身份验证绕过漏洞进行攻击。 该漏洞被追踪为 CVE-2024-37085&#xff0c;由微软安全研究人员 Edan Zwick、Danielle Kuznets Nohi 和 Meitar Pinto 发现&#xff0c;并在 6 月 25 日发布的 ESXi 8.0 …

Vatee万腾平台:助力企业数字化转型的坚实伙伴

在数字化浪潮席卷全球的今天&#xff0c;企业数字化转型已成为不可逆转的趋势。面对这一挑战与机遇并存的时代&#xff0c;Vatee万腾平台凭借其深厚的行业洞察、先进的技术实力和丰富的实践经验&#xff0c;成为了众多企业数字化转型道路上的坚实伙伴。 一、定制化解决方案&…

锐捷RCNA | ARP协议原理与应用与DHCP协议原理及应用

一、ARP协议原理与应用 OSI参考模型将网络划分为7层&#xff0c;IP地址工作在第三层网络层中&#xff0c;MAC地址工作在第二层数据链路层。 在以太网发送IP数据包时&#xff0c;先封装网络层的包头再封装数据链路层的包头&#xff0c;由于在发送时只知道目标IP地址而不知道MA…

神经网络实现数字识别(机器学习)

我们有很多0到9的图片集&#xff0c;我们要训练一个网络来自动识别数字&#xff0c;我们有20*20的图像5000个。 把图片展平&#xff0c;这样每个记录就有400个特征&#xff0c;最后一列是标签值&#xff0c;1-9表示数字1-9&#xff1b;10表示数字0。数据集&#xff1a;ex_2/ex…

【设计模式:单例模式】

单例模式的特点&#xff1a; 单例类只允许一个实例单例类必须自己创造自己的唯一实例单例类必须给所有其他对象提供这一实例 单例模式底层如何实现&#xff1a; 私有化构造函数&#xff0c;类外部无法创造类对象&#xff0c;实现了单例类只允许有一个实例对象的特点类定义中含有…

vue3+g2plot之瀑布图

基础瀑布图 - 每月收支情况 效果预览: 核心代码: import {Waterfall } from @antv/g2plot;const data = [{type: 日用品, money: 120 },{type: 伙食费, money: 900 },{type: 交通费, money: 200 },{type: 水电费, money: 300 },{type: 房租, money: 1200 },{type: 商场消…

MyBatis批量更新:报错The error occurred while setting parameters

使用mybatis批量更新时&#xff0c;报以下错误。反复检查过mysql语句没有任何问题。而且本地可以正常执行&#xff0c;生产环境却报错。起初怀疑是数据表&#xff0c;把生产环境表导入本地测试后依然没有问题。数据表没问题就定位到数据库&#xff0c;先检查本地数据库链接与生…

家庭教育系列—剑桥通用英语五级考试介绍

文章目录 1. 背景介绍2. 详细介绍2.1 **KET&#xff08;Key English Test&#xff09;&#xff1a;基础英语考试**2.2 **PET&#xff08;Preliminary English Test&#xff09;&#xff1a;初级英语考试**2.3 **FCE&#xff08;First Certificate in English&#xff09;&#…

自定义类加载器 1.继承ClassLoader 2.findClass 3.defineClass

一、自定义类加载器 1.自定义 2.使用 总结&#xff1a;这种情况&#xff0c;由于loadClass会采用双亲委派机制&#xff0c;如果类已经被加载&#xff0c;那么就不会重复加载。 二、热部署的实现原理 使用loadClass&#xff0c;发现加载是同一个类 使用findClass实现&#xf…

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation 一、前言Abstract1 Introduction2 Related Work3 Methodology3.1 Preliminary of Latent Diffusion Models3.2 The model variants of Latte3.3 The empirical analysis of Latte3.3.1 Latent video c…

测试环境领域到测试环境产品

作者&#xff1a;攻心 去年之前&#xff0c;阿里巴巴的淘天集团测试环境是以领域方式运作&#xff1a;不局限测试环境治理本身&#xff0c;从测试模式方法论及用好测试环境思路引领集团测试环境治理。领域运作最难的是“统一思想”。业务进一步细分调整后&#xff0c;测试环境治…

Xilinx FPGA:vivado SPI实现FLASH通信

一、实验要求 要求使用SPI协议实现对flash芯片的页编程、读操作、页擦除等功能。 二、模块划分 大概的时序图&#xff1a; 三、程序设计 &#xff08;1&#xff09;接收端模块 timescale 1ns / 1ps module uart_rx(input sys_clk ,input …

Mongodb新增文档、查询文档、更新文档、删除文档

文章目录 1、新增文档1.1、进入容器1.2、向集合插入一个新文档1.3、查询文档1.4、向集合插入一个或者多个文档 2、查询文档2.1、查询年龄等于202.2、查询年龄是20的男性2.3、查询年龄是20或者性别是男2.4、查询年龄小于232.5、查询年龄小于等于232.6、查询大于等于232.7、查询年…

新型蜜罐有哪些?未来方向如何?

前言&#xff1a;技术发展为时代带来变革&#xff0c;同时技术创新性对蜜罐产生推动力。 一、新型蜜罐的诞生 技术发展为时代带来变革&#xff0c;同时技术创新性对蜜罐产生推动力&#xff0c;通过借鉴不同技术思想、方法&#xff0c;与其它技术结合形成优势互补&#xff0c;…

Docker 搭建 Minio 容器

Docker 搭建 Minio 容器 (完整详细版) 简介&#xff1a; Minio 是一个基于Apache License v2.0开源协议的对象存储服务&#xff0c;虽然轻量&#xff0c;却拥有着不错的性能。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据。 例如图片、视频、日…

CentOS通过rsync实现文件同步(daemon方式)

rsync介绍 rsync是Liunx下的远程数据同步工具&#xff0c;可快速同步多台服务器间的文件和目录&#xff0c;并可实现增量同步以减少数据的传输。 rsync有两种常用的认证方式&#xff0c;一种是rsync-daemon方式&#xff0c;另外一种是ssh方式。 daemon 方式与 ssh 方式相比有…

Nginx代理路径被吃

Nginx代理路径被吃的情况 日常工作中经常使用nginx反向代理一些资源&#xff0c;有时正常代理&#xff0c;发现代理不过去。 验证被吃调location情况 通过浏览器访问&#xff1a; https://zhao138969.com/LinuxPackage/Python/SelectDocker location /LinuxPackage { proxy…

深度学习Day-27:生成对抗网络(GAN)入门

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a; 了解什么是生成对抗网络生成对抗网络结构是怎么样的学习本文代码&#xff0c;并跑通代码调用训练好…

【MeterSphere】3.X备份与还原

目录 一、手动备份数据库 二、备份 minio 目录 三、自动备份 3.1 设置备份服务器 3.2 创建文件夹 msdb_bak 3.3 设置备份脚本 3.4 创建用于定时任务脚本文件 3.5 为msdb_bak赋权 3.6 执行 install_ms_backup.sh 3.7 查看定时任务是否成功 四、还原数据 4.1 还原 s…

LinkedHashSet底层原理

LinkedHashSet 的特点 去重&#xff1a;不允许重复的元素&#xff0c;类似于 HashSet。有序&#xff1a;能够记住元素的插入顺序&#xff0c;类似于 LinkedList。性能&#xff1a;具有较好的平均时间复杂度&#xff0c;如添加、删除和查找操作通常都是 O(1)。 内部实现 数据…