数据结构十三、set map

embedded/2025/3/30 17:58:25/

一、set

1、size / empty

        size:返回set中实际元素的个数

        empty:判断set是否为空

2、begin / end

        这是两个迭代器,因此可以使用范围for来遍历整个红黑树。其中,遍历是按照中序遍历的顺序,因此是一个有序序列

3、insert / erase

        insert:向红黑树中插入一个元素

        erase:删除一个元素

4、find / count

        find:查找一个元素,返回的是迭代器

        count:查询元素出现的次数

如果想查找元素是否在set中,我们一般不使用find,而是使用count。因为find的返回值是一个迭代器,判断起来不方便。

5、lower_bound / upper_bound

        lower_bound:大于等于x的最小元素,返回的是迭代器

        upper_bound:大于x的最小元素,返回的是迭代器

6、所有测试代码

#include <iostream>
#include <set>
using namespace std;int a[] = { 10,60,20,70,80,30,90,40,100,50 };int main()
{set<int> mp;for (auto e : a){mp.insert(e);}for (auto x : mp){cout << x << " ";}cout << endl;if (mp.count(1))cout << "1" << endl;if (mp.count(10))cout << "10" << endl;mp.erase(10);if (mp.count(10))cout << "YES" << endl;elsecout << "NO" << endl;auto x = mp.lower_bound(20);auto y = mp.upper_bound(20);cout << *x << " " << *y << endl;return 0;
}

二、map

map与set的区别:set里面存储的是一个单独的关键字(也就是存一个int、char、double或者string)。而map里面存的是一个pair<key, value>(k-v模型),不仅有一个关键字,还有一个与关键字绑定的值,比较方式是按照key的值来比较。比如,我们可以在map中存<string, int>来统计字符串出现的次数。

1、insert

        向红黑树中插入一个元素。这里需要一个pair,可以用{}的形式

#include <iostream>
#include <map>
using namespace std;void print(map<string, int>& mp)
{for (auto& p : mp){cout << p.first << " " << p.second << endl;}
}int main()
{map<string, int> mp;mp.insert({ "zhangsan", 1 });mp.insert({ "lisi", 2 });mp.insert({ "wangwu", 3 });print(mp);return 0;
}

2、operator[]

        重载[],使得map可以像数组一样使用。

#include <iostream>
#include <map>
using namespace std;void print(map<string, int>& mp)
{for (auto& p : mp){cout << p.first << " " << p.second << endl;}
}int main()
{map<string, int> mp;mp.insert({ "zhangsan", 1 });mp.insert({ "lisi", 2 });mp.insert({ "wangwu", 3 });print(mp);cout << mp["zhangsan"] << endl;mp["zhangsan"] = 110;cout << mp["zhangsan"] << endl;return 0;
}

三、例题

 算法原理:求出最小波动值,我们只需要针对某一天的营业额,找出前面的数中哪个数离它最近(大于等于x的最小值 或者 小于等于x的最大值)。前一种情况可以调用lower_bound函数,后一种情况可以利用迭代器来解决。

#include <iostream>
#include <set>
using namespace std;const int INF = 1e7 + 10;int n;
set<int> mp;int main()
{cin >> n;int ret;cin >> ret;mp.insert(ret);mp.insert(-INF);mp.insert(INF);for (int i = 2;i <= n;i++){int x;cin >> x;auto it = mp.lower_bound(x);auto tmp = it;tmp--;if (*it == x)continue;ret += min(abs(*tmp - x), abs(*it - x));mp.insert(x);}cout << ret << endl;return 0;
}


http://www.ppmy.cn/embedded/177150.html

相关文章

LINUX基础IO [六] - 文件理解与操作

目录 前言 C语言文件操作回顾 文件的打开与关闭 文件的增删改查 文件系统调用 比特位方式的标志位传递原理 访问文件的本质 文件描述符fd 理解文件描述符fd 三个流的理解 文件描述符的分配规则 重定向再理解 输出重定向 输入重定向 如何理解一切皆文件 理解…

美摄科技智能汽车视频延迟摄影解决方案,开启智能出行新视界

在智能汽车时代&#xff0c;车载影像技术正以前所未有的速度发展&#xff0c;成为提升驾乘体验和满足用户多样化需求的关键因素。美摄科技凭借其卓越的技术实力和创新精神&#xff0c;推出了智能汽车视频延迟摄影解决方案&#xff0c;为智能汽车行业带来了一场视觉盛宴。 一、…

“我是GM”之NAS搭建Luanti游戏服务器,开启沙盒游戏新体验

“我是GM”之NAS搭建Luanti游戏服务器&#xff0c;开启沙盒游戏新体验 哈喽小伙伴们好&#xff0c;我是Stark-C~ 曾几何时&#xff0c;哪怕是现在&#xff0c;估计依然有很多小伙伴沉迷于开放性和自由度极高的《我的世界》这种沙盒游戏吧~。 我个人到现在手机上还有这款游戏…

如何保障kafka的数据不会重复消费呢,如何防止漏掉呢

在 Kafka 中保障数据不重复消费且不丢失&#xff0c;需要从生产者、消费者和 Kafka 自身配置三个层面综合设计。以下是具体实现方案&#xff1a; 一、防止数据重复消费 1. 消费者端控制 手动提交 Offset 禁用自动提交&#xff08;enable.auto.commitfalse&#xff09;&#x…

Rabbitmq消息被消费时抛异常,进入Unacked 状态,进而导致消费者不断尝试消费(上)

一、背景 在对阿里云成本分析的时候&#xff0c;发现SLS日志的费用暴增&#xff0c;由平均每月的2000元突然增至6000多。 查看日志的费用明细&#xff0c;按应收金额降序得知&#xff0c;原来是某个java服务打印的jvm日志暴增。 再已进入SLS查看打印的日志量&#xff0c;更…

CentOS 7 挂载与卸载文件系统

一、挂载文件系统​ 1. 查看系统磁盘与分区情况​ 在挂载文件系统之前&#xff0c;需要先了解系统中的磁盘和分区信息。使用fdisk -l命令&#xff0c;可列出所有磁盘和分区的详细信息&#xff0c;示例如下&#xff1a; [rootlocalhost ~]# fdisk -lDisk /dev/sda: 53.7 GB, …

吐血整理:Air8201如何使用LuatOS进行电源管理功能!

在物联网应用场景中&#xff0c;设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制&#xff0c;为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度&#xff0c;解析如何利用LuatOS实现Air8201的智能电源…

Filnk并行度和算子链

1. 并行度&#xff08;Parallelism&#xff09; 1.1 什么是并行度&#xff1f; 基本概念&#xff1a; 在 Flink 中&#xff0c;每个操作&#xff08;算子&#xff09;都可以被拆分成多个“子任务”&#xff08;subtasks&#xff09;&#xff0c;这些子任务可以同时在不同的线…