multiset和set,map和multimap的区别

2023-11-10

一、set和multiset的差异和相同

set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。
set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。
multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。
不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。

set/multiset对象的默认构造
set setInt; //一个存放int的set容器。
set setFloat; //一个存放float的set容器。
set setString; //一个存放string的set容器。
multiset mulsetInt; //一个存放int的multi set容器。
multi set multisetFloat; //一个存放float的multi set容器。
multi set multisetString; //一个存放string的multi set容器。
set的插入与迭代器
set.insert(elem); //在容器中插入元素。
set.begin(); //返回容器中第一个数据的迭代器。
set.end(); //返回容器中最后一个数据之后的迭代器。
set.rbegin(); //返回容器中倒数第一个元素的迭代器。
set.rend(); //返回容器中倒数最后一个元素的后面的迭代器。

原文链接:https://blog.csdn.net/weixin_43916755/article/details/95058079  

二、关联容器和map容器概述

map容器是关联容器的一种。在关联容器中,对象的位置取决于和它关联的键的值。键可以是基本类型也可以是类类型。关联容器是与非关联容器(顺序容器)相对应的,顺序容器中元素的位置不依赖于元素的值,而是和该元素加入容器时的位置有关。关联容器的类型有下面八种:

按关键字有序保存元素
map                      关联数组;保存关键字-值对
set                      关键字即值,只保存关键字的容器
multimap                 关键字可以重复出现的map
multiset                 关键字可以重复出现的set
 
无序关联容器
unordered_map            用哈希函数组织的map,无序
unordered_set            用哈希函数组织的set,无序
unordered_multimap       哈希组织的map;关键字可以重复
unordered_multiset       哈希组织的set,关键字可以重复

map容器有四种,每一种都是由类模板定义的。所有类型的map容器保存的都是键值对的元素。map容器的元素是pair<const K, T>类型的对象,这种对象封装了一个T类型的对象和一个与其关联的K类型的键。pair元素中的键是const,因为修改键会扰乱容器中元素的顺序。每种map容器的模板都有不同的特性:

1、map容器:map的底层是由红黑树实现的,红黑树的每一个节点都代表着map的一个元素。该数据结构具有自动排序的功能,因此map内部的元素都是有序的,元素在容器中的顺序是通过比较键值确定的。默认使用 less<K> 对象比较。

2、multimap容器:与map容器类似,区别只在于multimap容器可以保存键值相同的元素。

3、unordered_map容器:该容器的底层是由哈希(又名散列)函数组织实现的。元素的顺序并不是由键值决定的,而是由键值的哈希值确定的,哈希值是由哈希函数生成的一个整数。利用哈希函数,将关键字的哈希值都放在一个桶(bucket)里面,具有相同哈希值的放到同一个桶。unordered_map内部元素的存储是无序的,也不允许有重复键值的元素,相当于java中的HashMap。

4、unordered_multimap容器:也可以通过键值生成的哈希值来确定对象的位置,但是它

允许有重复的元素。

map和multimap容器的模板都定义在map头文件中,unordered_map和unordered_multimap容器的模板都定义在unordered_map头文件中中。

multi前缀表明键值不必唯一,但是如果没有这个前缀,键值必须唯一。
unordered前缀表明容器中元素的位置是通过其键值所产生的哈希值来决定的,而不是通过比较键值决定的,即容器中的元素是无序的。如果没有这个前缀,则容器中元素是由比较键值决定的,即有序。

 map容器

下图展示了一个用名称作为键值 map<K, T>容器,对象是整数,用来表示年龄。

前面讲过map容器的底层是由红黑树(一种非严格意义上的平衡二叉树)实现的,元素检索的时间复杂度是O(logN),相比于顺序检索的线性时间复杂度还是很快的。

2.1 map的创建以及初始化列表

map类模板有四个类型参数,但是一般只需要指定前两个模板参数的值。第一个是键值的类型,第二个是所保存对象的类型。我们通常所用的一种构造一个map对象的方法是:

Map<string, int> mapStudent;

当初始化一个map时,必须提供关键字类型和值类型。我们将每个关键字-值对包围在花括号中: {key,value} 来指出它们一起构成了map中的一个元素。初始化列表有两种方式:


map<string, string> authors = { {"Joyce", "James"},
                                {"Austen", "Jane"},
                                {"Dickens", "Charles"} };

性。

2.2 map容器的一般常用属性(方法)

size         返回有效元素个数
max_size     返回容器支持的最大元素个数
empty        判断容器是否为空,为空是返回true,否则返回false
clear        清空map容器
2.3 插入数据

在构造map容器后,我们就可以往里面插入数据了。这里讲三种常见的数据插入方法。

第一种:用insert函数插入pair数据

map<string, int> mapStudent;//创建map
mapStudent.insert(pair<string, int>("student_one", 22));
mapStudent.insert(pair<string, int>("student_two", 25));
mapStudent.insert(pair<string, int>("student_three", 21));
 
或者使用make_pair
map<string, int> mapStudent;
mapStudent.insert(make_pair("student_one", 22));
mapStudent.insert(make_pair("student_two", 25));
mapStudent.insert(make_pair("student_three", 21));

第二种:用insert函数插入value_type数据

map<string, int> mapStudent;//创建map
mapStudent.insert(map<string, int>::value_type("student_one", 22));
mapStudent.insert(map<string, int>::value_type("student_two", 25));
mapStudent.insert(map<string, int>::value_type("student_three", 21));

第三种:用数组方式插入数据

map<string, int> mapStudent;//创建map
mapStudent["student_one"] = 22;
mapStudent["student_two"] = 25;
mapStudent["student_three"] = 21;

第四种:用emplace函数插入数据

map<string, int> mapStudent;
mapStudent.emplace("student_one", 22);
mapStudent.emplace("student_two", 25);
mapStudent.emplace("student_three", 21);

这几种插入方法的区别:

  • 用insert函数的效果是一样的,在数据的插入上涉及到集合的唯一性这个概念,即当map中有某个关键字时,insert操作是失败的。
  • emplace插入效果跟insert效果一样。
  • 用数组方式插入数据就不同,它可以覆盖以前该关键字对应的值。

原文链接:C++ map容器和multimap容器(STL map容器)_Magnum的博客-CSDN博客_c++ multimap


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

multiset和set,map和multimap的区别 的相关文章

随机推荐

  • QThread线程的运行和退出

    关于QT退出线程 一直迷迷糊糊的 凑活着能用就行 出了问题总觉得莫名其妙 现在静下心来总结一下 感谢 QThread的用法 开启与退出 Qt QThread 这是我 见过解析最全面的一片文章 线程运行有两种方式 include
  • Python图像处理

    1 图像平滑 图像平滑是指受传感器和大气等因素的影响 遥感图像上会出现某些亮度变化过大的区域 或出现一些亮点 也称噪声 这种为了抑制噪声 使图像亮度趋于平缓的处理方法就是图像平滑 图像平滑实际上是低通滤波 平滑过程会导致图像边缘模糊化 图像
  • 关于FlashDB的应用-GD32F450上

    一 介绍 1 FlashDB是什么 是用于嵌入式的数据库存储 2 FlashDB谁整出来的 是armink 朱天龙 3 FlashDB依赖于什么 片内或者片外的Flash存储 FAL 4 FAL什么 FAL Flash Abstractio
  • 制作搭建宠物商城小程序,打造便捷的宠物购物体验

    随着宠物市场的不断发展 宠物商城小程序成为了满足宠物爱好者需求的重要工具 在现代社会 宠物已经成为人们生活中不可或缺的一部分 作为宠物爱好者 我们对于宠物食品 用品 医疗保健品等需求日益增长 而宠物商城小程序则为我们提供了一个便捷高效的购物
  • 在Matlab2018b中配置MinGW-w64 C/C++ 编译器

    在Matlab2018b跑代码时 输入mex setup 报错 错误使用 mex 未找到支持的编译器 您可以安装免费提供的 MinGW w64 C C 编译器 在 https jmeubank github io tdm gcc artic
  • 最详细的堆排序---排序算法,思路清晰动图讲解,五分钟搞懂!

    堆排序 同步微信公众号乐享Coding 欢迎你的关注 介绍 利用堆这种数据结构而设计的一种排序算法 堆排序是一种选择排序 它的最坏 最好 平均时间复杂度均为O nlogn 它是不稳定排序 对于堆排序 难点在于二叉树的顺序数组储存到大顶堆 小
  • psm倾向得分匹配法举例_基于R:使用“lalonde”数据集探讨倾向值匹配方法(PSM)的效果...

    1 导言 PSM 即倾向值匹配法 是处理社会研究反事实问题 以得到因果效应的重要技术之一 胡安宁 2020 概而言之 即先将多维的混淆变量降维成单维的倾向值 然后让接受实验处理的个体与未接受实验处理的个体基于倾向值进行匹配 当倾向值相同时
  • java——equals(),hashCode()重写与不重写区别

    1 总结 1 两个obj 如果equals 相等 hashCode 一定相等 2 两个obj 如果hashCode 相等 equals 不一定相等 2 不重写equals hashCode 不重写的时候 比较两个对象是否 相等 默认跟 效果
  • QT中实现当前时间实时更新

    如果是通过qt designer弄了个lcdNumber 想通过这个控件显示时间 那么你可以这么做 在 h文件中 1 添加头文件 include
  • 龙书学习笔记

    目录 第一章 引论 1 1 语言处理器 1 2 一个编译器的结构 1 2 1 词法分析 1 2 2 语法分析 1 2 3 语义分析器 1 2 4 中间代码生成
  • 计算机网络八股文

    浏览器输入一个网站后 具体发生了什么 进行DNS解析操作 根据DNS解析结果查找到服务器IP地址 通过IP寻址找到服务器 并利用三次握手建立TCP连接 浏览器生成HTTP保温 发送HTTP请求 等待服务器响应 服务器处理请求 返回服务器 根
  • 高速USB 2.0的CMSIS-DAP调试器:CMSIS-DAP正确打开方式(3月18日更新速度和稳定性)

    3月18日注 修改USB最大包长度到1024 HS支持 USB初始化前增加等待100ms CMSIS DAP Debugger 是 ARM 发布的面向 Cortex 系列 MCU 的开源 Apache 2 0协议 JTAG 与 SWD 调试
  • 解决github长期未登录,ssh keys过期的问题——git@github.com: Permission denied (publickey).

    首先声明 在我的PC端同时存在着github与gitlib的ssh keys 今天想看一个github上的项目 发现git pull的时候又permission denied了 如下图所示 处理办法很简单 只要把ssh key再加一遍就好了
  • 用于python环境下的数据操作_写给非计算机相关专业的同学——从零开始如何用python处理数据(包括如何安装环境)...

    文章目录 1 使用语言和包 1 2 pandas包的安装 这里只是一个例子 2 要做的一个数据处理 2 1 数据处理的需求 2 2 代码实现 2 2 1 思路 2 2 2 读入原来的表 2 2 3 找到速度为零的所有记录 2 2 4 找到对
  • 8、 Mac iTerm2 优化

    Mac iTerm2 优化 一 悬浮窗口 首先我们来解决第一个问题 如何在任何界面呼入呼出 iTerm2 的窗口 并且悬浮在界面的顶部 相信每个人都会有这样的使用场景 你正在全屏浏览器浏览网页 或者正在全屏编辑器写代码写文章之类的 突然想到
  • 使用ansible中的playbook

    1 Playbook 的功能 playbook 是由一个或多个 play 组成的列表 Playboot 文件使用 YAML 来写的 2 YAML 简介 YAML 是一种表达资料序列的格式 类似XML Yet Another Markup L
  • MySQL修改密码的3种方式以及启动方式

    在使用数据库时 我们也许会遇到 MySQL 需要修改密码的情况 比如密码太简单需要修改等 本节主要介绍了 3 种修改 MySQL 数据库密码的方法 使用 SET PASSWORD 命令 步骤 1 输入命令mysql u root p指定 r
  • xp无法访问查找工作组计算机,一招教你搞定XP“网上邻居”、“查看工作组计算机”打不开的情况...

    作 者 杜超 2号 ID 16058 城市 江阴 摘 要 一招教你搞定XP 网上邻居 查看工作组计算机 打不开的情况 正 文 在一些被优化过的XP系统或刚安装好的系统中 有时我们要访问局域网上的其他共享打印机或文件夹 需要用到网上邻居 可是
  • TCP协议疑难杂症全景解析

    原文地址 http blog csdn net dog250 article details 6612496 说明 1 本文以TCP的发展历程解析容易引起混淆 误会的方方面面 2 本文不会贴大量的源码 大多数是以文字形式描述 我相信文字看起
  • multiset和set,map和multimap的区别

    一 set和multiset的差异和相同 set是一个集合容器 其中所包含的元素是唯一的 集合中的元素按一定的顺序排列 元素插入过程是按排序规则插入 所以不能指定插入位置 set采用红黑树变体的数据结构实现 红黑树属于平衡二叉树 在插入操作