介绍set和map容器

文章目录

  • 1.什么是关联式容器
  • 2.什么是键值对
  • 3.树形结构的关联式容器
    • 3.1set
      • 3.1.2set的使用
        • set的构造
        • set的迭代器
        • set的容量
        • set的常用操作
        • set的简单使用
    • 3.2 map
      • map的构造
      • map的迭代器
      • map的容量
      • map的常用操作
      • map的使用
    • 3.3multiset
    • 3.4 multimap

在介绍set和map容器前先了解什么是关联式容器和键值对

1.什么是关联式容器

在初始阶段我们所学的STL容器当中,像vector,list,stack,queue等都是序列式容器,因为在其底层为线性序列的数据结构,里面储存的元素本身。那么什么是关联式容器呢?
关联式容器也是用来存储数据的,与序列式式容器不同的是,其里面存储的是<key,value>结构的键值对,在数据检索时比序列式容器效率更高

2.什么是键值对

用来表示具有一一对应关系的一种结构,该结构种=中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。就像字典那样,一个英语单词对应着一个中文释义,那么我们可以是英语单词和中文释义是一一对应的关系,可以通过该单词找到与其对应的中文释义。

3.树形结构的关联式容器

在STL当中一共实现两种不同的结构管理式容器:树形结构与哈希结构。树型结构的关联式容器主要有4种:map、set、multimap、multiset。他们的共同特点:使用红黑树作为底层数据结构,容器中的元素是一个有序的序列。

3.1set

set
set

1.set是按照一定次序存储元素的容器
2.在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能再容器中修改(元素总是const),但是可以从容器中插入或是删除它们。
3.再内部,set中的元素总是按照内部比较对象(类型比较)所指示的特定严格排序准则进行排序。
4.set容器通过key访问单个元素的速度通常比unordered_set慢,但是它们允许根据顺序对子集进行直接迭代
5.set咋底层是用红黑树实现的

注意:

1.与map/multimap不同,map/multimap中存储的真正的键值对<key,value> ,set中只放value,但在底层实际放的是由<value,value> 构成的键值对
2.set中插入元素时,只需要插入value即可,不需要构造键值对
3.set中的元素不可重复(由此可以用set进行去重)
4.使用set的迭代器遍历set中的元素,可以得到有序的序列(底层为搜索二叉树(红黑树))
5.set中的元素默认按照小于来比较
6.set查找某个元素,时间复杂度为 l o g n log n logn
7.set中的元素不允许修改(如果修改了会改变红黑树的结构)

3.1.2set的使用

set的构造

分别为
构造空的set
迭代器构造
拷贝构造
set的构造

set的迭代器

set的迭代器

set的容量

set的容量

set的常用操作

set的常用操作
set的常用操作

set的简单使用
#include <set>
#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<int> v({ 2,3,1,5,6,3,2,4,5,1,9,0 });
    //利用迭代器构造set
    set<int> s(v.begin(), v.end());
    for (auto& x : s)
        cout << x << ' ';
    //打印结果0 1 2 3 4 5 6 9
    //可以看到set是具有去重操作的
    cout << endl;
    //set迭代器的使用
    set<int>::iterator it = s.begin();
    for (; it != s.end(); ++it)
        cout << *it << ' ';
    cout << endl;
    //打印结果0 1 2 3 4 5 6 9
    return 0;
}

3.2 map

map
map
key表示 键值对中key的类型(相当于字典中的英文单词)
value表示 键值对中value的类型 (相当于英文单词对应的中文)
compare:比较器的类型,map中的元素是按照key进行比较的,缺省情况下就是按照小于来比较,一般情况下(内置元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户直接写一个比较规则
Alloc:空间配置器

map的构造

map的构造

map的迭代器

map的迭代器

map的容量

map的容量

map的常用操作

map的常用操作
map的常用操作

map的使用

#include <map>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<pair<string, string>> vp({{ "apple","苹果" },{ "yui", "结衣"} , { "man", "男人" } });
    map<string, string> d(vp.begin(), vp.end());//构造map
    for (auto& x : d)
        cout << x.first << ":" << x.second << " ";
    cout << endl;
    //打印结果  apple:苹果 man:男人 yui:结衣 ,会根据key来进行排序
    pair<string, string> p("cat", "猫");
    d.insert(p);//map的插入
    for (auto& x : d)
        cout << x.first << ":" << x.second << " ";
    cout << endl;
    //打印结果:apple:苹果 cat:猫 man:男人 yui:结衣
    d.erase("apple");//map的删除
    for (auto& x : d)
        cout << x.first << ":" << x.second << " ";
    cout << endl;
    //打印结果:cat:猫 man:男人 yui:结衣
    //如果删除没有的key呢?
    d.erase("apple");//apple已删除
    for (auto& x : d)
        cout << x.first << ":" << x.second << " ";
    cout << endl;
    //打印结果:cat:猫 man:男人 yui:结衣    //如果已经删除那么就也不会有什么影响
    //下面介绍map最重要的功能:[]
    //利用[],我们可以自由的对map进行插入和删除
    d["haha"] = "哈哈";
    for (auto& x : d)
        cout << x.first << ":" << x.second << " ";
    cout << endl;
    //cat:猫 haha:哈哈 man:男人 yui:结衣
    return 0;
}

结论:
1.map中的元素为键值对
2.map中的key是唯一的且不能修改
3.map利用迭代器遍历可以得到一个有序的序列
4.map支持[]的重载

3.3multiset

multiset

  1. multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。
  2. 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成 的键值对,因此value本身就是key,key就是value,类型为T).
    multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除。
  3. 在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则 进行排序。
  4. multiset容器通过key访问单个元素的速度通常比unordered_multiset容器慢,但当使用迭代器遍历时会得到一个有序序列。
  5. multiset底层结构为二叉搜索树(红黑树)。

multiset和set最大的区别就是multiset的元素是可以重复的。multiset的头文件也在#include <set>
multiset的简单使用

#include <set>//multiset也在其中
#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<int> v({ 2,3,1,5,6,3,2,4,5,1,9,0 });
    //利用迭代器构造multiset
    multiset<int> s(v.begin(), v.end());
    for (auto& x : s)
        cout << x << ' ';
    //打印结果0 1 1 2 2 3 3 4 5 5 6 9
    //可以看到multiset没有去重操作的
    cout << endl;
    //multiset迭代器的使用
    multiset<int>::iterator it = s.begin();
    for (; it != s.end(); ++it)
        cout << *it << ' ';
    cout << endl;
    //打印结果0 1 1 2 2 3 3 4 5 5 6 9

    cout<<s.count(1);//计算容器是对应元素的个数
    //打印结果:2
    return 0;
}

3.4 multimap

multimap
multimap

  1. Multimaps是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对<key, value>,其中多个键值对之间的key是可以重复的。
  2. 在multimap中,通常按照key排序和惟一地标识元素,而映射的value存储与key关联的内 容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,value_type是组合key和value的键值对:
    typedef pair<const Key, T> value_type;
  3. 在内部,multimap中的元素总是通过其内部比较对象,按照指定的特定严格弱排序标准对 key进行排序的。
  4. multimap通过key访问单个元素的速度通常比unordered_multimap容器慢,但是使用迭代 器直接遍历multimap中的元素可以得到关于key有序的序列。
  5. multimap在底层用二叉搜索树(红黑树)来实现。

同样multimap和map最大的区别就是允许key重复,同时取消了[]的重载(多个key限制了[]的重载)。
在这里插入图片描述

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

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

相关文章

《GVL》论文笔记

原文链接 [2303.06378] Learning Grounded Vision-Language Representation for Versatile Understanding in Untrimmed Videos (arxiv.org) 原文笔记 What 《Learning Grounded Vision-Language Representation for Versatile Understanding in Untrimmed Videos》 全文一…

编曲知识19:自动化处理 发送原理 混响 延迟

自动化处理 发送原理 混响 延迟小鹅通-专注内容付费的技术服务商https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_661a68eae4b023c0a96a8b36?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv 自动化处理 自动化 鼠标挪动到轨道左下角打开自动化轨道 或右键轨道-左键单击…

Node.js 中的 RSA 加密、解密、签名与验证详解

引言 在现代的网络通信中&#xff0c;数据安全显得尤为重要。RSA加密算法因其非对称的特性&#xff0c;广泛应用于数据的加密、解密、签名和验证等安全领域。本文将详细介绍RSA算法的基本原理&#xff0c;并结合Node.js环境&#xff0c;展示如何使用内置的crypto模块和第三方库…

RT-Thread 多级目录 scons 构建

前言 RT-Thread 默认使用 scons 进行工程的构建&#xff0c;虽然 RT-Thread BSP 中的 hello world 例程比较简单&#xff0c;实际项目开发&#xff0c;可能源码的工程会由多级目录&#xff0c;如何让多级的目录参与构建&#xff1f; scons 构建时&#xff0c;除了依赖工程的根…

libbpf-bootstrap库的代码结构介绍(用户层接口介绍),编译链接语句详细介绍,.skel.h文件介绍+示例,bpf程序的后续处理+文件关系总结

目录 libbpf-bootstrap 代码结构介绍 用户层函数 编译 查看 生成内核层的.o文件 第一模块 第二模块 第三模块 第四模块 第五模块 生成辅助文件(.skel.h) 介绍 示例 生成代码层的.o文件 第一模块 第二模块 第三模块 链接出可执行文件 后续总结 libbpf-bootst…

云服务器web环境之mariadb

1.安装mariadb服务 yum install mariadb-server 启动mariadb服务 systemctl start mariadb.service 输入mysql就能使用数据库了。 2.服务相关操作 systemctl stop mariadb.service systemctl restart mariadb.service 2.配置开机自启动 systemctl enable mariadb.serv…

AI克隆语音(基于GPT-SoVITS)

概述 使用GPT-SoVITS训练声音模型&#xff0c;实现文本转语音功能。可以模拟出语气&#xff0c;语速。如果数据质量足够高&#xff0c;可以达到非常相似的结果。相比于So-VITS-SVC需要的显卡配置更低&#xff0c;数据集更小&#xff08;我的笔记本NVIDIA GeForce RTX 4050 Lap…

深入剖析MongoDB集群架构设计

目录 一、MongoDB集群架构介绍 1.1 主从复制 1.2 副本集 1.3 分片集群 二、副本集 3.1 主节点选举 3.2 oplog 3.2 主从同步 三、分片集群 3.1 分片策略 3.2 分片键的选择 3.3 何时选择分片集群 四、总结 一、MongoDB集群架构介绍 MongoDB 有三种集群架构模式&#xff0c;分…

(七)PostgreSQL的用户管理

PostgreSQL的用户管理 1 创建用户&#xff08;角色&#xff09; CREATE USER现在是CREATE ROLE的别名。唯一的区别是&#xff0c;当命令的拼写为CREATE USER时&#xff0c;默认情况下会使用LOGIN&#xff0c;而当命令拼写为CREATE ROLE时会使用NOLOGIN。 官方文档&#xff1a…

系统架构最佳实践 -- 统一身份认证系统

目录 1.系统架构设计&#xff1a; 2.用户认证与授权&#xff1a; 3.用户身份管理&#xff1a; 4.安全性保障&#xff1a; 5.日志记录与审计&#xff1a; 6.高可用性与容错性&#xff1a; 7.用户体验优化&#xff1a; 随着互联网的快速发展和应用的普及&#xff0c;人们在…

边缘计算【智能+安全检测】系列教程--使用OpenCV+GStreamer实现真正的硬解码,完全消除马赛克

通过现有博客的GST_URL = "rtspsrc location=rtsp://admin:abcd1234@192.168.1.64:554/h264/ch01/main/av_stream latency=150 ! rtph264depay ! avdec_h264 ! videorate ! videoconvert ! appsink sync=false" GStreamer的解码方式解码,大多情况应该存在上图马赛克…

基于机器学习的人脸发型推荐算法研究与应用实现

1.摘要 本文主要研究内容是开发一种发型推荐系统&#xff0c;旨在识别用户的面部形状&#xff0c;并根据此形状推荐最适合的发型。首先&#xff0c;收集具有各种面部形状的用户照片&#xff0c;并标记它们的脸型&#xff0c;如长形、圆形、椭圆形、心形或方形。接着构建一个面部…

STM32之DHT11温湿度传感器

目录 一 DHT11温湿度传感器简介 1.1 传感器特点 1.2 传感器特性 1.3 传感器引脚说明 二 测量原理及方法 2.1 典型应用电路 2.2 单线制串行简介 2.2.1 串行接口 (单线双向) 2.2.2 数据示例 2.3 通信时序 三 单片机简介 3.1 STM32F103C8T6最小系统板 四 接线说明 …

LLM-大模型演化分支树、GPT派发展阶段及训练流程图、Infini-Transformer说明

大模型是怎么演进的&#xff1f; Encoder Only: 对应粉色分支&#xff0c;即BERT派&#xff0c;典型模型&#xff1a; BERT 自编码模型&#xff08;Autoencoder Model&#xff09;&#xff1a;通过重建句子来进行预训练&#xff0c;通常用于理解任务&#xff0c;如文本分类和阅…

架构师系列-搜索引擎ElasticSearch(五)- 索引设计

索引创建后&#xff0c;要非常谨慎&#xff0c;创建不好后面会出现各种问题。 索引设计的重要性 索引创建后&#xff0c;索引分片只能通过_split和_shrink 接口对其进行成倍的增加和缩减。 ES的数据是通过_routing分配到各个分片上的&#xff0c;所以本质上不推荐区改变索引的…

记录一下MySQL8版本更改密码规则

#查看当前密码策略 show variables like validate_password%;#修改密码等级为low set global validate_password.policy LOW; #注意MySQL8版本这是点&#xff0c;不是_#修改密码长度为6 set global validate_password.length 6;#查询我的数据库中user表host和user select host,…

【前端面试3+1】16 TCP与UDP的区别、如何清除浮动、哪些原因造成阻塞页面渲染、【相同的树】

一、TCP与UDP的区别 TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种常用的网络传输协议&#xff0c;它们有以下几点区别&#xff1a; 1、连接性&#xff1a; TCP是面向连接的协议&#xff0c;通信双方在…

以太网数据量大小字符串生成方法(可变单位)

0 前言 当我们想显示以太网数据量大小时&#xff0c;往往有个头疼的单位需要处理&#xff0c;单位取小了不一目了然&#xff0c;单位取大了精度太低。本例设计一个函数&#xff0c;将根据以太网数据量大小自动生成单位可变的字符串&#xff08;KB、MB、GB、TB、PB&#xff09;…

【大语言模型】基础:TF-IDF

TF-IDF (Term Frequency-Inverse Document Frequency) 是一种用于信息检索与文本挖掘的统计方法&#xff0c;用来评估一个词对于一个文件集或一个语料库中的其中一份文件的重要性。它是一种常用于文本处理和自然语言处理的权重计算技术。 原理 TF-IDF 由两部分组成&#xff1…