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

news2024/12/27 18:48:02

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

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

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

相关文章

RabbitMQ开启MQTT协议支持

1&#xff09;RabbitMQ启用MQTT插件 rootmq:/# rabbitmq-plugins enable rabbitmq_mqtt Enabling plugins on node rabbitmq: rabbitmq_mqtt The following plugins have been configured:rabbitmq_managementrabbitmq_management_agentrabbitmq_mqttrabbitmq_web_dispatch Ap…

leet hot 100-6 三数之和

三数之和 原题链接思路代码 原题链接 leet hot 100-5 15. 三数之和 思路 从前往后定义第一个数字 first 开始遍历整个数组 然后要求 frist和上一个数字不重复否则就是重复组合 从frist往后遍历第二个数字 同样要求第二个数字不能重复 再定义第三个数字从后往前面数 三个数字…

【MySQL】表的约束 -- 详解

表中一定要有各种约束&#xff0c;通过约束让我们在未来插入数据库表中的数据是符合预期的。约束本质是通过技术手段倒逼程序员插入正确的数据&#xff0c;反过来站在 MySQL 的角度&#xff0c;凡是插入进来的数据都是符合数据约束的。约束的最终目标&#xff1a;保证数据的完整…

试一下newb,还是有错误呀

解题&#xff1a;原式&#xff1d; 2. 在递增的等比数列 ( a n ) (a_n) (an​)中&#xff0c;若 ( a 3 − a 1 5 2 ) (a_3 - a_1 \frac{5}{2}) (a3​−a1​25​), ( a 2 3 ) (a_2 3) (a2​3), 则公比 (q) A. ( 4 3 ) ( \frac{4}{3} ) (34​) B. ( 3 2 ) ( \frac{3}{2} …

蛇形矩阵1

题目描述 把数1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;N*N按照“蛇形1”放入N*N的矩形中&#xff0c;输出结果。 下面是N10的蛇形1的图示 输入格式 第一行1个正整数&#xff1a;N&#xff0c;范围在[1,100]。 输出格式 N行&#xff0c;每行N个整数。 输入/…

GTSAM 中的鲁棒噪声模型与 M-估计 (GTSAM Robust Noise Model and M-Estimator)

Title: GTSAM 中的鲁棒噪声模型与 M-估计 (GTSAM Robust Noise Model and M-Estimator) 文章目录 前言I. 噪声模型II. 鲁棒回归 —— M 估计1. 线性回归2. 损失函数3. 加权最小二乘 III. 鲁棒噪声模型1. 鲁棒目标函数2. 非线性加权最小二乘3. 迭代重加权最小二乘法 V. 总结参考…

第 2 章 微信小程序的构成 (代码导读)断更,后续继续更新

2.1 小程序项目的基本结构 Hello World&#xff01;程序.mp4 文泉云盘 -- 图书二维码资源管理系统兆泰源二维码管理系统https://www.wqyunpan.com/resourceDetail.html?id284928&openIdoUgl9wdyNYHu9EcAe-GEwbQdZilY&qrcodeId242916&signc2lnbm1PUmNxSndPWGFOck…

rhel8配置bond遇到的问题汇总

操作环境信息 配置bond mode=4 两块网卡的配置信息 bond卡的配置信息(标红是后来加上的) 遇到的问题 rhel8 使用NetworkManage 管理网络,而不使用network,经常用到的命令是nmcli 拉起bond0后,因为没有获取到ip地址,每隔一段时间就会将网卡down掉,出现nic link is down …

代码随想录算法训练营第四三天 | 最后一块石头的重量 II、目标和、一和零

目录 最后一块石头的重量 II目标和一和零 LeetCode 1049. 最后一块石头的重量 II LeetCode 494. 目标和 LeetCode 474.一和零 最后一块石头的重量 II class Solution {// dp[j] 容量为j 的背包&#xff0c;最多可以背最大重量为dp[j]。// dp[j] Math.max(dp[j], dp[j - sto…

zabbix3.4.6 源码安装

Step1&#xff1a; 下载 https://www.zabbix.com/download 选中一下。download Zabbix Sources PackageReleaseDateRelease NotesZabbix ManualDownloadZabbix 3.4Server, Proxy, Agent, GUI3.4.615 January, 2018 Download step2 &#xff1a;拷贝在redhat 6.3_X86_86(192…

基于huggingface加载openai/clip-vit-large-patch14-336视觉模型demo

文章目录 引言一、模型加载二、huggingface梯度更新使用三、图像处理四、模型推理五、整体代码总结 引言 本文介绍如何使用huggingface加载视觉模型openai/clip-vit-large-patch14-336&#xff0c;我之所以记录此方法源于现有大模型基本采用huggingface库来加载视觉模型和大语…

【生成式AI】ChatGPT 原理解析(2/3)- 预训练 Pre-train

Hung-yi Lee 课件整理 预训练得到的模型我们叫自监督学习模型&#xff08;Self-supervised Learning&#xff09;&#xff0c;也叫基石模型&#xff08;foundation modle&#xff09;。 文章目录 机器是怎么学习的ChatGPT里面的监督学习GPT-2GPT-3和GPT-3.5GPTChatGPT支持多语言…

nginx(二)

nginx的验证模块 输入用户名和密码 第一步先下载httpd 这个安装包 第二步编辑子配置文件 然后去网页访问192.168.68.3/admin/ 连接之后&#xff0c;会出现404&#xff0c;404出现是因为没给网页写页面 如果要写页面&#xff0c;则在/opt/html&#xff0c;建立一个admin&#x…

算法沉淀——动态规划之路径问题(leetcode真题剖析)

算法沉淀——动态规划之路径问题 01.不同路径02.不同路径 II03.珠宝的最高价值04.下降路径最小和05.最小路径和06.地下城游戏 01.不同路径 题目链接&#xff1a;https://leetcode.cn/problems/unique-paths/ 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图…

探索C语言位段的秘密

位段 1. 什么是位段2. 位段的内存分配3. 位段的跨平台问题4. 位段的应用4. 使用位段的注意事项 1. 什么是位段 我们使用结构体实现位段&#xff0c;位段的声明和结构体是类似的&#xff0c;有两个不同&#xff1a; 位段的成员必须是int&#xff0c;unsigned int&#xff0c;或…

IO进程线程作业day7

信号灯集共享内存 自定义头文件 #ifndef SEM_H_ #define SEM_H_ //创建信号灯集, int creat_t(int number); //申请释放资源 int P(int semid,int semno); //申请释放资源 int V(int semid,int semno); //删除信号灯集 int del(int semid); #endif信号灯集函数集合 #include…

多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型

多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型 目录 多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.多维时序 | Matlab实现GRU-MATT门控循环单元融…

wcf 简单实践 数据绑定 数据更新ui

1.概要 2.代码 2.1 xaml <Window x:Class"WpfApp3.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expr…

《数据治理简易速速上手小册》第2章 数据治理框架的建立(2024 最新版)

文章目录 2.1 确立数据治理目标2.1.1 基础知识2.1.2 重点案例&#xff1a;提升零售业数据质量2.1.3 拓展案例 1&#xff1a;银行的数据安全加强2.1.4 拓展案例 2&#xff1a;医疗机构的合规性数据报告 2.2 数据治理框架的关键要素2.2.1 基础知识2.2.2 重点案例&#xff1a;制药…

VM-UNet:视觉Mamba UNet用来医学图像分割 论文及代码解读

VM-UNet 期刊分析摘要贡献方法整体框架1. Vision Mamba UNet (VM-UNet)2. VSS block3. Loss function 实验1.对比实验2.消融实验 可借鉴参考代码使用 期刊分析 期刊名&#xff1a; Arxiv 论文主页&#xff1a; VM-UNet 代码&#xff1a; Code 摘要 在医学图像分割领域&#x…