STL容器之map和set

map和set

​ c++98支持的是单参数的隐式类型转换,而c++11支持多参数的隐式类型转换;

1.map和set的使用

1.1set

​ set实现key值不允许修改,是将iterator转变成const_iterator;可以对同一个类型typedef成两个不同的自定义标识符。即set没有设置普通迭代器;

​ set的底层是红黑树,使用仿函数比较大小。关联式容器。

​ set可以实现比较记录重复次数但是需要重载仿函数,实现key_value只需要set内部实现的是一个结构体。

​ count和equal_range在set容器里面一样不大,而在multiset才有意义。

template < class T,                        // set::key_type/value_typeclass Compare = less<T>,        // set::key_compare/value_compareclass Alloc = allocator<T>      // set::allocator_type> class set;
//1.构造
empty (1)	explicit set (const key_compare& comp = key_compare(),const allocator_type& alloc = allocator_type());
range (2)	template <class InputIterator>set (InputIterator first, InputIterator last,const key_compare& comp = key_compare(),const allocator_type& alloc = allocator_type());
copy (3)	set (const set& x);
//2.迭代器
//和一起的容器一样,迭代器底层走的是一个中序遍历,还可以去重。
//3.insert
iterator insert (iterator position, const value_type& val);//某个迭代器位置进行插入
//4.erase
void erase (iterator position);//配合find使用,使用find找到迭代器位置。
size_type erase (const value_type& val);//根据值来进行删除。其实就是find和erase的复用,但是会断言。
//5.find
template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);//暴力查找会查找O(N)次
iterator find (const value_type& val) const;//因为树的左右两边是平衡的,会根据大小进行比较,最多访问高度次lg(N)次,建议优先使用它。
//6.key/value的仿函数
key_compare key_comp() const;
value_compare value_comp() const;
//7.count
size_type count (const value_type& val) const;//返回这个值出现的次数,在set中存在返回的就是1,不存在返回的就是零。
//8.找边界
//常用在erase使用区间删除
iterator lower_bound (const value_type& val) const;//返回的迭代器位置是大于等于这个值
iterator upper_bound (const value_type& val) const;//由于区间一般是左闭右开,所以返回的迭代器位置一般是这个值的下一位。即删除找左闭右闭,查找找左闭右开
//9.找区间
pair<iterator,iterator> equal_range (const value_type& val) const;

1.2multiset(Multiple-key set)

​ 支持键值冗余的multiset容器,相等的值插入在左边和右边都可以。

//1.count
size_type count (const value_type& val) const;//返回val的个数
//2.equal_range
pair<iterator,iterator> equal_range (const value_type& val) const;//由于set容器是一个有序的红黑树,所以大小相同的值的是一段连续的区间范围,可以用pair结构来接收迭代区间的lower和upper。返回大于val数的[val+,val+)
//3.find
//相较于set的find,由于有了数据冗余,所以返回值返回的是中序遍历的第一个val的iterator

1.3map

​ 使用map来完成括号匹配问题,而且初始化用initializer_list更加方便。

​ 键值唯一,value可重复;map内存放的是pair对象;key必须支持比较大小;如果不支持比较大小可以自己写一个仿函数来实现,因为仿函数比较使用的就是key;

template < class Key,                                     // map::key_typeclass T,                                       // map::mapped_typeclass Compare = less<Key>,                     // map::key_compare,只有key参与比较class Alloc = allocator<pair<const Key,T> >    // map::allocator_type> class map;//相较于set多了一个模板参数,用来设置value
//1.insert
pair<iterator,bool> insert (const value_type& val);//1.value_type是一个pair<const key_type,mapped_type>,即key只读不允许写入,而value可读写;2.可以使用make_pair函数模板来实现传入参数val或者使用隐式类型转换;3.设置pair的原因是c++不支持返回多个参数,但是可以返回一个结构,如:解引用运算符重载返回的就是一个结构;4.key相同但是value不相同,也不会插入不会覆盖,值比较key,不关心value;5.返回值插入成功返回true,要插入的key值存在则是false
//2.erase
void erase (iterator position);
size_type erase (const key_type& k);
//3.operator[]
mapped_type& operator[] (const key_type& k);//特点是通过key来返回value;
//对于不存在的key值会创建并用匿名对象来初始化pair,已经存在的key值会修改value值;
//底层实现就是return (*((this->insert(make_pair(k,mapped_type()))).first)).second,即使用的是insert的返回值中的迭代器位置的value。
//1.可以使用[]来实现统计出现的次数;2.可以实现插入加修改;

1.4multimap

​ 支持键值冗余的multimap容器,value和map一样。

​ 1.相较于map没有提供[],因为键值不是唯一的。

​ 2.insert返回的是迭代器不是pair,因为插入一定成功;

​ 3.哈希的效率可以达到O1;

1.5pair

template <class T1, class T2>
struct pair {typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair() : first(T1()), second(T2()) {}pair(const T1& a, const T2& b) : first(a), second(b) {}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/717818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rocky 9 安装 R-CytoTRACE

官网给出的详细指南&#xff0c;只是可能大家打不开或者懒得去看E文。 第一步&#xff0c;下载CytoTRACE安装包。 wget https://cytotrace.stanford.edu/CytoTRACE_0.3.3.tar.gz 第二步&#xff0c;打开R或者Rstudio-server # 安装依赖包 if (!requireNamespace("Bioc…

在vue中$nextTick 原理及作用

在vue中$nextTick 原理及作用 Vue 的 nextTick 其本质是对 JavaScript 执行原理 EventLoop 的一种应用。 nextTick 的核心是利用了如 Promise 、MutationObserver、setImmediate、setTimeout的原生 JavaScript 方法来模拟对应的微/宏任务的实现&#xff0c;本质是为了利用 Java…

每周AI新闻(2024年第9周)微软与Mistral AI达成合作 | 谷歌发11B基础世界模型 | 传苹果放弃电动汽车制造转向生成式AI

这里是陌小北&#xff0c;一个正在研究硅基生命的碳基生命。正在努力成为写代码的里面背诗最多的&#xff0c;背诗的里面最会写段子的&#xff0c;写段子的里面代码写得最好的…厨子。 每周日解读每周AI大事件。 大厂动向 【1】微软与Mistral AI达成合作 微软官宣与法国生成…

视频云平台——搭建SRS5平台支持GB28181视频流的推送

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;我们面对的不仅…

谨用ArrayList中的subList方法

谨用ArrayList中的subList方法 规范一&#xff1a; ArrayList 的 subList 结果不可强转成 ArrayList&#xff0c;否则会抛出 ClassCastException 异常&#xff1a; public static void test7() {List<Integer> list new ArrayList<>();list.add(1);list.add(2);…

JavaWeb—— SpringBootWeb综合案例(登录功能、登录校验、异常处理)

案例-登录认证 目录 案例-登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技术 2.3 JWT令牌2.3.1…

程序员眼中的“祖传代码”

引言 在IT界&#xff0c;特别是在Java项目中&#xff0c;“祖传代码”通常指的是那些经过长时间积累、由多位开发者共同维护、且蕴含深厚技术沉淀的代码片段或模块。这些代码可能存在于项目的核心模块&#xff0c;也可能是一些辅助性的工具类。它们承载着项目的历史&#xff0…

Matlab 多项式插值(曲线拟合)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 由于对曲线拟合有些兴趣,这里就找了一些资料从最基本的方法来看一下曲线拟合的效果: 二、实现代码 % **********

Vue.js中的路由导航守卫和其使用方法

Vue.js 中的路由导航守卫是 Vue Router 提供的一套机制&#xff0c;用于在路由切换的过程中执行自定义代码逻辑&#xff0c;包括但不限于权限验证、页面滚动位置保存、加载数据等。它分为三种类型&#xff1a; 全局前置守卫 (Global beforeEach Guard) 全局前置守卫应用在整个…

python科学计算库之Numpy库的使用的简单习题

Numpy库 Numpy&#xff08;Numerical Python的缩写&#xff09;是一个开源的Python库&#xff0c;用于进行科学计算。它提供了一个高性能的多维数组对象&#xff08;ndarray&#xff09;及用于处理这些数组的各种工具和函数。由于其高效和灵活的数据结构以及丰富的功能&#x…

Google 地图 API 教程--干货(1/2)

Google Maps API 教程 在本教程中我们将学习如何使用谷歌地图API V3创建交互式地图。 什么是 API? API = 应用程序编程接口(Application programming interface)。 API(Application Programming Interface,应用编程接口)其实就是操作系统留给应用程序的一个调用接口,…

【d34】【Java】【力扣】27. 移除元素

题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

案例介绍:汽车售后服务网络构建与信息抽取技术应用(开源)

一、引言 在当今竞争激烈的汽车行业中&#xff0c;售后服务的质量已成为品牌成功的关键因素之一。作为一位经验丰富的项目经理&#xff0c;我曾参与构建一个全面的汽车售后服务网络&#xff0c;旨在为客户提供无缝的维修、保养和配件更换服务。这个项目的核心目标是通过高效的…

spring、springmvc、springboot框架的介绍

前言 我们已经学过Spring&#xff0c;SpringMVC&#xff0c;SpringBoot了&#xff0c;那这三者之间有没有联系或者区别呢&#xff1f; spring是一个一站式的轻量级java开发的框架&#xff0c;那我们刚开始使用spring的时候&#xff0c;是需要配置很多的配置文件以及繁琐的过程…

状态机实现双击、短按、长按等按键识别检测算法

1、按键识别算法的作用 按键识别算法在不同的技术和应用背景下有不同的作用&#xff0c;但其核心目标都是准确、可靠地检测和区分用户通过物理或虚拟按键所执行的操作。按键识别算法在各类电子设备及系统中起到至关重要的作用&#xff0c;它确保了人机交互的有效性和准确性&…

Vue前端+快速入门【详解】

目录 1.Vue概述 2. 快速入门 3. Vue指令 4.表格信息案例 5. 生命周期 1.Vue概述 1.MVVM思想 原始HTMLCSSJavaScript开发存在的问题&#xff1a;操作麻烦&#xff0c;耦合性强 为了实现html标签与数据的解耦&#xff0c;前端开发中提供了MVVM思想&#xff1a;即Model-Vi…

Mysql-主从架构篇(一主多从,半同步案例搭建)

主从架构 主从架构有什么用&#xff1f; 通过搭建MySQL主从集群&#xff0c;可以缓解MySQL的数据存储以及访问的压力。 数据安全&#xff08;主备&#xff09;&#xff1a;给主服务增加一个数据备份。基于这个目的&#xff0c;可以搭建主从架构&#xff0c;或者也可以基于主…

GO语言学习笔记(与Java的比较学习)(九)

读写数据 读取用户的输入 最简单的办法是使用 fmt 包提供的 Scan 和 Sscan 开头的函数。 Scanln 扫描来自标准输入的文本&#xff0c;将空格分隔的值依次存放到后续的参数内&#xff0c;直到碰到换行。Scanf 与其类似&#xff0c;除了 Scanf 的第一个参数用作格式字符串&…

大数据开发(Java面试真题-卷三)

大数据开发&#xff08;Java面试真题&#xff09; 1、简要介绍以下JVM有几种垃圾收集器&#xff1f;2、Java中Synchronized的底层原理是什么&#xff1f;3、Java String为什么是不可变的&#xff1f;为什么要设计成不可变&#xff1f;4、泛型&#xff1f;5、常用的反射方法&…

深入Java日志框架及其最佳实践

概述 在Java应用开发中&#xff0c;日志框架是确保应用稳定性和可观察性的关键组件。它帮助开发者记录应用的行为、诊断问题&#xff0c;并监控系统的健康状况。随着Java生态系统的不断发展&#xff0c;各种日志框架也应运而生&#xff0c;各有特点和优势。本文将详细探讨几个…