目录

1.序列式、关联式容器

2.键值对

3.set

3.1set的简介

3.2set的常用函数

4.multiset

5.map

5.1map的简介

5.2map的常用函数

6.multimap

7.练习题


 

1.序列式、关联式容器

vector、deque、list、forward_list、array等是C++STL中的序列式容器

其核心特性是 元素按插入顺序存储,支持高效的顺序访问或随机访问

set、map、multiset、multimap等是C++STL中的关联式容器

其核心特性是 元素通过键(key)进行排序和快速查找,而不是像序列式容器那样按插入顺序存储

2.键值对

键值对是一种数据结构,由唯一的键 Key 对应的值 Value 组成
键 Key :唯一标识符,用于快速定位数据且必须是不可变类型(如字符串、数字、元组等)

值 Value  :存储的实际数据,可以是任意类型(字符串、数字、列表、字典等)

映射关系:一个键对应一个值,形成 key: value 的结构

键值对主要通过 标准模板库(STL) 中的 std::pair 和关联容器(如 std::mapstd::unordered_map)实现,下面是STL中的定义

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){}};

容器更详细的使用请参考cplusplus.com - The C++ Resources Network

3.set

3.1set的简介

set容器实际上就是二叉搜索树应用中说的 K模型

T: set中存放元素的类型(实际在底层存储的键值对)

Compare(仿函数):set中元素默认按照小于来比较

Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理(后续讲解)

3.2set的常用函数

set自带默认构造、迭代器区间构造、拷贝构造等成员函数

(1)insert

set支持单个元素插入在特定位置后插入以及迭代器区间范围内元素的插入

重点讲讲单个元素插入的返回值

插入元素不在set中,返回pair<插入元素在set中的迭代器,true>

插入元素在set中,返回pair<插入元素在set中的迭代器,false>

从上面我们可以得出结论

set中的每个元素只能出现一次(重复插入会被忽略)

(2)

set 是基于红黑树(一种平衡二叉搜索树)实现的,遍历方式是中序遍历且由于元素默认是按小于比较的,迭代器打印序列就是升序序列

插入元素Key不可修改

(3)find

//查找高度次
s.find(5);
//暴力查找,最多N次
find(s.begin(), s.end(), 5);

set中的find函数是根据元素大小比较查找的,最多查找树高度次

算法库中的find函数遍历查找的,最多查找元素个数次

两者:找到了,返回该位置的迭代器,找不到返回 end()

(4)count

set 中的count 也可以用来查找,返回的是元素个数

找到了返回1,找不到返回0

	if (s.count(5)){cout << "找到了" << endl;}

(5)erase

set支持特定位置的删除特定元素的删除以及迭代器区间范围内元素的删除

特定位置的删除,传入的 position 应属于[ first,last ),否则系统会崩溃

正确做法

	auto pos = s.find(50);//不能越界访问	if (pos != s.end())s.erase(pos);

特定元素的删除,函数返回删除的数量,这里当然是0或1啦

迭代器区间范围内元素的删除,范围一定要准确,否则程序会崩溃或出现未定义行为

(6)lower_bound

iterator lower_bound (const value_type& val) const;

该函数返回 大于等于val的第一个元素的迭代器,找不到时返回 end()

(7)upper_bound

iterator upper_bound (const value_type& val) const;

该函数返回 大于val 的第一个元素的迭代器,找不到时返回 end()

set与multiset使用一致

(8)equal_range

pair<iterator,iterator> equal_range (const value_type& val) const;

pair.fisrt 就是 lower_bound 的返回值

pair.second 就是 upper_bound 的返回值

set与multiset使用一致

4.multiset

multiset与set的最大区别就是 multiset可以存储多个相同大小的元素

multiset的插入、查找、删除等与set类似,这里不再赘述

5.map

5.1map的简介

set容器实际上就是二叉搜索树应用中说的 KV模型

key: 键值对中key的类型
T: 键值对中value的类型
Compare(仿函数): 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
 Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的
空间配置器(后续讲解)
注意:在使用map时,需要包含头文件。

5.2map的常用函数

map自带默认构造、迭代器区间构造、拷贝构造等成员函数

(1)insert

map插入的是一个键值对pair

map支持单个pair插入在特定位置后插入以及迭代器区间范围内pair的插入

重点讲讲单个pair插入的返回值

插入pair的pair.fistr不在map中,返回一个键值对pair<插入pair在map中的迭代器,true>

插入pair的pair.fistr在map中,返回一个键值对pair<插入pair在map中的迭代器,false>

map中存储的是键值对pair,且pair.first均不相同

map<string, string> dict;
pair<string, string> kv("insert", "插入");
dict.insert(kv);
dict.insert(pair<string, string>("copy", "复制"));
dict.insert(make_pair("right", "右边"));
dict.insert({ "pig", "猪" });
以上4中方式都可以完成插入:有名键值对、匿名键值对、调用函数创建键值对、多参数构造函数创建键值对(C++11)
template <class T1,class T2>pair<T1,T2> make_pair (T1 x, T2 y){return ( pair<T1,T2>(x,y) );}

make_pair 函数通常可成为内联函数,消耗较小

(2)

map 是基于红黑树(一种平衡二叉搜索树)实现的,遍历方式是中序遍历且由于元素默认是按小于比较的(比较的是键值对中的键值Key,即第一个元素),迭代器打印序列就是升序序列

()map的其余函数与set类似,这里不再赘述,下面详解map的operator[]函数

函数的类似实现

value& operator[](const Key& x)
{auto ret = insert(make_pair(x, value());return (ret.first)->second;
}

ret接收键值对<x,value()>插入的返回值:

如果x不在map中,使用value的默认构造与x组成键值对并插入

如果x在map中,不插入

ret:<在map中指向x所在键值对的迭代器,true(插入成功)\false(插入失败)>

(ret.first)->second就是x所在键值对中的value

这样 [] 就可以实现插入和修改的功能

此时,统计次数就简洁了起来

6.multimap

multimap与map的最大区别就是 multimap可以存储多个key值相同的的键值对

除了没有 operator[],使用方法与map类似

因为operator[]可修改键值对中的value,多个Key值相同的的键值对存在时,无法确定修改哪一个键值对的value

7.练习题

349. 两个数组的交集 - 力扣(LeetCode)

692. 前K个高频单词 - 力扣(LeetCode)

20. 有效的括号 - 力扣(LeetCode)

138. 随机链表的复制 - 力扣(LeetCode)

map、set 去重+排序的特点,map的映射关系会使效率大大提升!

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

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

相关文章

数据结构——排序(升级篇:快速排序、堆排序、希尔排序、计数排序)

1. 快速排序&#xff08;Quick Sort&#xff09; 原理&#xff1a; 选择一个基准值&#xff08;pivot&#xff09;将数组分成两部分&#xff1a;小于 pivot 的放左边&#xff0c;大于 pivot 的放右边。然后递归处理 工作过程示例&#xff1a; 示例数组&#xff1a;[5, 3, 8, 4,…

C++:浅尝gdb

hp window11 wsl ubuntu what is gdb&#xff1f; GNU调试器&#xff08;英语&#xff1a;GNU Debugger&#xff0c;缩写&#xff1a;GDB&#xff09;&#xff0c;是GNU软件系统中的标准调试器&#xff0c;此外GDB也是个具有移携性的调试器&#xff0c;经过移携需求的调修与…

Android输入法一些常用的命令

Android开发过程可能会遇到Android输入法异常的问题&#xff0c;可以通过如下命令来查看和修改系统的输入法。方便调试。 获取当下系统的所有输入法 adb shell ime list获取当前的可用输入法 adb shell ime list -s获取当前的输入法 adb shell settings get secure default_inp…

Sklearn 机器学习 手写数字识别 加载并查看数据

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Sklearn 机器学习 手写数字识别:加载并查看数据 在机器学习入门案例中,手写数字识别…

卫星通信链路预算之七:上行载噪比计算

在前面的文章中我们介绍了卫星通信链路计算的基础知识&#xff0c;包括&#xff1a; 信噪比分配&#xff1b; 带宽和功带平衡原则&#xff1b; EIRP和G/T&#xff1b; 输入回退&#xff1b; 输入饱和通量密度SFD&#xff1b; 输出回退&#xff1b; 这次我们正式进入正题…

一文读懂PDB格式

最近在做分子对接和分子模拟&#xff0c;涉及到了一些盲区&#xff0c;必去pdb文件是按照列位数储存信息的&#xff0c;跟其他文件的空格或者制表符分割很不同&#xff0c;所以也可能出现一些错误&#xff0c;比如信息错位&#xff0c;因此有必要了深入解下结构相关的格式pdb、…

进阶:PGCE中级专家认证精要

PGCE中级认证的核心价值技术深度&#xff1a;掌控未来生态PostgreSQL不仅是传统关系型数据库的标杆&#xff0c;更是云原生、AI大模型训练、物联网平台等前沿场景的核心支撑。通过PGCE认证&#xff0c;你将掌握&#xff1a;万亿级数据性能调优&#xff1a;从查询优化器原理到执…

AI增强SEO关键词表现

内容概要 随着人工智能技术的不断演进&#xff0c;其在搜索引擎优化领域展现出显著潜力&#xff0c;尤其在关键词表现优化方面发挥着核心作用。本文将从基础概念入手&#xff0c;系统探讨AI如何智能提升关键词的搜索可见性、流量吸引力和转化效率&#xff0c;从而驱动整体SEO策…

PG靶机 - PayDay

一、 初步侦察与服务探测 1.1 端口扫描与服务识别 首先&#xff0c;对目标主机 192.168.163.39 进行一次全面的端口扫描&#xff0c;以识别其上运行的各项服务。 sudo nmap 192.168.163.39 -p- --min-rate5000 -A图 1: Nmap 扫描结果&#xff0c;显示开放 80、445 和 995 等端口…

MySQLl中OFFSET 的使用方法

MySQLl中OFFSET 的使用方法基本语法SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET offset_value;number_of_rows&#xff1a;指定返回的记录数量。offset_value&#xff1a;从第几条记录开始返回&#xff08;偏移量从 0 开始计数&#xff09;。示…

监管科技(RegTech)应用:技术驱动的合规革命

目录 监管科技(RegTech)应用:技术驱动的合规革命 1. 监管科技革命:数字化合规新范式 2. 技术架构全景 2.1 现代RegTech架构 2.2 合规效率公式 3. 核心技术实现 3.1 智能合约自动化合规 3.2 AI驱动的风险监测引擎 4. 核心应用场景 4.1 KYC/AML全流程自动化 4.2 实时交易监控系…

解决SQL Server连接失败:Connection refused: connect

今天创建数据库&#xff0c;本地连接SQL Server报错&#xff1a;“通过端口 1433 连接到主机 127.0.0.1 的 TCP/IP 连接失败。错误&#xff1a;Connection refused: connect”报错图如下&#xff1a;查了一圈&#xff0c;问题出在&#xff1a;TCP/IP 没启用。如果问题和我一样&…

Windows bypassUAC 提权技法详解(一)

引言 用户账户控制&#xff08;User Account Control, 简称 UAC&#xff09;是微软自 Windows Vista 起引入的一项安全功能&#xff0c;旨在通过要求用户在执行需要管理员权限的操作时进行确认&#xff0c;从而防止未经授权的系统更改。UAC 的设计初衷是提高系统安全性&#xf…

OpenCV ------图像基础处理(一)

在 OpenCV 的图像处理世界中&#xff0c;除了图像边框处理&#xff0c;还有一些基础且重要的函数和运算&#xff0c;它们在图像编辑、融合等场景中发挥着关键作用。下面我们就来详细介绍cv2.copyMakeBorder()函数的具体参数与作用&#xff0c;以及图像加法运算和加权运算的相关…

Unity宝箱随机事件实现指南

目录 前言 一、简单的使用 新增ChestInteractableEvents&#xff0c;定义宝箱交互事件 新增Box 箱子挂载脚本&#xff0c;配置事件 运行效果 二、完善各种事件 1. 完善生成金币事件 效果&#xff0c;金币飞出 2. 完善生成敌人事件敌人 效果 3. 完善生成药水事件 效…

从单机到分布式:用飞算JavaAI构建可扩展的TCP多人聊天系统

1. 引言&#xff1a;飞算JavaAI与实时通信技术的融合 1.1 为什么需要TCP多人聊天室&#xff1f; 在即时通讯领域&#xff0c;基于TCP协议的聊天室是理解网络编程核心概念的经典案例&#xff0c;其技术价值体现在&#xff1a; 底层协议控制&#xff1a;直接操作Socket实现可靠数…

用 mock 把 ES 单元测试@elastic/elasticsearch-mock 上手

一、为什么“单元测 ES”这么别扭&#xff1f; 测试 ES 代码时&#xff0c;最直觉的做法是连真集群做集成测试&#xff08;Docker 起个 ES&#xff09;&#xff0c;但&#xff1a; 启动 & 数据装填慢&#xff0c;不利于并行&#xff1b;网络/磁盘抖动影响稳定性&#xff1b…

《嵌入式Linux应用编程(三):Linux文件IO系统调用深度解析》

今日学习内容1. 文件IO与标准IO核心对比特性标准IO文件IO实现层C标准库Linux内核系统调用缓冲机制全缓冲/行缓冲无缓冲&#xff08;实时读写&#xff09;操作对象FILE*流指针整型文件描述符&#xff08;fd&#xff09;移植性跨平台兼容Linux特有典型应用场景普通文件操作硬件设…

数据结构之顺序表相关算法题

目录一、移除元素二、删除有序数组中的重复项三、合并两个有序数组总结一、移除元素 移除元素 - 力扣 思路一&#xff1a;就是创建一个临时数组&#xff0c;对原数组进行遍历&#xff0c;找出与val不同的数据放到新数组里&#xff0c;然后再将tmp中的数据导回原数组 这个思…

百胜软件×华为云联合赋能,“超级国民品牌”海澜之家新零售加速前行

报道显示&#xff0c;早在2012年海澜之家就开始布局数字化征程&#xff0c;并于近年对公司全流程信息化进行综合重构升级优化&#xff0c;在采销协同、业财一体等方面突破原有架构&#xff0c;通过信息化架构的增强为业务发展提供支撑。作为新零售重要组成部分的海澜电商信息化…