介绍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 });//利用迭代器构造setset<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 9return 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());//构造mapfor (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 });//利用迭代器构造multisetmultiset<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 9cout<<s.count(1);//计算容器是对应元素的个数//打印结果:2return 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限制了[]的重载)。
在这里插入图片描述

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

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

相关文章

Tesserocr 的安装步骤

Tesserocr 的安装 OCR&#xff0c;即 Optical Character Recognition&#xff0c;光学字符识别。是指通过扫描字符&#xff0c;然后通过其形状将其翻译成电子文本的过程。那么对于图形验证码来说&#xff0c;它都是一些不规则的字符&#xff0c;但是这些字符确实是由字符稍加扭…

IDEA 使用备忘录(不断更新)

IDEA 项目结构&#xff08;注意层级结构&#xff0c;新建相应结构时&#xff0c;按照以下顺序新建&#xff09;&#xff1a; project&#xff08;项目&#xff09; module&#xff08;模块&#xff09; package&#xff08;包&#xff09; class&#xff08;类&#xff09; 项…

推荐一款基于vim的超可扩展文本编辑器neovim

一、简介 Vim是一个基于流行的Vi编辑器的文本编辑器&#xff0c;最初是在20世纪70年代发布的。Vim代表“改进的Vi”&#xff0c;它拥有广泛的用户基础和广泛的可用插件和扩展。 Neovim是Vim的一个分支&#xff0c;创建于2014年&#xff0c;旨在解决Vim的一些缺点&#xff0c;…

oracle 19c 主备 补丁升级19.22

补丁升级流程 备库升级 备库备份$ORALCE_HOME du -sh $ORACLE_HOME ​​​​​​​ 备份目录将dbhome_1压缩 cd $ORACLE_HOME cd .. Ls tar -cvzf db_home.tar.gz db_home_1 /opt/oracle/product/19c ​​​​​​​​​​​​​​ 关闭监听关闭数据库查看sq…

2024年大唐杯备考

努力更新中…… 第一章 网络架构和组网部署 1.1 5G的网络整体架构 5G网络中的中传、回传、前传&#xff08;这里属于承载网的概念&#xff09; CU和DU之间是中传 BBU和5GC之间是回传 BBU和AAU之间是前传&#xff08;这个好记&#xff09; 这里竟然还藏了MEC&#xff08;…

如何搭建SearXNG搜索引擎

小白如何搭建SearXNG搜索引擎 前言 国内用户在使用百度、360、搜狗等主流搜索引擎时&#xff0c;面临搜索结果精确度不高、广告泛滥及隐私顾虑等问题。虽然Google以其出色性能备受推崇&#xff0c;但由于无法在国内访问&#xff0c;部分用户转而选择Bing作为折衷方案&#xff…

unity记一下如何播放动画

我使用的版本是2022.3.14fc 展开你的模型树&#xff0c;是会出现这个三角形的东西的 然后在资源面板创建一个animation controller 进去之后&#xff0c;把三角形拖进去&#xff0c;就会出现一个动画&#xff0c;然后点击他 在左侧给他创建这么个状态名字&#xff0c;类型…

探索数据结构:顺序串与链式串的深入理解

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 串的定义 串是一种特殊的顺序表&#xff0c;即每一个元素都是单独一…

STL--list双向链表

功能 将数据进行链式存储 链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成&#xff1a;链表由一系列结点组成 结点的组成&#xff1a;一个是存储数据元素的数据域&#xff0…

Finetuning vs. Prompting:大语言模型两种使用方式

目录 前言1. 对于大型语言模型的两种不同期待2. Finetune(专才)3. Prompt(通才)3.1 In-context Learning3.2 Instruction-tuning3.3 Chain of Thought(COT) Prompting3.4 用机器来找Prompt 总结参考 前言 这里和大家分享下关于大语言模型的两种使用方式&#xff0c;一种是 Fine…

4.Godot图片素材的获取和编辑

游戏开发中经常遇到图片素材的需求 1. 图片素材的准备 术语&#xff1a;Sprite 精灵&#xff0c;游戏开发中指一张图片来源不明的图片&#xff0c;切勿在商业用途使用&#xff0c;以免引起版权风险。 1. 在学习阶段&#xff0c;可以百度或者从一些资源网站获取&#xff0c;这…

黑马苍穹外卖--再来一单(stream流转换、赋值与收集映射)

1.首先明确一下业务规则: 业务规则&#xff1a; 再来一单就是将原订单中的商品重新加入到购物车中 2.产品页面原型和开发接口文档 3.业务层逻辑代码开发 3.1 查询方向 我们要明确的是: 再来一单就是将原订单中的商品重新加入到购物车中------直接把商品加入到购物车&#…