C++ STL容器概览

容器概览

容器分类

  • 顺序容器提供对元素(半开)序列的访问。
    • vector
    • list
    • forward_list
    • deque
  • 关联容器提供基于关键字的关联查询。
    • 有序关联容器:通常用平衡二叉树(红黑树)实现。
      • map
      • multimap
      • set
      • multiset
    • 无序关联容器:采用溢出链表法的哈希函数实现。
      • unordered_map
      • unordered_multimap
      • unordered_set
      • unordered_multiset
        标准库,还提供了一些保存元素的对象类型,但它们并未提供顺序容器或关联容器的全部功能:
  • 容器适配器提供对底层容器的特殊访问。
    • pirority_queue
    • queue
    • stack
  • 拟容器保存元素序列,提供容器的大部分但非全部功能。
    • array
    • 内置数组
    • string
    • valarray
    • bitset

对元素的要求

若想作为一个容器的元素,对象类型必须允许容器拷贝、移动以及交换元素。
关联容器要求其元素能够排序,很多可以应用于容器的算法也有这样的要求。
默认情况下,<运算符被用来定义序。
排序标准必须定义一个严格弱序。
即,一个排序标准必须满足:

  • 反自反性:不小于自身。
  • 反对称性:两个操作对象不能同时小于对方;如果 x 小于 y,那么 y 绝不能小于 x。
  • 传递性:如果 x 小于 y,且 y 小于 z,那么 x 必须小于 z。
  • 相等的传递性:如果 x 等于 y,且 y 等于 z,那么 x 必须等于 z(x == y定义为!(x < y || y < x))。

顺序容器

vector 定义在<vector> 中;list 和 forward_list 定义在<list>中;deque 定义在<deque>中。
顺序容器为元素连续分配内存(vector 和 deque)或将元素组织为链表(list 和 forward_list )。
vector(以及类似的连续存储的元素的数据结构)有三个主要优势:

  • vector 的元素是紧凑存储的。
  • vector 的遍历非常快。
  • vector 支持简单且高效的随机访问。
    当在一个 vector 中插入、删除元素时,其它元素可能会移动。
    一个空 forward_list 只占用一个内存字。
容器功能
vector<T,A>空间连续分配的 T 类型元素序列;默认选择容器
list<T,A>T 类型元素双向列表;当需要插入或删除元素,但不移动已有元素时选择它
forward_list<T,A>T 类型元素单向列表;很短或空序列的理想选择
deque<T,A>T 类型元素双端队列;向量和链表的混合;对大多数应用而言,都比向量和链表其中之一要慢

模板参数 T 是元素类型;
模板参数 A 是一个分配器,容器用它来分配和释放内存;
A 的默认值是std::allocator<T>,此分配器用operator new()operator delete()为元素分配和释放内存。

有序关联容器

map 和 mutlimap 定义在头文件<map>中;set 和 mutliset 定义在头文件<set>中。

容器功能
map<K,V,C,A>从 K 到 V 的有序映射;一个(k,V)对序列
multimap<K,V,C,A>从 K 到 V 的有序映射;允许重复关键字
set<K,C,A>K 的有序集合
multiset<K,C,A>K 的有序集合,允许重复关键字

模板参数 K 为关键字类型,其默认序标准是std::less<K>
模板参数 V 为值类型;
模板参数 C 是比较类型;
模板参数 A 是一个分配器,容器用它来分配和释放内存;
对映射,A 的默认值是std::allocator<std::pair<const K,T>>
对集合,A 的默认值是std::allocator<T>

无序关联容器

无序容器则定义在头文 <unordered_map><unordered_set>中。

容器功能
unordered_map<K,V,H,E,A>从 K 到 V 的无序映射
unordered_set<K,V,H,E,A>从 K 到 V 的无序映射;允许重复关键字
unordered_multimap<K,H,E,A>K 的无序集合
unordered_multiset<K,H,E,A>K 的无序集合,允许重复关键字

模板参数 H 是哈希函数类型,其默认值是std::hash<K>
模板参数 E 是相等性判定函数类型,其默认值是std::equal_to<K>

容器适配器

容器功能
pirority_queue<T,C,Cmp>T 的优先队列
queue<T,C>T 的队列,支持 push() 和 pop() 操作
stack<T,C>T 的栈,支持 push() 和 pop() 操作

模板参数 Cmp 是优先级函数类型,其默认值是std::less<T>
模版参数 C 是一个容器类型;
queue 的默认容器类型是std::dequeue<T>
stack 和 pirority_queue 的默认容器类型是std::vecter<T>

拟容器

容器功能
T[N]固定大小的内置数组;N 个连续存储的类型为 T 的元素;没有 size() 或其它成员函数
array[T,N]固定大小的数组;N 个连续存储的类型为 T 的元素;类似内置数组
basic_string<C,Tr,A>一个连续分配空间的类型为 C 的字符序列,支持文本操作(如连接 + 和 +=)
stringbasic_string<char>
u16stringbasic_string<char16_t>
u32stringbasic_string<char32_t>
wstringbasic_string<wchar_t>
valarray<T>数值向量,支持向量运算,但有一些限制,这些限制是为了鼓励高性能实现;只在做大量向量运算时使用
bitset[N]N 个二进制位的集合,支持集合操作,如 & 和
vector<bool>vector<T>的特例化版本,紧凑保存二进制

对于 basic_string,模板参数 A 是一个分配器,Tr 是字符萃取。

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

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

相关文章

NestJS使用gRPC实现微服务通信

代码仓库地址&#xff1a;https://github.com/zeng-jc/rpc-grpc-practice 1.1 基本概念 gRPC 基于 Protocol Buffers&#xff08;protobuf&#xff09;作为接口定义语言&#xff08;IDL&#xff09;&#xff0c;意味着你可以使用 protobuf 来定义你的服务接口&#xff0c;gRP…

【HDFS面试】HDFS面试题答案

题目 HDFS文件写入和读取流程 HDFS组成架构 介绍下HDFS&#xff0c;说下HDFS优缺点&#xff0c;以及使用场景 HDFS作用 HDFS的容错机制 HDFS的存储机制 HDFS的副本机制 HDFS的常见数据格式&#xff0c;列式存储格式和行存储格式异同点&#xff0c;列式存储优点有哪些? …

【环境搭建】Win10下安装Docker

下载地址 Docker Windows 桌面版下载地址 各镜像下载地址 可能遇到的问题 安装后一直显示以下文字 Starting the Docker Engine… Docker Engine is the underlying technology that runs containers 请尝试使用此方法&#xff1a;https://zhuanlan.zhihu.com/p/667495068

RGB颜色表示法(RGBA解释) 以及常见的色调

RGB&#xff1a;代表red&#xff0c;green&#xff0c;blue。即用这三个色调表示所有颜色。 表示方式如&#xff1a;&#xff08;255,255,255&#xff09;白色、&#xff08;0,0,0&#xff09;黑色 改变三个不同的数值可以得到不同的颜色&#xff0c;数值取值范围为0-255&#…

【shell脚本实战案例】awk实现行转列数据变换

问题背景&#xff1a; awk&#xff08;“Aho, Weinberger, and-Kernighan”&#xff09; 是一种文本处理工具&#xff0c;用于从输入文件中提取并输出指定的信息。它以行为单位读取文件&#xff0c;并根据用户定义的模式和操作来处理每一行数据。 awk命令是一种强大的编程语…

设计模式——模板方法模式

引言 模板方法模式是一种行为设计模式&#xff0c; 它在超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 问题 假如你正在开发一款分析公司文档的数据挖掘程序。 用户需要向程序输入各种格式 &#xff08;PDF、 DOC 或 CSV&#…

Ubuntu 常用命令之 cp 命令用法介绍

cp命令在Ubuntu系统中用于复制文件或目录。它的基本格式是cp [选项] 源文件或目录 目标文件或目录。 以下是一些常用的cp命令选项 -i&#xff1a;在覆盖目标文件之前将给出提示。-r或-R&#xff1a;递归复制&#xff0c;用于目录的复制操作。-v&#xff1a;详细模式&#xff…

2023-12-12 AIGC-AI工具的基本工作原理

摘要: 2023-12-12 AIGC-AI工具的基本工作原理 AI工具的基本工作原理 AI工具的基本工作原理涉及到一系列复杂的技术和算法。这些原理可以根据不同类型的AI工具进行概括&#xff0c;包括机器学习、自然语言处理、图像识别等。以下是一些关键的AI工具及其工作原理的概述&#xff…

对于实例控制,枚举类型优先于readResolve

实例控制是指控制类实例的创建和使用过程&#xff0c;而 readResolve 方法是 Serializable 接口中的一个特殊方法&#xff0c;用于在反序列化时控制对象的实例。在一些情况下&#xff0c;使用枚举类型可以更优雅地实现实例控制&#xff0c;而不需要依赖 readResolve 方法。 下…

shell编程-uniq命令详解(超详细)

文章目录 一、引言二、命令格式和选项三、示例用法四、注意事项和常见问题五、扩展应用六、总结七、参考文献 一、引言 本文将介绍Unix/Linux系统中的uniq命令&#xff0c;该命令用于从输入中删除重复的行&#xff0c;并可进行排序和统计操作。uniq命令在处理文本文件时非常有…

网络基础(十二):ACL与NAT

目录 一、ACL 1、ACL的概述 2、ACL的分类 3、ACL的应用 4、ACL的组成和基本原理 ​编辑 5、ACL的配置 5.1配置基本ACL 5.2配置高级ACL 二、NAT 1、NAT的概述 2、NAT的分类 3、NAT的工作原理 4、静态NAT的配置 5、动态NAT的配置 6、NAPT&#xff08;端口映射&am…

查询某个类是在哪个JAR的什么版本开始出现的方法

背景 我们在依赖第三方JAR时&#xff0c;同时也会间接的依赖第三方JAR引用的依赖&#xff0c;而当我们项目中某个依赖的版本与第三方JAR依赖的版本不一致时&#xff0c;可能会导致第三方JAR的在运行时无法找到某些方法或类&#xff0c;从而无法正常使用。 如我正在开发的一个…

流程引擎相关资料

最近调研流程引擎相关知识&#xff0c;BPMN规范和流程引擎相关知识无法避开&#xff0c;以及市面上比较多的流程引擎产品。 BPMN2.0 基本形状 流对象&#xff08;Flow Objects&#xff09;&#xff0c;流对象是定义业务流程的主要图形元素。它进一步细分为三个类别&#xff0…

代码随想录算法训练营

Day 01 | 704. 二分查找、27. 移除元素 今日学习的文章链接和视频链接 自己看到题目的第一想法 看完代码随想录之后的想法 自己实现过程中遇到哪些困难 今日收获&#xff0c;记录一下自己的学习时长 Day 02 | 977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff…

运行时类的应用

创建运行时类的对象 例&#xff1a; 创建运行时类的Class类对象。 Class<Person> clazz Person.class&#xff1b; newInstance(&#xff09;:调用此方法&#xff0c;创建对应的运行时类的对象。内部调用了运行时类的空参构造器。 Person p clazz.newInstance(); …

[SUCTF 2018]MultiSQL MYSQL 预处理写

首先这道题需要预处理写马 之前在ctfshow中学习过预处理 我们来看看 CTFSHOW -SQL 注入-CSDN博客 首先我们开始判断是否存在注入 2^(if(10,1,0))2^(if(ascii(mid(user(),1,1))>0,0,1))判断出存在sql注入 然后我们开始fuzz 发现 select &#xff0c;union 都没了 但是…

Mistral MOE架构全面解析

从代码角度理解Mistral架构 Mistral架构全面解析前言Mistral 架构分析分词网络主干MixtralDecoderLayerAttentionMOEMLP 下游任务因果推理文本分类 Mistral架构全面解析 前言 Mixtral-8x7B 大型语言模型 (LLM) 是一种预训练的生成式稀疏专家混合模型。在大多数基准测试中&…

18.Oracle中的substr()函数字符截取

1、substr函数格式 (俗称&#xff1a;字符截取函数) 格式1&#xff1a; substr(string string, int a, int b); 格式2&#xff1a;substr(string string, int a) ; 解析&#xff1a; 格式1&#xff1a; 1、string 需要截取的字符串 2、a 截取字符串的开始位…

探索顺序表:数据结构中的秩序之美(c语言实现常见功能接口)

在我们的数据结构探索中&#xff0c;我们已经探讨时间复杂度、空间复杂度。大家可以移步到我的上篇文章&#xff1a; 打开数据结构大门&#xff1a;深入理解时间与空间复杂度 今天&#xff0c;我们将深入研究另一个重要的主题——顺序表 全部的源代码大家可以去我github主页…

web服务器之——www服务器的基本配置

目录 一、www简介 1、什么是www 2、www所用的协议 3、WEB服务器 4、主要数据 5、浏览器 二、 网址及HTTP简介 1、HTTP协议请求的工作流程 三、www服务器的类型(静态网站&#xff08;HTML&#xff09;&#xff0c; 动态网站(jsp python,php,perl)) 1、 仅提供…