首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】map & set

1. set (1)set 的介绍 首先我们可以看一下 set 的文档介绍:set 文档介绍....简单概括: set 是按照一定次序存储元素的容器 在 set 中,元素的 value 也标识它(value就是 key,类型为 T),并且每个 value 必须是唯一的。...set 中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。 set 在底层是用二叉搜索树(红黑树)实现的。...set 中的元素不可以重复 (因此可以使用set进行去重) ; 使用 set 的迭代器遍历 set 中的元素,可以得到有序序列; set 中的元素默认按照小于来比较; set 中查找某个元素,时间复杂度为...:O(logN). (2)set 的使用 在使用之前我们先看一下 set 的模板参数列表: 其中: T: set 中存放元素的类型,实际在底层存储 的键值对。

12910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】map和set

    set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。 set在底层是用二叉搜索树(红黑树)实现的。...set中插入元素时,只需要插入value即可,不需要构造键值对。 set中的元素不可以重复(因此可以使用set进行去重)。...使用set的迭代器遍历set中的元素,可以得到有序序列 set中的元素默认按照小于来比较 set中查找某个元素,时间复杂度为: log_2 n set中的元素不允许修改(为什么?)...set中的底层使用二叉搜索树(红黑树)来实现. 3.1 set的模板参数列表 set的模板参数列表 T: set中存放元素的类型,实际在底层存储的键值对。...(); return 0; } 发现set不仅仅排序,还去重: 3.3 set的迭代器 3.4 set的容量 3.5 set修改操作 erase测试一下: set s3= { 3,2,8,1,10,2

    9510

    C++之map和set

    2.set set的介绍 set是按照一定次序存储元素的容器,set中的元素总是按照内部比较对象(类型比较)所指示的特定排序准则进行排序,使用set的迭代器遍历set可以得到有序序列,注意:set中的元素默认按小于进行排序...就是key,类型为T),并且每一个value都必须是唯一的,即set中的元素是不能重复的,因此可以用set进行去重; set中的元素不能在容器中进行修改,只能进行增、删、查等操作; set查找某个元素的时间复杂度为...set的构造 set的迭代器 set的容量 set的操作 set的应用举例 #includeset> int main() { int arr[] = { 1, 2, 5,...用一个代码看一下它与set的区别: #include set>//set和multiset的头文件都是set void TestSet() { int array[] = { 2, 1, 3, 3,...本文作者目前也是正在学习C++相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

    75330

    C++中set用法详解

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作...关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。...C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。...注意: 1、set中的元素都是排好序的 2、set集合中没有重复的元素 关于set有下面几个问题: (1)为何map和set的插入删除效率比用其他序列容器高?...这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。

    3.1K10

    C++ —— set系列的使用

    顺序容器中的元素是按关键字来保存和访问的 关联式容器有map/set系列unordered_map/unordered_set(哈希表)系列 map和set底层是红⿊树,红⿊树是⼀颗平衡...set是key搜索场景的结构,map是key/value搜索场景的结构 2. set和multiset参考⽂档 - C++ Reference https://legacy.cplusplus.com.../reference/set/ 3. set类的介绍 1. set的声明如下,T就是set底层关键字的类型,set是去重的 2. set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求...// set::key_compare/value_compare class Alloc = allocator // set::allocator_type > class...set; 4. set的构造和迭代器 set的⽀持正向和反向迭代遍历,遍历默认按升序顺序,因为底层是⼆叉搜索树,迭代器遍历⾛的中序;⽀持迭代器就意味着⽀持范围for set的iterator

    8600

    【C++】map和set的封装

    1. map和set不同的模板参数 在源码中看看map和set: 当单看,红色部分时候发现两个都一样: 但是这两个是不一样的: map的key_type和value_type不一样,value_type...在插入中首先要比较data,但是并不知道比较的是不是key,所以就得先找到key,就用一个内部类来解决,如果是map就比较pair的first,如果是set就比较key。...set传了一个SetKeyOfT下来,此时就知道这个T就是一个key,下层的RBTree不知道,但是上层的set知道。...所以set的K和第二个模板参数传给下面的T的key 而下面的KeyOfT是一个仿函数,这里的kot就可以调用operate()。...他是set的KeyOfT对象,此时调用operate(),就调用到set的operator(): 为什么不直接比较? 是因为和map用到的是同一套模板。map是这样,那么set也得这样。

    5010

    【c++】set和map的使用

    set中插入元素时,只需要插入value即可,不需要构造键值对。 set中的元素不可以重复(因此可以使用set进行去重)。...使用set的迭代器遍历set中的元素,可以得到有序序列 set中的元素默认按照小于来比较 set中查找某个元素,时间复杂度为: log_2 n set中的元素不允许修改 set中的底层使用二叉搜索树(红黑树...(3):删除set中[first, last)区间中的元素 交换set中的元素 将set中的元素清空 返回set中值为x的元素的位置 返回set中值为x的元素的个数 在C++中,...如果给定值不存在于set中,它们不会向 set 添加元素。...这意味着,当你执行操作例如 equal_range 时,可能会返回一个元素的范围,而不是单个元素 equal_range 是 C++ 标准模板库(STL)中关联容器(例如 set、multiset、

    6800

    C++:map和set的使用

    3.1 set的介绍 set的文档介绍 翻译: 1. set是按照一定次序存储元素的关联性容器 2....2. set中插入元素时,只需要插入value即可,不需要构造键值对。 3. set中的元素不可以重复(因此可以使用set进行去重)。 4....使用set的迭代器遍历set中的元素,可以得到有序序列 5. set中的元素默认按照小于来比较(可以通过仿函数去改变) 6. set中查找某个元素,时间复杂度为:log2n 小小总结一下重点:set...与set的区别是,multiset中的元素可以重复,set中value是唯一的 4....但是c++中提供了一个make_pair的接口 本质上也是去调用这个匿名构造,但是我们的代码可以更加简洁。 他可以帮助我们自动识别类型。

    13510

    【C++】map和set的使用

    Set容器 ✈️认识Set set是按照一定次序存储元素的容器 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。...使用set的迭代器遍历set中的元素,可以得到有序序列 set中的元素默认按照小于来比较 set中查找某个元素,时间复杂度为:logN set中的元素不允许修改(为什么?)...set中的底层使用二叉搜索树(红黑树)来实现 Set的详细文档介绍:Set使用介绍。...string", "字符串"}; dict.insert(kv); // C++11支持,构造函数支持多参数隐式类型转换 dict.insert({ "apple", "苹果" }); // C+...string", "字符串"}; dict.insert(kv); // C++11支持,构造函数支持多参数隐式类型转换 dict.insert({ "apple", "苹果" }); // C+

    6710

    【C++】map和set的封装

    一、前情回顾 set 参数只有 key,但是map除了key还有value。...: 对于map:传key,对于set:传pair map的结构简化源码: set的结构简化源码: 为了让我们的红黑树能够识别set与map我们增加一个模板参数T: templateset容器,那么它传入底层红黑树的模板参数就是Key和Key: template class set { private: RBTree _t; }; 如果是...**红黑树的节点**:set容器:K和T都是键值Key; map容器:K是键值Key,T由Key和Value构成的键值对;但是底层红黑树并不知道上层容器到底是map还是set,因此红黑树的结点当中直接存储...map还是set容器,当需要进行两个结点键值的比较时,底层红黑树传入的仿函数来获取键值Key,进行两个结点键值的比较:这个时候我们就需要仿函数了,如果是set那就是用于返回T当中的键值Key,如果是map

    16320

    【C++】set和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

    12820

    【C++】map和set的封装

    在STL中的map与set 在STL中,map和set都是使用的红黑树 ---- map与set在STL中实现是一样的 对于value_type,map的第二个模板参数是pair,而set的第二个模板参数是...key 这样写是为了map和set使用同一颗红黑树去复用map和set ---- set -> rb_tree map - > rb_tree<K,pair...,所以不知道到底传过来的是什么 所以使用 模板类型的 data 代替 ---- 在结构定义时,为了让map与set都能调用同一颗红黑树,所以把模板参数改为T 当set要调用时,T变为 当map...还是map,无法知道T代表什么 但是在使用set或者map内部是知道的,所以 分别在map和set内部各自创建一个内部类,其中都写一个operator() ---- 在函数模板中添加一个参数,即可找到对应...map/set的key值 ---- 在红黑树内部,使用类实例化一个对象kot,通过kot去调用map/set 中相同的operator() ,取出对应的key值 迭代器 set/map的迭代器是红黑树内部的迭代器

    17130
    领券