STL-set和map
目录
一、pair和make_pair
1. pair
2. make_pair
二、set
(一)set的模板参数列表
(二)set的构造
(三)set的插入
1. 测试1
2. 测试2
(四)low_bound和upper_bound(上/下边界)
(五)查找指定元素的范围(区间)
三、multiset
(一)介绍
(二)查找find
(三)删除erase
(四)查找特定值的范围(equal_range)
(五)计算指定值出现次数count
四、map
(一)map的模板参数列表
(二)插入insert
(三)operator[]
(四)统计次数
1. 方式一
2. 方式二
一、pair和make_pair
1. pair
template <class T1, class T2> struct pair;


- 可以容纳两个不同类型的值。它通常用于将两个值组合在一起,使得它们可以作为一个单元来处理
2. make_pair
make_pair是一个函数模板,可以让编译器根据参数自动确定类型
template <class T1, class T2>pair<T1,T2> make_pair (T1 x, T2 y);
#include <iostream>
using namespace std;int main() {int x = 10;double y = 3.14;pair<int, double> myPair = make_pair(x, y);cout << "First element: " << myPair.first << endl;//10cout << "Second element: " << myPair.second << endl;//3.14return 0;
}
二、set
- set是key搜索模型容器,判断在不在
- set中只放value,但在底层实际存放的是由<value, value>构成的键值对。
- set中插入元素时,只需要插入value即可,不需要构造键值对。
- set中的元素不可以重复(因此可以使用set进行去重)。
(一)set的模板参数列表

(二)set的构造

(三)set的插入
pair<iterator,bool> insert (const value_type& val);iterator insert (iterator position, const value_type& val);template <class InputIterator>void insert (InputIterator first, InputIterator last);
1. 测试1
#include<iostream>
#include<set>
using namespace std;void test1()
{set<int>s;s.insert(1);s.insert(9);s.insert(4);s.insert(7);s.insert(3);set<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";it++;}cout << endl;
}
int main()
{test1();//1 3 4 7 9return 0;
}
2. 测试2
#include<iostream>
#include<set>
using namespace std;void test1()
{set<int>s;s.insert(1);s.insert(9);s.insert(4);s.insert(7);s.insert(3);pair<set<int>::iterator, bool> ret = s.insert(7);cout << ret.second << endl;
}
int main()
{test1();//0,表示插入7失败了return 0;
}
(四)low_bound和upper_bound(上/下边界)
iterator lower_bound (const value_type& val) const;//返回大于等于val值位置的iterator
iterator upper_bound (const value_type& val) const;//返回大于val值位置的iterator
#include<iostream>
#include<set>
using namespace std;
void print(const set<int>& s)
{set<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";it++;}cout << endl;
}
void test()
{set<int> s;for (int i = 0; i < 10; i++){s.insert(i + 4);}print(s);//4 5 6 7 8 9 10 11 12 13set<int>::iterator itlow = s.lower_bound(7);//>= val值位置的iteratorset<int>::iterator itup = s.upper_bound(11);//> val值位置的iteratorcout << "*itlow: " << *itlow << " *itup: " << *itup << endl;//7 12s.erase(itlow, itup);print(s);//4 5 6 12 13
}
int main()
{test();return 0;
}

(五)查找指定元素的范围(区间)
pair<iterator,iterator> equal_range (const value_type& val) const;
- 返回两个迭代器,表示指定元素在集合中的范围。第1个迭代器指向第1个等于指定元素的位置,第2个迭代器指向第1个大于指定元素的位置。
#include<iostream>
#include<set>
using namespace std;
void test()
{set<int> mySet = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };pair<set<int>::iterator,set<int>::iterator> range = mySet.equal_range(4);cout << *(range.first) << endl;//4cout << *(range.second) << endl;//5
}
int main()
{test();return 0;
}
三、multiset
(一)介绍
template < class T, // multiset::key_type/value_typeclass Compare = less<T>, // multiset::key_compare/value_compareclass Alloc = allocator<T> > // multiset::allocator_type> class multiset;
- multiset是按照特定顺序存储元素的容器,其中元素是可以重复的
- 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除
(二)查找find
- 如果有多个相同的val,find返回中序第一个val
iterator find (const value_type& val) const;
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{set<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";it++;}cout << endl;
}
void test()
{multiset<int>s;s.insert(1);s.insert(6);s.insert(2);s.insert(2);s.insert(2);s.insert(8);s.insert(7);s.insert(5);s.insert(11);print(s);// 1 2 2 2 5 6 7 8 11multiset<int> ::iterator it = s.find(2);while (it != s.end()){cout << *it << " ";it++;}//2 2 2 5 6 7 8 11
}
int main()
{test();return 0;
}
(三)删除erase
void erase (iterator position);size_type erase (const value_type& val);//删除所有等于 key 的元素,并返回删除的元素数量。void erase (iterator first, iterator last);
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{set<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";it++;}cout << endl;
}
void test()
{multiset<int>s;s.insert(1);s.insert(6);s.insert(2);s.insert(2);s.insert(2);s.insert(8);s.insert(7);s.insert(5);s.insert(11);print(s);// 1 2 2 2 5 6 7 8 11size_t n =s.erase(2);print(s);//1 5 6 7 8 11cout << n;//3(删除2的数量为3)
}
int main()
{test();return 0;
}
(四)查找特定值的范围(equal_range)
pair<iterator,iterator> equal_range (const value_type& val) const;
- 利用删除所有2,利用equal_range,找到一个范围,然后利用erase
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{set<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";it++;}cout << endl;
}
void test()
{multiset<int>s;s.insert(1);s.insert(6);s.insert(2);s.insert(2);s.insert(2);s.insert(8);s.insert(7);s.insert(5);s.insert(11);print(s);// 1 2 2 2 5 6 7 8 11pair<set<int>::iterator, set<int>::iterator> ret = s.equal_range(2); s.erase(ret.first, ret.second);print(s);//1 5 6 7 8 11
}
int main()
{test();return 0;
}
(五)计算指定值出现次数count
size_type count (const value_type& val) const;
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{set<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";it++;}cout << endl;
}
void test()
{multiset<int>s;s.insert(1);s.insert(6);s.insert(2);s.insert(2);s.insert(2);s.insert(8);s.insert(7);s.insert(5);s.insert(11);print(s);// 1 2 2 2 5 6 7 8 11cout << "2出现次数:"<<s.count(2) << endl;//3
}
int main()
{test();return 0;
}
四、map
- map是kv型数据结构
(一)map的模板参数列表
template < class Key, // map::key_typeclass T, // map::mapped_typeclass Compare = less<Key>, // map::key_compareclass Alloc = allocator<pair<const Key,T> > // map::allocator_type> class map;
- key:键值对中key的类型
- T: 键值对中value的类型
- Compare:比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
- Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的
- 空间配置器
(二)插入insert
pair<iterator,bool> insert (const value_type& val);
iterator insert (iterator position, const value_type& val);template <class InputIterator>void insert (InputIterator first, InputIterator last);

#include<iostream>
#include<map>
using namespace std;
void print(map<string,string> m)
{map<string, string>::iterator it = m.begin();while (it != m.end()){cout << (*it).first << ": " << (*it).second << endl;it++;}cout << endl;
}
void test()
{map<string, string> dict;dict.insert(pair<string, string>("sort", "排序"));//插入匿名对象pairdict.insert(pair<string, string>("insert", "插入"));dict.insert(pair<string, string>("left", "左边"));dict.insert(make_pair("right", "右边")); // 自动堆导类型print(dict);
}
int main()
{test();return 0;
}

(三)operator[]
mapped_type& operator[] (const key_type& k);//k 是要访问或插入的键值对的键
#include<iostream>
#include<map>
using namespace std;
void print(map<string,string> m)
{map<string, string>::iterator it = m.begin();while (it != m.end()){//cout << (*it).first << ": " << (*it).second << endl;cout << it->first << ": " << it->second << endl;it++;}cout << endl;
}
void test()
{map<string, string> dict;dict.insert(pair<string, string>("insert", "插入"));dict.insert(pair<string, string>("left", "左边"));dict["erase"]; // 插入cout << dict["erase"] << endl; // 查找dict["erase"] = "删除"; // 修改cout << dict["erase"] << endl;// 查找dict["test"] = "测试"; // 插入键值对dict["left"] = "左边、剩余"; // 修改print(dict);
}
int main()
{test();return 0;
}

(四)统计次数
1. 方式一
void test()
{string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };map<string, int> countMap;for (auto& str : arr){auto ret = countMap.find(str);if (ret == countMap.end()){// 没有表示第一次出现,插入countMap.insert(make_pair(str, 1));}else{// 次数++ret->second++;}countMap[str]++;}print(countMap);
}
2. 方式二
#include<iostream>
#include<map>
using namespace std;
void print(map<string, int> m)
{map<string, int>::iterator it = m.begin();while (it != m.end()){//cout << (*it).first << ": " << (*it).second << endl;cout << it->first << ": " << it->second << endl;it++;}cout << endl;
}
void test()
{string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };map<string, int> countMap;for (auto& str : arr){countMap[str]++;//因为map容器中第1个成员不能修改,第2个成员可以修改}print(countMap);
}
int main()
{test();return 0;
}
相关文章:
STL-set和map
目录 一、pair和make_pair 1. pair 2. make_pair 二、set (一)set的模板参数列表 (二)set的构造 (三)set的插入 1. 测试1 2. 测试2 (四)low_bound和upper_boundÿ…...
【WinForm详细教程四】WinForm中的ProgressBar 、ImageList和ListView控件
文章目录 1.ProgressBar2. ImageList3.ListView控件 1.ProgressBar 用于显示某个操作的进度。 属性: Value: 表示当前进度条的值,其范围由Min和Max决定。Step: 设置每次调用PerformStep()方法时增加的步长。MarqueeAnimationSpeed: 在Style设置为Marq…...
写一个简单实用的Excel工具类
我们在开发中经常要将数据导入成Excel表格供展示,也需要解析Excel中的数据,官方提供的api操作太麻烦,这边封装了一个Excel工具类,可以很轻松的实现Excel的操作 首先加入依赖 <dependencies><!-- EasyPoi 基本库依赖 --…...
C#中LINQtoObjects、LINQtoDataSet和LINQtoXML
目录 一、使用LINQ操作数组和集合 二、使用LINQ操作DataSet数据集 1.AsEnumerable()方法 2.CopyToDataTable()方法 3.AsDataView()方法 4.Take()方法 5.Sum()方法 6.示例 (1)源码 (2)生成效果 三、使用LINQ操作XML 1.…...
k8s中 RBAC中,clusterrole,serviceaccount , rolebinding 是什么关系谁先谁后
在Kubernetes的RBAC(Role-Based Access Control)中,ClusterRole、ServiceAccount和RoleBinding是三个关键的组件,它们之间的关系如下: ClusterRole:ClusterRole 是一种全局的权限规则,它定义了一…...
什么是文件安全
文件安全就是通过实施严格的访问控制措施和完美的权限卫生来保护您的业务关键信息不被窥探,除了启用和监控安全访问控制外,整理数据存储在保护文件方面也起着重要作用。通过清除旧的、过时的和其他垃圾文件来定期优化文件存储,以专注于关键业…...
maven的settings.xml和pom.xml配置文件详解
一、配置文件 maven的配置文件主要有 settings.xml 和pom.xml 两个文件。 其中在maven安装目录下的settings.xml,如:D:\Program Files\apache-maven-3.6.3\conf\settings.xml 是全局配置文件 用户目录的.m2子目录下的settings.xml,如&#…...
YB2503HV 100V 3A SOP8内置MOS 高效率降压IC(昱灿)
YB2503HV 100V 3A SOP8内置MOS 高效率降压IC 描述: YB2503HV是单片集成可设定输出电流的开关型降压恒压驱动器,可工作在宽输入电压范围具有优良的负载和线性调整度。安全保护机制包括每周期的峰值限流、软启动、过压保护和温度保护。YB2503HV需要非常少…...
Redis安装Linux
1、下载安装包 wget http://download.redis.io/releases/redis-3.0.0.tar.gz 2、安装 mkdir /usr/local/redis cp redis-3.0.0.tar.gz /usr/local/redis cd /usr/local/redis tar -zxvf redis-3.0.0.tar.gz cd /usr/local/redis/redis-3.0.0 make PREFIX/usr/local/red…...
PCL点云处理(007)-Ransac
随机抽样一致性算法RANSAC(Random sample consensus)是一种迭代的方法来从一系列包含有离异值的数据中计算数学模型参数的方法。 RANSAC算法本质上由两步组成,不断进行循环: 从输入数据中随机选出能组成数学模型的最小数目的元素,使用这些元素…...
有方N58 HTTP POST 请求连接 TDengine
串口调试软件:格西调试精灵 第一步先注册网络获取IP地址 建立PPP连接 ATXIIC1\r PPP链路建立成功,查询IP地址 ATXIIC?\r 设置网络APN ATCREG?\r 运行结果,红线处是获…...
基于Python+Pygame实现一个滑雪小游戏
目录 项目介绍Pygame介绍项目文件夹介绍演示视频代码免费领取 一、项目介绍 使用介绍:运行main.py文件后,通过左右按键可以控制小人的移动,如果经过旗杆那么10分,如果碰到树木那么减50分。 二、Pygame介绍 Pygame是一个用于游…...
【限制输入框值类型】自定义指令el-input输入类型限制,vue和html两个版本
前言 经常遇到输入框需要限制只能输入数字的, 因为用户很离谱,明显输入数字的地方他非要输入英文或者中文 但是用到UI框架或者自己写方法验证表单比较麻烦 为了一个输入框专门去弄一个验证很麻烦 所以这里就整合了两种自定义指令的方式,更加…...
对一个金融风控测额公式的理解(1)
目录 公式:(近3个月回款总额/过去3个月的FBA平均库存价值)*最近FBA的库存价值*过去13周FBA发货比例 详细讨论一下这个:(近3个月回款总额/过去3个月的FBA平均库存价值) 既然(近3个月回款总额/…...
【GEE】2、探索数据集
1简介 在本单元中,我们将讨论以下概念: Google 地球引擎中可用的潜在数据来源。 通过生态示例显示的数据集采样用例。 如何使用 Google 地球引擎访问重要的元数据。 2背景 要将遥感集成到您的研究和分析中,学习如何解析 Google 地球引擎上…...
开发一款直播弹幕游戏需要多少钱?
开发一款直播弹幕游戏需要多少钱?有好多朋友在咨询过弹幕游戏的开发价格后,都会比较吃惊,一款体量这么小的游戏为什么动辄就要几万块甚至十几万? 我来给你们说分析一下原因,这种游戏如果脱离开直播间,可以…...
STM32F103C8T6第一天:认识STM32 标准库与HAL库 GPIO口 推挽输出与开漏输出
1. 课程概述(297.1) 课程要求:C语言熟练,提前学完 C51 2. 开发软件Keil5的安装(298.2) 开发环境的安装 编程语言:C语言需要安装的软件有两个:Keil5 和 STM32CubeMX Keil5 的安装…...
selenium元素定位 —— 提高篇 CSS定位元素
CSS (Cascading Style Sheets) 是一种用于渲染 HTML 或者 XML 文档的语言,CSS 利用其选择器可以将样式属性绑定到文档中的指定元素。理论上说无论一个元素定位有多复杂都能够定位到元素。 因为不同的浏览器 XPath 引擎不同甚至没有自己的 Xpath 引擎,这…...
隔离和非隔离电源的区别
一、电源隔离与非隔离 电源的隔离与非隔离,主要是针对开关电源而言,业内比较通用的看法是: 1、隔离电源:电源的输入回路和输出回路之间没有直接的电气连接,输入和输出之间是绝缘的高阻态,没有电流回路。 …...
C语言自定义数据类型
一、构造数据类型 构造数据类型:用户自己建立的数据类型(自定义数据类型) C语言中的自定义数据类型有:数组类型、结构体类型、共用体类型和枚举类型。 1.1. 结构体 C语言允许用户根据需要自己建立的由不同类型数据组成的组合型…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
