multiset和set,map和multimap的区别

12、STL中的multiset使用方法 其实,跟set很像,只需知道重复且用equal_range来获得重复范围的元素,基本上就可以了。其他的了解即可。 阅读详情

一、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.youkuaiyun.com/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的博客-优快云博客_c++ multimap


 

【 C++ 】set、multiset的介绍和使用 目录 1、关联式容器 2、键值对 3、树形结构的关联式容器 4、set set的介绍 set的定义 set的使用 5、multiset multiset的介绍 multiset的使用... 阅读详情

相关推荐

c++STL常用容器之Map/Multimap容器——全面总结(附案例解析)(十九)map按value值进行比较以及仿函数更改默认排序规则

这里有C++STL——全面总结详细教程(附案例解析)(持续更新中) 目录 map/ multimap容器 map基本概念 map构造和赋值 map大小和交换 map插入和删除 map查找和统计 map容器排序 仿函数更改默认排序规则和Value值排序 map/ multimap容器 map基本概念 简介: map中所有元素都是pair pair中第一个元素为...

cfl997 9042

set和multiset

文章目录1 set和multiset基本概念 1 set和multiset基本概念 set/multiset容器概念: set和multiset是一个集合容器,其中set所包含的元素是唯一的,集合中的元素按一定的顺序排列。set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。在n个数中查找目标数的效率是 log2^n。 红黑树定义:是每个节点都带有颜...

木子皿--啥都不会的菜鸟 2349

交叉熵损失函数基本概念及公式

对于二分类问题,模型的输出通常是一个标量,表示样本属于正类的概率。因此,在二分类的交叉熵损失函数中,我们只需要考虑一个概率值,即模型预测为正类的概率。具体来说,当真实标签为1时,我们关注模型预测为正类的概率;当真实标签为0时,我们关注模型预测为负类的概率。因此,二分类的交叉熵损失函数可以表示为:其中,y 表示真实标签,取值为 0 或 1;p 表示模型预测为正类的概率。而对于多分类问题,模型的输出通常是一个向量,表示样本属于各个类别的概率。因此,在多分类的交叉熵损失函数中,我们需要考虑所有类别的概率。

qlkaicx的博客 1万+

multiset用法总结

       c++语言中,multiset是&lt;set&gt;库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数。 简单应用: 通过一个程序来看如何使用multiset: #include &lt;string&gt; #include &lt;iostream&gt; ...

二喵君的博客 13万+

避开这些坑,你的Python爬虫才能稳定爬取IEEE Xplore(含反爬策略与MongoDB存储实战)

本文详细介绍了如何构建稳定的Python爬虫系统以爬取IEEE Xplore学术论文,包括反爬策略、MongoDB存储优化和断点续传机制。通过动态等待时间算法、请求头指纹管理和会话保持策略,有效应对IEEE的反爬机制。同时,优化MongoDB数据结构和索引,提升存储效率。最后,强调法律合规与伦理考量,确保爬虫合法合规运行。

weixin_29031057的博客 1096

汽车级智能栅极驱动器深度解析 | 连载01:DRV871x-Q1系列产品架构与核心特性

集成度:单芯片集成多通道驱动器、电源管理、电流检测智能化:自适应控制算法,减少外部元件可靠性:多重保护机制,满足汽车级要求灵活性:SPI和硬件两种接口,适应不同应用需求。

VehSwHwDeveloper的博客 1154

map, unordered_map, multimap 和 set、unordered_set、multiset 的区别

类型排序唯一性允许重复元素实现方式查找复杂度mapmapmap有序唯一否红黑树OlogNO(log\ N)OlogNunorderedmapunorderedmap无序唯一否哈希表O1O(1)O1multimapmultimapmultimap有序唯一是红黑树OlogNO(log\ N)OlogNmultisetmultisetmu。

m0_65128884的博客 987

新手也能搞定的ANPC三电平逆变器Simulink仿真:从SPWM调制到开关损耗优化

本文详细介绍了如何在Simulink中搭建ANPC三电平逆变器仿真模型,从SPWM调制基础到开关损耗优化技巧。通过分层设计思路和实用代码示例,帮助新手快速掌握ANPC拓扑的核心功能,包括中点平衡控制和性能指标分析,为电力电子系统设计提供实践指导。

weixin_30335575的博客 409

【C++】C++ STL 树形结构容器全解析:map、set、multimap、multiset 的使用与区别

大家好,我是店小二!今天为大家带来 C++ STL 树形结构容器全解析:map、set、multimap、multiset 的使用与区别。本次分享主要聚焦于这几种容器的使用方法,帮助大家了解它们的基本功能和常用接口。需要提前说明的是,今天的内容偏重实用性,旨在让大家快速上手,没有深入探讨底层原理。希望能对大家有所帮助!

专注于 C/C++ 后端开发,涵盖基础语法、Linux系统与网络、MySQL数据库、常见算法及项目经验。 2975

STM32寄存器级电机驱动:DRV8833 H桥与PWM调速原理

电机驱动是嵌入式控制系统的核心基础能力,其本质是微控制器通过数字信号精确控制功率器件的开关时序。理解H桥电路结构、反电动势防护机制及PWM调制原理,是实现可靠直流电机控制的前提。DRV8833作为典型双H桥驱动芯片,支持快衰减与慢衰减两种PWM调速模式,分别对应不同的电流泄放路径与动态响应特性。在STM32平台上,需结合时钟树配置、GPIO复用、定时器寄存器(PSC/ARR/CCR)精确计算,将抽象的转速需求转化为可执行的硬件操作。该技术广泛应用于智能小车、机器人关节、工业定位系统等实时运动控制场景,是掌握

weixin_42613017的博客 679

比亚迪唐/秦开发者必看:253个车辆接口实战指南(附常用功能调用示例)

本文为比亚迪唐/秦开发者提供了一份详尽的车辆接口实战指南。文章聚焦于比亚迪开放的253个车辆接口,从开发环境搭建、核心状态监控到高频控制功能(如空调与充电管理),结合真实代码示例,帮助开发者快速上手并规避常见问题,高效开发车载应用。

weixin_28327051的博客 614

set, multiset, unordered_set, map, multimap, unordered_map的区别

set, multiset, unordered_set, map, multimap, unordered_map的区别 set, multiset, unordered_set, map, multimap, unordered_map都是关联型容器 set和multiset以红黑树作为底层实现,不可以通过迭代器来修改元素的值,如果任意改变set元素的值,会破坏set的组织,拥有和list某些...

li123_123_的博客 384

【乐企文件生成工程】乐企文件生成支持所有特定要素类型发票

【代码】【乐企文件】乐企文件生成最新更新!!!

九七的博客 851

【C++进阶】multiset和multimap与set和map之间的区别

multiset和multimap与set和map之间的区别

m0_67077469的博客 461

VTK GPU 加速渲染技术

/ 创建颜色工具// 创建立方体数据// 创建OpenGL映射器(注意使用vtkOpenGLPolyDataMapper而不是常规的vtkPolyDataMapper)// 启用VBO(顶点缓冲对象)// 声明几何体是静态的以获得最佳性能// 创建actor// 创建渲染器、渲染窗口和交互器renderWindow->SetWindowName("VTK自定义着色器示例");// 添加actor到渲染器。

深之JohnChen的专栏 1242

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

set、map、multiset、multimap的介绍及使用以及区别,注意事项

set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。

2301_81265915的博客 1095

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

set,multiset,map,multimap的区别 和基本的使用

#include <iostream> #include <set> #include <Windows.h> #include <string> #include <map> using namespace std; int main(void) { //值域 不重复 set set<int> ...

qq_44065088的博客 336

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++ STL中set、multiset、hash_set、hash_multiset,map、multimap、hash_map和hash_multimap之间的区别

1.set和multiset的区别set和multiset两者的底层结构都是RB-tree,两者唯一的区别是使用的insert()函数不同,set中不允许存在重复的元素,所以底层使用的插入元素函数为insert_unique();而multiset中运行存在重复元素,所以底层使用的插入元素函数为insert_equal().2.map和multimap的区别        同set和multise...

kang___xi的博客 744

Set , Multiset 与 Map , Multimap 的联系与区别

setmultiset是基于值的集合;mapmultimap是基于键值对的映射结构;使用multisetmultimap时,需注意它们会保留所有重复项,不会自动覆盖旧数据。😀 关注 @公众号 程序员陈子青,获取更多 C++ 技术支持。

陈子青的博客 268

C++ set/multiset/map/multimap 区别与联系

     set/multiset/map/multimap 他们都是关联容器,优点是提供了对元素的快速访问,也允许插入新元素,但不能指定元素的插入位置(原因是关联容器通常用于确定数据放置位置的算法,以便能快速检索信息) 关联容器通常是使用某种树实现的。树是一种数据结构,其根节点链接到一个或两个节点,而这些节点又链接到一个或两个节点,从而形成分支结构。 像链表一样,节点使得添加或删除数据比较...

PinGoole的博客 910

C++ map, multimap,unordered_map,unordered_multimap,set, multiset,unordered_set,unordered_multiset的区别

转载:https://blog.youkuaiyun.com/qq_33726635/article/details/106553317?utm_medium=distribute.pc_relevant_t0.none-task-blog-blogcommendfrommachinelearnpai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-blogcommendfrommachinelearnpai2-1.

JCjunior的博客 464

set/multiset map/multimap hash_set/hash_multiset hash_map/hash_multimap 区别与联系

set/multiset联系底层使用红黑树作为数据结构 set/multiset 特性是所有元素都会根据元素键值自动排序,set/multiset元素的键值就是实值,实值就是键值。 不能通过迭代器来修改set/multiset的实值因为他们的实值就是键值,修改后可能不满足其排列规则 set/multiset拥有与list相同的某些性质:当客户对他的元素进行insert或erase是操作之前的所

Dakuan_chen的博客 560

STL中hashtable,hashset,hashmap,set,map,multiset和multimap的区别

hashtable 可以提供任何有名项的存取操作和删除操作,由于操作对象是有名项,故可被视为一种字典结构。用意是在常数时间内提供基本操作。常见的,我们可以把int存到相应值的数组里面,就可以通过O(1)的时间存取和删除。主要思想是通过hash函数,把对象映射到一个较小的容器里面,并且保证时间复杂度。映射到较小容器很可能出现碰撞问题,解决的方法常见的有:线性探测,二次探测,开链法。STL利用vect

wangyuquanliuli的专栏 8822

STL — 从源码层面区别map set和multiset multimap

从源码层面区别map set和multiset multimp set特性为

阿亮的博客 699

STL关联容器MAP、SET与multimap、multiset与hashmap、hashset的区别

MAP:底层用红黑树RB_tree实现,在查找、删除、添加等操作都有很高的效率,而且是排好序的,且不允许重复。 hashmap:重点是map,底层基于hashtable实现,哈希表即是散列表,实质是一个数组。优点是查找、删除、添加的时间复杂度为O(1);缺点也很明显,就是不能有重复,不能排序,占用内存大,只能处理char,int,short等类型,不能处理string,double,float类

Simon的博客 628

详解map、set、multimap、multiset的使用

详细介绍map、set、multimap、multiset的使用

阿润菜菜的博客 2370
上一篇: vs 2012工程下关于不同类型库文件链接的配置设置
下一篇: 进程间通信那种效率最高_几种进程间的通信方式 比较
sherryyang1234
博客等级 码龄10年 13粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值