map和set的区别和底层实现是什么?map取值的 find,[],at方法的区别

44 篇文章 0 订阅
订阅专栏

目录

一、map 和 set 的区别

1. 基本定义

2. 底层实现

3. 存储内容

4. 常用操作

5. 有序性

二、map 的取值方法:find(),[],和 at()

1. find()

2. operator[]([] 操作符)

3. at()


一、mapset 的区别

1. 基本定义

  • map:一种关联容器,存储的是键值对(key-value pairs),每个键对应唯一的值。键是唯一的,不允许重复。常见的用法是 std::map<Key, Value>.
  • set:一种集合容器,存储的是唯一的键(key),不存储值。元素是唯一的,且不可重复。常见的用法是 std::set<Key>.

2. 底层实现

  • mapset:底层通常使用**红黑树(Red-Black Tree)**实现,红黑树是一种自平衡的二叉查找树,能够保证增删查改操作的时间复杂度为 O(log n)。
    • map 中,红黑树的节点存储键值对,按键排序。
    • set 中,红黑树的节点只存储键,按键排序。
  • unordered_mapunordered_set:底层使用**哈希表(Hash Table)**实现,通过哈希函数将键映射到不同的桶,增删查改操作的平均时间复杂度为 O(1),最坏情况下为 O(n)。

3. 存储内容

  • map:存储键值对,键唯一,值可以重复或不同。
    • 例如:map<int, string> m; m[1] = "one"; m[2] = "two";
  • set:只存储唯一的键,不存储值。
    • 例如:set<int> s; s.insert(1); s.insert(2);

4. 常用操作

  • map:可以通过键来查找值(例如 m[key]),插入或删除键值对。
  • set:可以插入、删除和查找键(例如 s.insert(key)s.find(key))。

5. 有序性

  • mapset:两者都按照键进行排序(使用比较函数,如 <)。
  • unordered_mapunordered_set:无序,元素排列顺序由哈希函数决定。

二、map 的取值方法:find()[],和 at()

map 中,可以使用多种方法来访问存储的值,每种方法的行为略有不同。

1. find()

  • 功能:用于查找指定键是否存在。如果存在,返回指向该元素的迭代器;如果不存在,返回 map.end()
  • 用法
std::map<int, std::string> m = {{1, "one"}, {2, "two"}};
auto it = m.find(1);  // 返回指向键为1的迭代器
if (it != m.end()) {
    std::cout << it->second << std::endl;  // 输出 "one"
}
  • 特点
    • 不会插入新元素,如果键不存在,仅返回 end()
    • 时间复杂度为 O(log n)。

2. operator[][] 操作符)

  • 功能:通过键来访问值。如果键存在,返回对应的值;如果键不存在,会创建一个新的键值对,并初始化值(通常为值类型的默认构造值,如 0、空字符串等)。
  • 用法
std::map<int, std::string> m;
m[1] = "one";  // 插入键1的元素,并赋值为"one"
std::cout << m[2];  // 键2不存在,插入键2,值初始化为空字符串
  • 特点
    • 如果键不存在,会创建新元素并初始化,这种行为可能导致意外的元素插入。
    • 适合用于需要修改或赋值的场景。
    • 时间复杂度为 O(log n)。

3. at()

  • 功能:通过键来访问值。如果键存在,返回对应的值;如果键不存在,抛出 std::out_of_range 异常。
  • 用法
std::map<int, std::string> m = {{1, "one"}};
std::cout << m.at(1);  // 输出 "one"
std::cout << m.at(2);  // 抛出 std::out_of_range 异常

特点

  • 不会插入新元素,仅在键存在时返回值。
  • 适合用于确定键一定存在的场景,否则需要异常处理。
  • 时间复杂度为 O(log n)。

关联式容器面试题合集
didi1663478999的博客
10-02 872
说说你所知道的容器都有哪些? vector,list,mapset,mulimap,muliset等等 mapset区别?使用map有哪些优势? map底层原理,说下红黑树? map的迭代器会失效吗?什么情况下会失效? AVLTree和RBTree的对比,为什么map使用了红黑树?红黑树的优势是什么? AVLTree和RBTree所达到的平衡有什么区别? ...
彻底弄懂ES6中的MapSet
dianzhigan6636的博客
05-20 1637
Map Map对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。构造函数Map可以接受一个数组作为参数。 Map和Object的区别 一个Object 的键只能是字符串或者 Symbols,但一个Map 的键可以是任意值。 Map中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。 Map的键值对个数可以从 size 属性获取,而 Object 的键值对个数...
setmap区别
m0_67400973的博客
03-23 1738
转自https://blog.csdn.net/terence1212/article/details/52487656 set是一种关联式容器,其特性如下: set以RBTree作为底层容器 所得元素的只有key没有value,value就是key 不允许出现键值重复 所有的元素都会被自动排序 不能通过迭代器来改变set的值,因为set的值就是键 mapset一样是关联式容器,它们的底层容器都是红黑树,区别就在于map的值不作为键,键和值是分开的。它的特性如下: map以RBTree作为底层容器
【数据结构】map&set详解
最新发布
2202_76097976的博客
08-05 1832
HashMap底层也是哈希表,和之前的HashSet不同,HashMap中,当插入的key相同时,第二次插入会覆盖原来的value值,同时,如果存储的是自定义类型的对象还需要重写HashCode和equals方法。TreeMap和TreeSet底层一样,都是红黑树,根据键进行排序,排序规则也是类似的,对于非数值等类型,可以实现Comparable接口,指定比较规则,也可以传入比较器。当用HashSet实例化对象时,由于底层结构是哈希表,所以元素是无序的,而TreeSet底层是红黑树,是有序的。
SetMap区别
热门推荐
努力学习前端的小白
01-18 2万+
SetMap区别
【C++ STL】模拟实现 mapset(对一颗红黑树进行封装)
codewinter的博客
06-25 713
阅读STL源码就可以发现,其实 setmap 自己没有实现啥东西,整体就是对红黑树进行了一个封装,setmap 的 insert / erase 接口底层就是调用红黑树的 insert / erase 接口,并且 setmap 的迭代器也都是取的红黑树里面的迭代器那 setmap 的核心区别在哪里呢?set 底层封装了一颗红黑树,是 KV 结构,值得注意的是 key_type 和 value_type 都是 key,说明传了两个 key 给红黑树。 map 底层封装了一颗红黑树,是
【C++】STL——setmap及multiset和multimap的介绍及使用
不 良的博客
08-03 456
在前面学过的STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。 关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。本篇介绍的setmap就是关联式器。关联式容器中数据和数据之间有非常强的关联关系,不能随意插入。键值对:用来表示具有一一对应关系的一种结构,该结构中一般只包含两个
C++中mapset系列元素操作
weixin_45354197的博客
04-05 1753
参考书籍 《C++Primer》 1.添加元素 添加元素是指添加一个元素或者一个元素范围; 返回值: 对于mapset插入后会返回一个是否插入成功的bool值,若插入成功则会返回一个指向指定元素的迭代器。 对于multi_**总是会插入,所以无需返回bool值; (1)set set的插入操作和之前熟悉的vector类似。 set<int> set1; //插入具体的数值 set1.insert(1); //插入一个范围 set1.insert(v1.b
哈希表封装实现 unordered_map 和 unordered_set——哈希表の华丽二重奏
qq_61500888的博客
10-04 1979
带你一命通关 unordered_map 和 unordered_set 底层 十分钟手撕数据结构原理
MapSet区别
12-21
MapSet区别 —————————————–分割线—————————–   mapset都是stl中的关联容器,map以键值对的形式存储,key=value组成pair,是一组映射关系。set只有值,可以认为只有一个数据,并且set中元素不可以重复且自动排序,如果需要重复则使用multiset,要说区别的话,存储的东西不一样,应用场景不一样,支持的操作也不一样,很多不同。   mapset支持快速查找和删除,一般使用RB树来实现,当然后面还有用hashtable实现的,使用rb树作为底层结构增删数据都很快,不存在内存移动也就不容易出现迭代器失效的问题,这也就是区别于vector的原因
setmap区别
dxn16638400024的博客
02-25 396
总的来说,SetMap的主要区别在于它们的结构、唯一性、操作、遍历、查找和其他特性。你应该根据你的具体需求来选择使用Set还是Map
mapset区别
蒲小若的博客
08-13 521
//测试浏览器是否支持mapset /*var m = new Map(); var s = new Set(); alert("您的浏览器支持mapset");*/ //用map创建一个成绩表,用get和set方法来得到和设置score中的值 //Map var score = new Map([["wenting",100],["shaofeng",88],["you
mapset区别
qq_45907365的博客
04-24 625
mapset都是stl中的关联容器,map以键值对的形式存储,key=value组成pair,是一组映射关系。set只有值,可以认为只有一个数据,并且set中元素不可以重复且自动排序,如果需要重复则使用multiset,要说区别的话,存储的东西不一样,应用场景不一样,支持的操作也不一样,很多不同。mapset都是stl中的关联容器,map以键值对的形式存储,key=value组成pair,是一组映射关系。Map是键值对,Set是值的集合,当然键和值可以是任何的值;都能通过迭代器进行for…
setmap区别
qq_44665456的博客
08-01 320
1、特点Map对象是键值对集合,和JSON对象类似,但是key不仅可以是字符串还可以是对象。,集合实现了iterator接口,可以使用扩展运算符…st.has(item)检测集合中是否包含某个元素,返回boolean值。st.delete(item)删除集合中的元素,返回boolean值。st.add(item)往集合中添加一个新元素item,返回当前集合。合并两个集合[…st.clear()清空集合。st.size返回集合的个数。集合转为数组[…...
MapSet区别
清云
05-26 9867
实战中:最近开发中,在小程序 中有使用到MapSet ,应用于发布订阅的事件回调,还有 websocket。 Map Map对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。构造函数Map可以接受一个数组作为参数。 Map 和 object(常规对象)的区别 一个 Object 的键只能是字符串或者 Symbols(基本数据类型,独一无二),但一个Map 的键可以是任意值。 Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。 Map 的键值对个数可以.
写文章

热门文章

  • Lasso回归(概念+实例) 11948
  • 与卷积神经网络(CNN)对比,Transformer的优势是什么 11367
  • YOLO-World:实时开放词汇对象检测(论文+代码) 6704
  • 决策树回归(概念+实例) 6193
  • 即插即用模块-EMA跨空间学习的高效多尺度注意模块(论文+代码) 5974

分类专栏

  • 电力电子技术
  • 电力电子器件 1篇
  • 整流电路 4篇
  • 换流方式 1篇
  • 斩波电路 1篇
  • 交流变交流 3篇
  • PWM控制技术 1篇
  • C++八股文 44篇
  • 算法笔试总结
  • 6篇
  • 队列 2篇
  • Linux相关 6篇
  • 即插即用模块 5篇
  • 自动驾驶 10篇
  • 回归算法 10篇

最新评论

  • 决策树回归(概念+实例)

    xtbbwzd6118: 回归的曲线可以避免出现横着的情况吗

  • 即插即用模块-EMA跨空间学习的高效多尺度注意模块(论文+代码)

    松小白song: 你的输入通道数有问题,在ema代码中修改通道数

  • 即插即用模块-EMA跨空间学习的高效多尺度注意模块(论文+代码)

    星空626: RuntimeError: Given groups=1, weight of size [96, 96, 1, 1], expected input[16, 264, 56, 1] to have 96 channels, but got 264 channels instead报这个错是什么原因大佬

  • 即插即用模块详解SCConv:用于特征冗余的空间和通道重构卷积

    Octopus.YU: 谢谢

  • 即插即用模块详解SCConv:用于特征冗余的空间和通道重构卷积

    Octopus.YU: assert c_num >= group_num # 断言 c_num 大于等于 group_num 这里的group_num可以修改的吗?

最新文章

  • PWM控制技术(基本思想、逆变电路及其控制方法)
  • 变频电路-交交变频电路,并和交直交变频进行比较
  • 交流电力控制电路之交流调功电路、交流电力电子开关
2024
09月 58篇
08月 21篇
07月 1篇
05月 6篇
04月 47篇
03月 10篇
2023年4篇
2022年6篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家梅州透明玻璃钢雕塑摆件浙江佛像玻璃钢雕塑销售厂家晋城玻璃钢海豚雕塑价格太原哪里卖玻璃钢雕塑深圳新款玻璃钢面包雕塑安庆欧式玻璃钢雕塑优势开玻璃钢雕塑要什么设备北京中庭商场美陈订购安徽玻璃钢雕塑市场安徽玻璃钢雕塑厂家定制杭州玻璃钢雕塑南充玻璃钢雕塑摆件施工团队玻璃钢雕塑小猪佩奇玻璃钢雕塑制作技术信阳哪里有玻璃钢人物雕塑公司安徽仿铜玻璃钢雕塑生产厂家东莞玻璃钢雕塑摆件哪家好广东走廊商场美陈生产厂家内蒙古鄂尔多斯商场美陈宿州市玻璃钢雕塑新农村玻璃钢雕塑韶关玻璃钢雕塑设计安徽玻璃钢雕塑定制工厂玻璃钢雕塑多少钱一平庆阳彩色玻璃钢雕塑哪有玻璃钢雕塑公司清远玻璃钢卡通雕塑商家佛山会发光的玻璃钢雕塑制作珠海玻璃钢人物雕塑销售电话抚州多彩玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化