Java中的Map和Set有不少相似之处。本文将分享一个把Map类转化成Set类的小技巧。...java.util包中有很多Map类,其中一些Map类有着对应类型的Set类实现,例如TreeMap和HashMap。...这些Set类都是基于对应的Map类实现的,因此它们和对应的Map类保持相同的算法复杂度以及并发特性。 本文的重点来了。...后来我发现,Java 6中的java.util.Collections类提供了一个newSetFromMap()方法,该方法能够基于指定的Map对象创建一个新的Set对象。...当然,newSetFromMap()方法只能返回标准Set接口类型的对象。如果你的Map类有着更丰富的接口(与标准Map接口相比),你还是需要自行封装实现对应的Set类。
本章节复习的是JS中的Map和Set对象,是个集合。 前置知识: Map和Set对象是在ES6中被引入的,作为一种由 key值标记的数据容器。...Map和Set对象承载的数据元素可以按照插入时的顺序,被迭代遍历。 1 Set对象 介绍: Set数据结构类似数组,但所有成员的值唯一。...Set本身为一个构造函数,用来生成 Set数据结构,使用 add方法来添加新成员。...对象只能用字符串当做键,给开发带来很大限制,ES6增加 Map数据结构,使得各种类型的值(包括对象)都可以作为键。...['abc'] ]] 数组 转 Map let a = [ ['name','leo'], [1, 'hi' ]] let b = new Map(a); Map 转 对象 如果所有 Map 的键都是字符串
set中的元素不能在容器中修改,但是可以从容器中插入或删除它们。 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。...3.1.2 set的使用 1.set的模板参数使用 ? T: set中存放元素的类型,实际在底层存储的键值对。...注意:在使用map时,需要包含头文件。...,其++和–操作与begin和end操作移动相反 crbegin()和crend() 与rbegin和rend位置相同,操作相同,但crbegin和crend所指向的元素不能修改 4. map的容量和元素访问...使用时与map包含的头文件相同
对于STL容器来说,有很多相似的功能,所以这里主要将与之前不同的功能说清楚 @TOC 1.对于set与map的简单理解 vector/list/deque 作为序列式容器(类似于线性表的存储方式) map...与set作为关联式容器,里面存储的是结构的键值对(数据之间有非常强的关联关系) 键值对:用来表示一 一对应的关系,key代表键值,value代表与key对应的信息 如:中英文互译字典...,内部的英文必然有一个中文对应 ---- map与set 底层是二叉搜索树 ---- set作为key模型 map作为 key_value模型 不懂的可以点击了解:二叉搜索树的应用场景 2. set set...底层是二叉搜索树,所以重复的值在树中插入会失败 相当于完成了去重操作 ---- 不能随便修改*it的数据,set底层作为二叉搜索树,若将其中一个key值进行修改,就没办法保证修改后是不是搜索树了 --...-- 支持迭代器就是支持范围for,范围for底层就是迭代器 count 给一个值,判断在不在 若在返回非0,若不在返回0 但是由于set不支持重复的key值插入,所以count只能判断在不在 count
在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则(不允许存在相同的关键字)进行排序。...2. set中插入元素时,只需要插入value即可,不需要构造键值对。 3. set中的元素不可以重复(因此可以使用set进行去重)。 4....使用set的迭代器遍历set中的元素,可以得到有序序列 5. set中的元素默认按照小于来比较(可以通过仿函数去改变) 6. set中查找某个元素,时间复杂度为:log2n 小小总结一下重点:set...拷贝构造map 5.2.2 迭代器 map中的key和set一样是不可修改的,但是value是可以修改的!!...6.2 multimap的使用 multimap的insert可以支持键值冗余,find和erase如果涉及到多个key会返回中序的第一个。和multiset基本一样,这里就不做过多介绍。
在处理范围查询或是在有序集合中寻找下界或上界时,lower_bound 和 upper_bound 函数非常有用 3.2 map map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值...的pair对象,包含键“banana”和值“香蕉”。...这个pair对象包含键“left”和值“左边”。...这个pair对象包含键“apple”和值“苹果”。...然后可以使用这个范围来遍历所有键为 1 的元素,这里将打印出: 1 => apple 1 => banana 总之,equal_range 很有用,特别是在处理有重复键的关联容器时,它提供了一种方法来同时访问所有具有特定键的元素
中序遍历,同时 set 的迭代器还是一个 双向迭代器,支持 ++ 和 -- 操作 下面来看看 set 的相关操作 2.2、set 的使用 set 的构造函数如下图所示: 可以直接创建一个空...与 multiset 一样,multimap 用的也比较少,重点掌握 set 和 map 即可 ---- 4、相关试题实战 学会使用 set 和 map 后,可以将其用于实战,比如在下面这两个题中,这两个容器可以让我们事半功倍...使得 原链表节点和新链表节点之间形成了一种羁绊关系,但 两者之间互不影响 ---- 5、补充:交集与差集 下面是一些补充知识,主要是关于 交集和差集 的 5.1、如何查找交集?...---- 总结 以上就是本次关于 C++【set 和 map 学习和使用】的全部内容了,在这篇文章中我们先学习了 关联式容器相关知识,然后学习了 set、multiset、map 以及 multimap...的使用,最后通过一些题目见识到了 set 和 map 的强大之处,希望你在阅读本文后,能够收获相关知识 ----
(图片来源于网络) 一、set 1.1 set特点介绍 set的介绍 C++中的set是一个STL容器,它是一个自动排序的集合(即将数据存入set,我们通过迭代器顺序访问出来时,数据是有序的),内部使用红黑树...它是按照键(key)进行排序和存储的,键必须是唯一的,而值(value)可以重复。map通常使用红黑树实现,所以它的查找、插入和删除操作的时间复杂度都是O(log n)。 那么何为键值对?...键值对是一种常用的数据存储结构,由“键”和“值”两部分组成。其中,“键”是唯一的,用于标识数据,而“值”则是与键相关联的数据。...的使用 map和set的用法基本相同,只不过一个是键值对,一个是单个的值。...的使用 题目描述: 输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来,次数一样的按照单词小写的字典序排序输出,要求能识别英文单词和句号。
1、低效率的用法 // 先查找是否存在,如果不存在,则插入 if (map.find(X) == map::end()) // 需要find一次 { map.insert(x); // 需要find...else { // 不存在时的处理 } 2、高效率的用法 // 解决办法,充分利用insert和erase的返回值,将find次数降为1 map::size_type num_erased =...map.erase(X); // 需要find一次 if (0 == num_erased) { // 不存在时的处理 } else { // 存在且删除后的处理 } pair result_inserted...; result_inserted = map.insert(X); if (result_inserted.second) { // 不存在,插入成功后的处理 } else { //...已经存在,插入失败后的处理 result_inserted.first->second = X; // 修改为新值 }
本文浅析一下为什么Map(和WeakMap)在处理大量DOM节点时特别有用。...: 'MacArthur', isACommunist: false }; 但是,当你开始处理较大的实体,其属性经常被读取、更改和添加时,人们越来越多地使用Map来代替。...对象即key 与之对应的是,Map允许我们使用HTML节点作为自身的键。...当处理相对较少的项目时,Map和对象之间的性能是相当的。但随着项目数量的增加,Map开始拉开距离。这种性能上的亚线性变化开始显现出来。...太长不看版 我喜欢为DOM节点使用Map,因为: 节点本身可以作为键。我不需要先在每个节点上设置或读取独特的属性。 和具有大量成员的对象相比,Map(被设计成)更具有性能。
在STL的源代码中,map和set的底层原理都是红黑树。但这颗红黑树跟我们单独写的红黑树不一样,它需要改造一下: 改造红黑树 节点的定义 因为map和set的底层都是红黑树。...而且map是拥有键值对pair的,而set是没有键值对,只有一个K。因此,为了应对这两种不同的情况,就使用模板参数T。 当map使用这棵红黑树的时候,T就会变成pair。...当set使用时,T就会变成K。...//使用枚举 enum Colour { RED, BLACK, }; // 如果是map,则为pair; 如果是set,则为k //因此,对于节点来说,需要再套一层模板,来应付两种不同的情况...#pragma once //使用枚举 enum Colour { RED, BLACK, }; // 如果是map,则为pair; 如果是set,则为k //因此,对于节点来说,
C++map和set的介绍及使用 零、前言 一、关联式容器 二、键值对 三、C++中的set 1、set的介绍 2、set的使用 四、C++中的multiset 五、C++中的map 1、map的介绍...2、map的使用 六、C++中的multimap 零、前言 本章主要讲解C++中的一个关联式容器map和set的介绍及其使用 一、关联式容器 容器分类: 序列式容器:初阶阶段中学习过STL中的部分容器...1、set的介绍 概念: set是按照一定次序存储元素的容器,这种次序使用set的迭代器遍历set中的元素,可以得到有序序列 注:与map/multimap不同,map/multimap中存储的是真正的键值对...在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序注:默认按照小于来比较,中序遍历后为升序序列 set容器通过key访问单个元素的速度通常比unordered_set...(红黑树) 注:set和map基本差不多,但是set是k模型,而map是kv模型,这导致在部分地方又有些不一样 2、map的使用 map的模板参数说明: 解释: key: 键值对中key
set、map的使用及其特性和区别 STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:set,map,multiset,multimap。...multiset和set一样不能够对数据进行修改。 3.map 有别于set的是,map是一种key(键),value(值)的形式,用来保存键和值组成的集合,键必须是唯一的,但值可以不唯一。...: 插入: map dict; dict.insert(pair("string", "字符串"));//模板类型pair:构造了一个匿名对象插入到...和map特性和区别 set是一种关联式容器,其特性如下: set以RBTree作为底层容器 所得元素的只有key没有value,value就是key 不允许出现键值重复 所有的元素都会被自动排序 不能通过迭代器来改变...set的值,因为set的值就是键 map和set一样是关联式容器,它们的底层容器都是红黑树,区别就在于map的值不作为键,键和值是分开的。
树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树) 作为其底层结果,容器中的元素是一个有序的序列。...在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。...Compare:仿函数,set中元素默认按照小于来比较 Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理 set的构造函数 默认构造、迭代器区间构造、拷贝构造(深拷贝): void...; } 默认是升序,如果是想要降序:使用反向迭代器 仿函数:lessgreater: set的修改操作 find&&erase 对于find和erase我们都是比较熟悉的了,我们可以直接上手代码的实现...在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。
在使用set迭代器进行遍历时,set的迭代器走的是中序遍历的顺序,每一个迭代器都指向对应位置的键值对,当然set容器的元素我们也可以叫做键值对,只不过key和value相等罢了。 6....map中比较时比较的是key类型,但我们可以通过key找到value,这里多说一句,无论是map还是set,他们的迭代器走的都是中序的顺序。 2.2 map的使用 1....map和set都有三个构造函数,其中无参构造函数最为常用,平常在使用map或set时,直接定义其对象即可,无须传参,大多数情况下都是这样。 2....对于map来说,*it拿到的是pair的对象,所以我们还需要再加一个.操作符才能访问pair对象里面的first和second值,但这样写起来有点麻烦,所以map的迭代器也重载了→操作符,→重载的函数会返回迭代器指向对象的地址...其余接口的使用和map一样,这里不作介绍。 三、两道OJ题 1.前K个高频单词(less小于号是小的在左面升序,greater大于号是大的在左面降序) 前K个高频单词 1.
使用 unordered_map官方文档 ---- unordered_set 官方文档 ---- set / map与unordered_set / unordered_map 使用功能基本相同,但是两者的底层结构不同...---- 在map中存在rbegin以及rend的反向迭代器 ---- 在unordered_map中不存在rbegin以及rend的反向迭代器 ---- 1. unordered_set的使用...大部分功能与set基本相同,要注意的是使用unordered_set是无序的 插入数据,并使用迭代器打印,会按照插入的顺序输出,但若插入的数据已经存在,则会插入失败 2. unordered_map的使用...--- KeyOfT模板参数的作用 假设为unordered_set,则使用kot对象调用operator(),返回的是key ---- 假设为unordered_map,则使用kot对象调用operator...>是静态变量还是类型 ---- _ht作为哈希表,使其调用哈希表中的begin和end 来实现 unordered_set的begin 和end unordered_map对于 begin和end的复用
幸运的是 slice(切片)可以帮我们处理好这些问题,来一起看看。 Slice(切片) 内部机制和基础 slice 是一种可以动态数组,可以按我们的希望增长和收缩。...初始化 map 的长度依赖于键值对的数量。 map 的键可以是任意内建类型或者是 struct 类型,map 的值可以是使用 ==操作符的表达式。...: invalid map key type []string 使用 map 给 map 赋值就是指定合法类型的键,然后把值赋给键: colors := map[string]string{} colors...int 作为键,你可以自己实现用 interface{} 作为键,做成更通用的 Set,另外,这个实现是线程安全的。...8.可以通过组合方式来创建多维数组和 slice。map 的值可以是 slice 或者另一个 map。slice 不能作为 map 的键。
幸运的是 slice(切片)可以帮我们处理好这些问题,来一起看看。 Slice(切片) 内部机制和基础 slice 是一种可以动态数组,可以按我们的希望增长和收缩。...初始化 map 的长度依赖于键值对的数量。 map 的键可以是任意内建类型或者是 struct 类型,map 的值可以是使用 ==操作符的表达式。...Exception: invalid map key type []string 使用 map 给 map 赋值就是指定合法类型的键,然后把值赋给键: 复制代码代码如下: colors := map...int 作为键,你可以自己实现用 interface{} 作为键,做成更通用的 Set,另外,这个实现是线程安全的。...8.可以通过组合方式来创建多维数组和 slice。map 的值可以是 slice 或者另一个 map。slice 不能作为 map 的键。
幸运的是 slice(切片)可以帮我们处理好这些问题,来一起看看。 Slice(切片) 内部机制和基础 slice 是一种可以动态数组,可以按我们的希望增长和收缩。...初始化 map 的长度依赖于键值对的数量。 map 的键可以是任意内建类型或者是 struct 类型,map 的值可以是使用 ==操作符的表达式。...: invalid map key type []string 使用 map 给 map 赋值就是指定合法类型的键,然后把值赋给键: 复制代码代码如下: colors := map[string]...int 作为键,你可以自己实现用 interface{} 作为键,做成更通用的 Set,另外,这个实现是线程安全的。...8.可以通过组合方式来创建多维数组和 slice。map 的值可以是 slice 或者另一个 map。slice 不能作为 map 的键。
领取专属 10元无门槛券
手把手带您无忧上云