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语言允许用户根据需要自己建立的由不同类型数据组成的组合型…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...

C# WPF 左右布局实现学习笔记(1)
开发流程视频: https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码: GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用(.NET Framework) 2.…...
java+webstock
maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...