【STL】综述

news2025/5/31 20:10:48

STL,一文即可知

在这里插入图片描述



😊点此到文末惊喜↩︎


一、STL基本知识

概述

  1. STL六大组件(前三个是主要的)
    • 容器(Containers):使用类模板(class template)实现的各种数据结构
    • 算法(Algorithms):使用函数模板(function template)实现的各种常用算法
    • 迭代器(Iterators):使用类模板(class template)通过重载指针操作函数实现遍历对象集合元素的泛型指针
    • 仿函数(Functors):使用重载operator()的class或class template实现函数对象(将对象像函数一样调用)
    • 适配器(Adaptors):使用类模板(class template)通过修饰容器、仿函数接口或迭代器实现功能的转换
    • 分配器(Allocators):使用类模板(class template)实现内存资源的管理
      在这里插入图片描述
  2. 特点
    • STL模板主要由算法、容器、迭代器三者组成,将数据和算法分离。算法通过迭代器操作容器存储的数据,其中迭代器和容器一一对应。
    • STL主要依赖于模板思想,提供了足够的通用性,减少了对OOP的依赖。
      在这里插入图片描述

容器

  1. 分类
    • 序列式容器:按位置索引,逻辑结构为线性表
      • 数组容器array<T, N>
      • 向量容器vector<T>
      • 双端队列容器deque<T>
      • 链式容器list<T>
      • 正向链容器forward_list<T>
    • 关联式容器:按键值索引,逻辑结构为树
      • set / multiset / unordered_set / unordered_multimap
      • map / multimap / unordered_map / unordered_multimap
    • 容器适配器:以序列式容器为底层构造的适配器,不是容器
      • stack<T>
      • 队列queue<T>
      • 优先队列priority_queue <T>
集合底层实现是否有序数值重复更改数值查询效率增删效率
set红黑树有序O(log n)O(log n)
multiset红黑树无序O(log n)O(log n)
unordered_set哈希表无序O(1)O(1)
unordered_multiset哈希表无序O(1)O(1)
map红黑树有序不可重复不可修改O(log n)O(log n)
multimap红黑树有序可重复不可更改O(log n)O(log n)
unordered_map哈希表无序不可重复不可更改O(1)O(1)
unordered_multimap哈希表无序可重复不可更改O(1)O(1)

二、序列式容器详述

数组容器array

  1. 原理:在普通数组的基础上,增加了一些功能函数
  2. 特点
    • 大小固定,无法进行动态的增删
    • 可以进行随机访问或更改
  3. 功能函数的作用示例
    • at(n):返回容器中n处位置元素的引用,该函数自动检查n是否在有效的范围内,如果不是则抛出out_of_range异常

向量容器vector

  1. 原理
    • 底层为数组,使用三个迭代器(指针)表示,start表示容器首部位置,finish表示已使用末尾位置,end_of_storage表示整个容器的末尾位置(最大容量)
      在这里插入图片描述
  2. vector扩容
    • 扩容原理
      • 寻找新内存:内存中寻找一个与前一段空间相比两倍大小的空间作为扩充空间
      • 拷贝旧数据:调用拷贝构造函数将原数据拷贝到新内存空间的前半段
      • 释放旧内存:调用析构函数释放原内存空间
    • 注意:一旦发生内存扩容,指向原空间的迭代器可能失效,即迭代器指针指向不变,但是内容变了,eg:erase()和insert()移动部分元素和扩容操作
    • 相关函数
      • push_back():未达最大容量,则直接在备用空间上建构元素,并调整迭代器finish,使vector变大。已达最大容量,则进行扩容。
      • insert():未达到最大容量,则把当前要插入元素的位置后面的元素向后移动,然后把待插入元素插入到相应的位置。已达到最大容量进行扩容。
        在这里插入图片描述
  3. 元素的访问
    • operator[]:直接跳转位置访问元素,速度是很快的,时间复杂度为O(1)
    • at():本质调用operator[],此外增加了越界检查
  4. 初始化
    //定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定
    vector<int>a(10);
    //定义具有10个整型元素的向量,且给出的每个元素初值为1
    vector<int>a(10,1);
    //用向量b给向量a赋值,a的值完全等价于b的值
    vector<int>a(b);
    //将向量b中从0-2(共三个)的元素赋值给a,a的类型为int型
    vector<int>a(b.begin(),b.begin()+3);
    //从数组中获得初值
    int b[7]={1,2,3,4,5,6,7};
    vector<int> a(b,b+7;
    
  5. 常用内置函数
    #include<vector>
    vector<int> a,b;
    //b为向量,将b的0-2个元素赋值给向量a
    a.assign(b.begin(),b.begin()+3);
    //a含有4个值为2的元素
    a.assign(4,2);
    //返回a的最后一个元素
    a.back();
    //返回a的第一个元素
    a.front();
    //返回a的第i元素,当且仅当a存在
    a[i];
    //清空a中的元素
    a.clear();
    //判断a是否为空,空则返回true,非空则返回false
    a.empty();
    //删除a向量的最后一个元素
    a.pop_back();
    //删除a中第一个(从第0个算起)到第二个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)结束
    a.erase(a.begin()+1,a.begin()+3);
    //在a的最后一个向量后插入一个元素,其值为5
    a.push_back(5);
    //在a的第一个元素(从第0个算起)位置插入数值5,
    a.insert(a.begin()+1,5);
    //在a的第一个元素(从第0个算起)位置插入3个数,其值都为5
    a.insert(a.begin()+1,3,5);
    //b为数组,在a的第一个元素(从第0个元素算起)的位置插入b的第三个元素到第5个元素(不包括b+6)
    a.insert(a.begin()+1,b+3,b+6);
    //返回a中元素的个数
    a.size();
    //返回a在内存中总共可以容纳的元素个数
    a.capacity();
    //将a的现有元素个数调整至10个,多则删,少则补,其值随机
    a.resize(10);
    //将a的现有元素个数调整至10个,多则删,少则补,其值为2
    a.resize(10,2);
    //将a的容量扩充至100,
    a.reserve(100);
    //b为向量,将a中的元素和b中的元素整体交换
    a.swap(b);
    //b为向量,向量的比较操作还有 != >= > <= <
    a==b;
    

双端队列容器deque

  1. 原理:由一个中控器和多个缓冲区组成,中控器中的每个节点指向一片连续的缓冲区,在逻辑上形成连续的双端队列
    // deque的迭代器数据结构
    _Elt_pointer _M_cur;  //用于保存迭代器当前位置
    _Elt_pointer _M_first; //保存迭代器当前所属buffer的开始位置
    _Elt_pointer _M_last;//保存迭代器当前所属buffer的结束位置
    _Map_pointer _M_node;  //用于保存迭代器当前所属的节点位置
    
    在这里插入图片描述
  2. 特点
    • 双端进行插入和删除,时间复杂度为O(1),特别是头部插入比vector快。
    • 支持随机访问O(1),但顺序访问比vector慢,这是由deque数据结构决定的
    • 中控器节点数量 = max(元素数量/512 + 2, 8),512是默认的每个buffer大小。
  3. 头端插入push_front()(尾部插入与该原理类似)
    • 头部buffer空间足够时,直接从后往前插入
    • 头部buffer不足时
      • 当中控器节点足够时,则申请一个头部buffer
      • 当中控器节点不足时,重新申请一整块中控器节点内存,并将buffer地址进行浅拷贝
  4. 中间插入insert()
    • 检测插入位置
      • 若在前半部分则从后向前移动1位
      • 若在后半部分则从前向后移动1位
    • 移动前,现在头部或尾部进行一次尝试插入,如果buffer不足则进行扩容,足够则插入。

链式容器list

  1. 原理:底层数据结构为一个双向循环链表
    template<typename T,...>
    struct __List_node{
        //...
        __list_node<T>* prev;// prev 指针用于指向前一个节点
        __list_node<T>* next;// next 指针用于指向后一个节点
        T myval;// myval 用于存储当前元素的值
        //...
    }
    

正向链容器forward_list


少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
秘籍(点击图中书籍)·有缘·赠予你


🚩点此跳转到首行↩︎

参考博客

  1. 详解 C++ STL 六大组件,看完不懂打我…
  2. 容器适配器stack,queue和priority_queue
  3. array容器
  4. [c++] c++ std::vector 底层实现机制
  5. 基于源码剖析vector实现原理及注意事项
  6. C++ STL笔记四:deque容器;deque内部工作原理;deque构造函数;deque赋值;deque大小;deque存取;deque排序;deque插入删除
  7. 待定引用
  8. 待定引用

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

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

相关文章

在线支付系列【21】微信支付服务商接入前准备

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录项目概述接入准备1. 注册服务商号&#xff08;获取服务商mchid&#xff09;2. 注册公众号&#xff08;获取服务商APPID&#xff09;3. 绑定应用ID和服务商ID4. 入驻子商户&#xff08;特约商户进…

MyBatis基础知识

1 JDBC基础知识1.1 JDBC简介JDBC是使用Java语言操作关系型数据库的一套API&#xff0c;全称Java DataBase Connectivity&#xff0c;Java数据库连接。JDBC定义了操作所有关系型数据库的规则&#xff0c;同一套Java代码可以操作不同的关系型数据库。也就是JDBC是Java语言操作数据…

分布式高级篇3 —— RabbitMQ

一、RabbitMQ1、RabbitMQ 介绍2、RabbitMQ 的相关概念3、安装 RabbitMQ4、交换机类型&#xff08;1&#xff09;direct - 直连交换机&#xff08;2&#xff09;fanout - 扇出交换机&#xff08;3&#xff09;topic - 主题交换机5、RabbitMQ 管理界面6、SpringBoot 整合RabbitMQ…

Autowired注解源码解析

一、Autowired注解的原理的概览 我们都知道一个Bean的大致生命周期有这几个阶段&#xff0c;实例化--> 属性填充 --> 初始化 --> 销毁回调 其中Autowired作用的时间就是在属性填充阶段&#xff0c;而且是通过AutowiredAnnotation BeanPostProcessor类进行处理的。注…

android14预览版介绍及解读

​ 前言&#xff1a; android14快要来了&#xff0c;最近2月8日&#xff0c;android14的第一个开发者预览版发布了&#xff0c;正式版大约会和往常一样&#xff0c;大概率在六月份左右推出&#xff0c;八九月份时会有国内会有第一批手机支持安卓14。所以&#xff0c;本文就带…

为什么要用频谱分析仪测量频谱?

频谱分析仪是研究电信号频谱结构的仪器&#xff0c;用于信号失真度、调制度、谱纯度、频率稳定度和交调失真等信号参数的测量&#xff0c;可用以测量放大器和滤波器等电路系统的某些参数&#xff0c;是一种多用途的电子测量仪器。从事通信工程的技术人员&#xff0c;在很多时候…

免费下载学术文献的网站,好用!

推荐几款好用的免费下载学术文献网站&#xff0c;让你的查找文献环节更加事半功倍&#xff01; 1、Open Access Library&#xff08;OALib&#xff09;图书馆让学者可以免费下载学术文献和论文&#xff0c;并在这个平台上发表自己的论文。提供Open Access数据库资源。 2、文献…

Spring Security实现RBAC权限模型练习

1.Spring Security介绍 Spring Security的核心功能就是认证、授权、攻击防护&#xff0c;Spring Boot项目启动之后会自动进行配置&#xff0c;其核心就是一组链式过滤器。 如下图所示&#xff0c;对于一个用户请求&#xff0c;Username Password Authentication Filter验证用…

2022年API安全研究报告

导读 API应用的增速与其安全发展的不平衡,使其成为恶意攻击的首选目标,围绕API安全的攻防较量愈演愈烈。 2022年API安全风险概况 2022年平均每月遭受攻击的API数量超21万 2022年全年平均每月遭受攻击的API数量超过21万,第二季度(4-6月)遭受攻击的API数量达到高峰,月均…

经典文献阅读之--IGP2(可解释性目标的自动驾驶预测与规划)

0. 简介 对于自动驾驶的预测和规划而言&#xff0c;能够有效的对目标产生可解释性是非常有必要的&#xff0c;而《Interpretable Goal-based Prediction and Planning for Autonomous Driving》文中就提出了一种综合的自动驾驶预测和规划系统&#xff0c;它利用合理的逆规划来…

php mysql娱乐场所运营管理系统

目 录 1 背景与意义 3 1.1 研究背景 3 1.2 国内外发展状况研究 3 2 系统开发环境与技术 4 2.1 PHP介绍 4 2.2 MYSQL介绍 5 2.3 APACHE介绍 6 2.4 dreameaver介绍 7 2.5 wamp介绍 7 3 系统分析 8 3.1 系统可行性分析 8 3.1.1 技术可行性 …

【编程基础之Python】1、初始Python

【编程基础之Python】1、初始Python初始Python什么是PythonPython的运行过程Python的应用领域如何学好Python初始Python Python是一种跨平台的、开源免费的、解释型的、面向对象的高级编程语言。 Python的应用领域非常广泛&#xff0c;包括客户端程序、服务器程序、移动端程序…

Redis未授权漏洞蜜罐模拟与捕获分析

1.概述 文章主要分析Redis未授权漏洞的原理及形成原因&#xff0c;使用vulhub靶场进行漏洞复现&#xff0c;在了解漏洞原理并复现的基础上使用golang编写蜜罐代码进行模拟&#xff0c;开放端口在网上捕获真实存在的恶意攻击行为&#xff0c;对恶意样本进行分析&#xff0c;总结…

C++与Lua交互实例 -- 矩阵的加减乘除(版本二)

C与Lua交互实例 – 矩阵的加减乘除&#xff08;版本二&#xff09; TIPS&#xff1a;关于使用矩阵的加减乘除测试C与Lua的交互以及下面没讲述到的知识点可以阅读第一版&#xff1a; https://blog.csdn.net/qq135595696/article/details/128960951 同时下面两个方式矩阵的数据都…

爬虫JS逆向思路 - - 扣JS(data解密)

网络上几千块都学不到的JS逆向思路这里全都有&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb; 本系列持续更新中&#xff0c;三连关注不迷路&#x1f44c;&#x1f3fb; 干货满满不看后悔&#x1f44d;&#x1f44d;&#x1f44d; ❌注意…

电机过流的一次bug排查记录

一、bug现象描述如下&#xff1a; 有一天&#xff0c;某员工给自己的组件换一个语音模块&#xff0c;其中电机和主板是通过单总线连接&#xff0c;据该员工回忆曾经在换语音芯片时曾将电源线不小心短路过。 电机已经DVT试产&#xff0c;功能和硬件测试已经通过&#xff0c;但是…

小白系列Vite-Vue3-TypeScript:007-配置axios并封装api

上一篇我们介绍了ViteVue3TypeScript项目中Element Plus的安装和配置&#xff0c;本篇我们来介绍一下如何配置axios并封装api。axios是一个基于promise的HTTP库&#xff0c;可以用在浏览器和node.js中&#xff0c;其最大的亮点就是支持了ES6里的Promise Api。废话不多说&#x…

Node =>Express学习

1.Express 能做什么 能快速构建web网站的服务器 或 Api接口的服务期 Web网站服务器&#xff0c;专门对外提供Web网页资源的服务器Api接口服务器&#xff1a;专门对外提供API接口的服务器 2.安装 在项目所处的目录中&#xff0c;运行以下命令&#xff0c;简装到项目中了 npm …

ChatGPT与马斯克 在 “ 遥感 ” 中的初探索

有人说&#xff1a;一个人从1岁活到80岁很平凡&#xff0c;但如果从80岁倒着活&#xff0c;那么一半以上的人都可能不凡。 生活没有捷径&#xff0c;我们踩过的坑都成为了生活的经验&#xff0c;这些经验越早知道&#xff0c;你要走的弯路就会越少。 1前言 文章开始前&#x…

栈和队列基本原理

栈和队列基本原理1.栈1.1 栈基本原理1.2. 栈操作步骤1.2.1 插入数据流程【压栈】1.2.2 移除数据流程【出栈】1.3. 栈代码实现2.队列2.1 队列基本原理2.2 队列操作步骤2.2.1 插入数据2.2.2 移除数据2.3. 队列代码实现3.栈与队列对比1.栈 1.1 栈基本原理 栈顶【末尾】&#xff…