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

STL:主要是一些“容器”的集合;“容器”有:vector(数组)、list(双向链表)、deque(双向队列)、set(集合)、map(图:内部结构红黑树)

STL也是算法和其他一些组件的集合,是泛型编程的一个经典范例。

STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。

  • STL六个组成部分

1、容器:特殊的数据结构,实现了数组、链表、队列等,实质是类模板。

2、迭代器:一种复杂的指针,可以通过其读写容器中的对象,实质是运算符重载。

3、算法:读写容器对象的逻辑算法:排序、遍历、查找.......,实质是模板函数。

4、空间配置器:分配空间。

5、配接器:用来修饰容器、仿函数、迭代器接口,配合仿函数使用。

6、仿函数:类似函数,通过重载()运算符来模拟函数行为的类

  • 组件间的关系

容器通过配置器取得数据存储空间,算法通过迭代器存取容器内容,仿函数可以协助算法完成不同的策略变化,配接器可以修饰或套接仿函数。

  • vector(单向数组)

规定只能从尾巴进行插入、尾巴进行删除,数组空间可扩容。

可以在中间插入删除,但不建议使用。

成员函数(迭代器相关)

begin:返回指向元素首地址的迭代器(指向元素开头),++操作(后)右走iterator

end:返回指向元素末尾的迭代器,最后一个元素的下一个位置。iterator

rbegin:逆向迭代器(指向元素末尾),++操作(前)左走reverse_iterator

rend:逆向迭代器(指向元素开头)reverse_iterator

cbegin:返回一个常量迭代器,指向vector容器的第一个元素的位置。const_iterator

cend:返回一个常量迭代器,指向容器中最后一个元素的下一个位置。const_iterator

容量

size:返回元素个数。

max_size:容量

resize:改变大小

empty:判空

重载

[ ]

at

使用方法

push_back:入栈。

back:返回最后一个元素。

pop_back:出栈,删除,无返回值。

insert:插入

swap:交换

clear:清空

sort:排序,头文件<algorithm>

erase:删除迭代器指向元素/删除一段元素

例:

vector<int>   arr;         //定义了一个名为arr的vector容器,arr容器中每个元素为int类型。

vector<vector<int>>  arr;  //定义了一个名为arr的二维容器,此容器中每个元素是一个int类型的容

器。

vector<int>  arr  (5);  //定义了一个名为arr的vector容器,vector容器中共有5个元素,每个元素为int类型。

vector<int>  arr  (3,100);  //定义了一个名为arr的vector容器,vector容器中共有3个元素,每个元素都初始化为100。

push_back:自动扩容

[ ]:会自动扩容

at:需要设置容量

迭代器:指针,vector成员iterator

swap:交换元素值

sort:升序排序 头文件<algorithm>

erase:删除迭代器指向元素

erase:删除一段元素

总结

vector向量相当于一个数组,在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。

优点:

可以不指定大小,使用push_back、pop_back来进行动态操作。

随机访问方便,即支持[ ]操作符与at()

节省空间

缺点:

在内部进行插入、删除的效率低。

只能在最后进行push和pop。

当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放。

  • list(双向链表)

       每一个节点都包含一个信息块Infor,一个前驱指针Pre,一个后驱指针Post。可以不分配必须的内存大小,方便进行增加和删除操作。使用的是非连续的内存空间进行存储。常使用迭代器进行操作。

优点:

不使用连续内存完成动态操作;

在内部方便得进行插入和删除操作;

可在两端进行push、pop

缺点:

不能在内部进行随机访问,即不支持.at()、[ ]操作符

相对于vector占用内存多(vector只有数据块,list多了指针)

访问list一般情况都使用迭代器。

函数

push_front:头插

push_back:尾插

pop_front:头出

pop_back:尾出

成员函数(迭代器相关)

begin、end、rbegin、rend、cbegin、cend、crbegin、crend

容量

empty、size、max_size

使用方法

insert、erase、swap、resize、clear

示例

begin、end

rbegin、rend返回reverse_iterator逆向迭代器

cbegin、cend返回const_iterator常量迭代器

总结

双向链表;插入和删除在任意位置效率都很高;不能随机访问,不支持[ ],at();访问list一般情况都使用迭代器。

  • deque(双向队列)

存储方式采用分块存储;deque在功能上合并了vector和list。

优点:

随机访问方便,即支持[ ]和vector.at();

在内部方便地进行插入和删除操作;

可在两端进行push、pop。

缺点:

占用内存多。

erase:删除迭代器所指位置/一段数据

deque<int>  mydeque;

1、mydeque.erase(mydeque.begin()+5);   //begin()返回的是迭代器(指针)

2、mydeque.erase(mydeque.begin(),mydeque.begin()+3);

C++11新特性

emplace : insert

emplace_front : push_front

emplace_back : push_back

使用区分

如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector;

如果你需要大量的插入和删除,而不关心随机存取,则应使用list;

如果你需要随机存取,而且关心两端数据的插入和删除,则应使用deque。

STL序列容器:vector、deque、list

STL关联容器:set、multiset、map、multimap

STL迭代器:iterator

  • set(集合)

set是一个有序的集合,其中的元素插入后就会按照某种规则进行排序,从小到大。

内部红黑树,无值相同的元素。

s.find:返回指向查找的指定元素的迭代器

s.count:查找指定数据是否存在,存在则1,不存在则0

lower_bound:函数返回的迭代器指向的元素是集合中第一个不小于给定值的元素。

upper_bound:函数返回一个指向大于给定值的元素的迭代器,即返回指向第一个大于给定值的元素的迭代器。

示例

从小到大排列,且插入相同的值,只有第一次有效。

count:查找指定数据是否存在,存在则1,不存在则0

红黑树排列:12578

erase:删除2-8之间的元素(包括2,不包括8)

find:返回指向查找的指定元素的迭代器。

排序:12578

lower_bound:由于有5,则返回指向5的迭代器,无则指向5的下一位数7

upper_bound:指向给定值7的下一位数8

erase:删除5-8之间的数(包括5,不包括8)

  • map(图)

内部红黑树

       是一种关联容器,用于存储键值对。每个键值对称为一个元素,键和值可以是任意数据类型。Map中的元素按照键的大小自动排序,并且每个键只能在map中出现一次。

map中键不能重复,重复则第二次为修改。

map中值可以相同。

map中会按照键从小到大排列

C++官网:www.cplusecpluse.com

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据分析-Pandas数据如何图示规律

数据分析-Pandas数据如何图示规律 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

一文读懂!ERP是什么?ERP和进销存有哪些区别?

ERP是什么&#xff1f;ERP和进销存有哪些区别&#xff1f; ERP和进销存可不止是叫法上的区别&#xff0c;这其中的门道还大着呢&#xff0c;今天就来跟大家详细讲解一下这些问题&#xff01;全文字数4000&#xff0c;干货满满&#xff0c;建议收藏&#xff01; 本文你将了解&…

无人驾驶-室内外循迹运行

1. 前言 好多初创公司公布出来的视频明显都是循迹的效果&#xff0c;不是说循迹不好&#xff0c;相反可以证明&#xff0c;循迹是自动技术开始的第一步。 自动驾驶循迹&#xff1a;一种能够自动按照给定的路线&#xff08;通常是采用不同颜色或者其他信号标记来引导&#xff…

✅技术社区项目—JWT身份验证

通用的JWT鉴权方案 JWT鉴权流程 基本流程分三步: ● 用户登录成功之后&#xff0c;后端将生成的jwt返回给前端&#xff0c;然后前端将其保存在本地缓存; ● 之后前端与后端的交互时&#xff0c;都将iwt放在请求头中&#xff0c;比如可以将其放在Http的身份认证的请求头 Author…

跨境外贸自动评论脚本开发常用代码!

随着跨境电商的兴起&#xff0c;自动化评论成为了提升销售和客户满意度的重要工具&#xff0c;通过编写自动评论脚本&#xff0c;商家可以快速地在各个平台留下正面评价&#xff0c;提高产品的曝光率和信誉度。 本文将介绍跨境外贸自动评论脚本开发的一些常用代码&#xff0c;…

STM32控制数码管从0显示到99

首先 先画电路图吧&#xff01;打开proteus&#xff0c;导入相关器件&#xff0c;绘制电路图。如下&#xff1a;&#xff08;记得要保存啊&#xff01;发现模拟一遍程序就自动退出了&#xff0c;有bug&#xff0c;我是解决不了&#xff0c;所以就是要及时保存&#xff0c;自己重…

远程访问Mysql数据库(最新有效)

在我们日常的开发中&#xff0c;我们的Mysql数据库一般都是不可以直接远程访问的&#xff0c;但有时候在特定的场景下&#xff0c;也想要远程访问&#xff0c;那要怎么配置呢&#xff1f; 其实要配置远程访问很简单&#xff0c;只需要做如下配置&#xff1a; 1.查看当前的用户…

代码随想录算法训练营day26

题目&#xff1a;39_组合总数&#xff08;没看题解&#xff09; 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&…

Yolov8有效涨点:YOLOv8-AM,添加多种注意力模块提高检测精度,含代码,超详细

前言 2023 年&#xff0c;Ultralytics 推出了最新版本的 YOLO 模型。注意力机制是提高模型性能最热门的方法之一。 本次介绍的是YOLOv8-AM&#xff0c;它将注意力机制融入到原始的YOLOv8架构中。具体来说&#xff0c;我们分别采用四个注意力模块&#xff1a;卷积块注意力模块…

idea设置

全局配置 proxy 一般公司网络是局域网络&#xff0c;需要配置proxy keyMap 设置自己习惯的快捷键模式 auto Import 自动添加和移除jar包 console 编码格式 &#xff08;有可能会造成乱码&#xff09; java编码格式设置 Tab size File and Code Templates 进公司必设 File…

React组件详解

React组件分为两大类 1.函数组件 2.类组件&#xff08;最常用&#xff09; 组件化 import ReactDom from "react-dom";// // 1.通过函数创建一个组件 // 2.函数名字必须大写开头 // 3.函数必须有返回值 function Func1() {return <h2>这是一个基础组件</h…

web组态插件

插件演示地址&#xff1a;http://www.byzt.net 关于组态软件&#xff0c;首先要从组态的概念开始说起。 什么是组态 组态&#xff08;Configure&#xff09;的概念来自于20世纪70年代中期出现的第一代集散控制系统&#xff08;Distributed Control System&#xff09;&#xf…

Jmeter 的 jar 包开发环境搭建,看这一篇就够了!

01 JDK环境变量配置 JAVA_HOMEE:\Program Files\Java\jdk1.8.0_102 Path%JAVA_HOME%\bin; CLASSPATH.;%JAVA_HOME%\lib\dt.jar;.;%JAVA_HOME%\lib\tools.jar 验证环境变量有没有生效&#xff1a;看到如下信息说明 JDK 环境变量已经生效 02 配置 maven 环境 1、下载地址&…

Unity中URP实现水体(水下的扭曲)

文章目录 前言一、使用一张法线纹理&#xff0c;作为水下扭曲的纹理1、在属性面板定义一个纹理&#xff0c;用于传入法线贴图2、在Pass中&#xff0c;定义对应的纹理和采样器3、在常量缓冲区&#xff0c;申明修改 Tilling 和 Offset 的ST4、在顶点着色器&#xff0c;计算得到 应…

解析ChatGPT Plus相比chatgpt3.5有哪些优势

「ChatGPT Plus」提供更出色的对话体验和更广泛的应用能力&#xff0c;学生可以用来写作、职场人也可以用来写计划书、策划书等等&#xff0c;并且问它一些问题比搜索引擎好用多了简直。但普通人使用起来有一点门槛&#xff0c;并且升级4.0也难住了许多爱好者。 ChatGPT主要功能…

【C++进阶】STL容器--stack和queue深度剖析优先队列适配器原理

目录 前言 1. 容器的使用 1.1 stack 1.2 queue 2. 什么是适配器 3. stack&&queue底层实现 4. deque的简单介绍 4.1 deque的缺陷 5. priority_queue 思考 6. priority_queue的实现 前言 栈和队列在C语言中大家都有所了解&#xff0c;C语言的栈和队列都是我们手动去…

2024最新版本Teamviewer安装和使用

事情背景 今年元宵节刚好是周末&#xff0c;就回趟家&#xff0c;整个项目几百人都解决不了的问题&#xff0c;眼巴巴要看着要我分析。我就只能远程看看&#xff0c;结果向日葵卡得不行&#xff0c;同事推荐用Teamviewer&#xff0c;诶&#xff0c;真香。 由于现在Teamviewer…

神经网络系列---权重初始化方法

文章目录 权重初始化方法Xavier初始化&#xff08;Xavier initialization&#xff09;Kaiming初始化&#xff0c;也称为He初始化LeCun 初始化正态分布与均匀分布Orthogonal InitializationSparse Initializationn_in和n_out代码实现 权重初始化方法 Xavier初始化&#xff08;X…

ETL数据仓库的使用方式

一、ETL的过程 在 ETL 过程中&#xff0c;数据从源系统中抽取&#xff08;Extract&#xff09;&#xff0c;经过各种转换&#xff08;Transform&#xff09;操作&#xff0c;最后加载&#xff08;Load&#xff09;到目标数据仓库中。以下是 ETL 数仓流程的基本步骤&#xff1a…

工作中常见问题总结

工作中常见错误清单 1、springboot实现无数据库启动 问题 springboot往往是作为b/s系统的server端的架子来使用&#xff0c;但是有些时候&#xff0c;是作为静默的server&#xff0c;并没有界面和数据库&#xff0c;但是springboot默认是链接数据库的&#xff0c;如何解决这个…