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

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

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

相关文章

【行云流水线实践】基于“OneBuild”方法对镜像进行快速装箱 | 京东云技术团队

在云原生领域&#xff0c;无论使用哪种编排调度平台&#xff0c;Kubernetes&#xff0c;DockerSwarm&#xff0c;OpenShift等&#xff0c;业务都需要基于镜像进行交付&#xff0c;我们在内部实践“Source-to-image”和链式构建&#xff0c;总而总结出“OneBuild”模式。 其核心…

python 之softmx 函数

文章目录 总的介绍小应用 总的介绍 Softmax函数是一个常用的激活函数&#xff0c;通常用于多类别分类问题中。它将一个实数向量转换为概率分布。这个函数的输出是一个概率分布&#xff0c;表示输入样本属于每个可能类别的概率。 给定一个具有 (K) 个不同数值的实数向量 z (z1…

内网渗透-域防火墙+入站出站规则+组策略对象同步+不出网隧道上线

一.单机-防火墙-限制端口出入站-熟悉常见主机配置不出网的方式 配置防火墙属性 1.win10虚拟机本地搭建一个网站&#xff0c;配置防火墙属性的入站连接为默认值。 局域网中另一台主机能正常访问 2.入站连接设置为 阻止所有连接 。 因为是我们去访问他的网站&#xff0c;所以是入…

【JAVA学习笔记】 57 - 本章作业

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/homework 1. (1)封装个新闻类&#xff0c;包含标题和内容属性&#xff0c;提供get, set方法&#xff0c; 重写toString方法&#xff0c;打印对象时只打印标题; (2)只提供…

第8章_聚合函数

文章目录 1 聚合函数介绍1.1 AVG和SUM函数1.2 MIN和Max函数1.3 COUNT函数演示代码 2 GROUP BY2.1 基本使用2.2 使用多个列分组2.3 演示代码 3 HAVING3.1 基本使用3.2 WHERE和HAVING的对比3.3 演示代码 4 SELECT的执行过程4.1 查询的结构4.2 SELECT执行顺序4.3 SQL的执行原理演示…

STM32:I²C通信原理概要

一、IIC通信原理 IIC通信和串口通信有一定的相似之处&#xff0c;都有一根共地线和两根数据线。但是传递外部信息&#xff0c;串口有两根数据线可以进行双向通信&#xff0c;也就是全双工通信。而在IIC通信下&#xff0c;其中一条数据线是用于提供同步时钟脉冲的时钟线(SCL)&am…

从功能测试到测试开发,待遇翻倍,我整理的超全学习指南!

在这个吃技术的IT行业来说&#xff0c;我刚入行的时候每天做的也是最基础的工作&#xff0c;但是随着时间的消磨&#xff0c;我产生了对自我和岗位价值和意义的困惑。 一是感觉自己在浪费时间&#xff0c;另一个就是做了快2年的测试&#xff0c;感觉每天过得浑浑噩噩&#xff…

学电脑编程零基础,计算机编程入门先学什么

学电脑编程零基础&#xff0c;计算机编程入门先学什么&#xff0c;建议先从容易学习的语言入手&#xff0c;比如中文编程。 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&…

【unity3D】使用RawImage实现UI上的帧动画

&#x1f4a6;本专栏是我关于游戏开发的笔记 &#x1f236;本篇是一个简短的小知识点 使用RawImage实现帧动画 找一个帧动画连续的图片拖到工程中&#xff0c;将Texture Type改成Sprite&#xff08;2D和UI&#xff09;&#xff0c;点击apply应用上 在工程中新建一个RawImage,将…

Centos 7.x上利用certbot申请Let‘s Encrypt的SSH证书(HTTPS证书)

目录 01-安装Certbot02-在网站的根目录依次新建文件夹.well-known和acme-challenge03-申请证书 要在CentOS 7.x上为域名申请Let’s Encrypt证书&#xff0c;你可以使用Certbot工具&#xff0c;它是一个自动化证书颁发工具&#xff0c;用于管理Let’s Encrypt证书。以下是在Cent…

【优秀毕设】基于vue+ssm+springboot的校园交友网站系统设计(附源码论文)

摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

freertos静态创建任务

在开始前先有个小插曲&#xff0c;我的keil的自动补全代码功能使用不了&#xff0c;经过查找是因为之前装51把有的文件覆盖了&#xff0c;照这篇博客就可以解决。 然后之前那份代码我们是动态创建任务&#xff0c;先来说一下动态创建任务和静态创建任务的区别&#xff1a; Fre…

电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备?

电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备? 电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备? 这里以win10系统为例进行说明: 如下图所示,打开右下角的“网络和Internet设置”, 如下图所示,点击进入“更改适配器选项”, 如下图所示…

windwos10搭建我的世界服务器,并通过内网穿透实现联机游戏Minecraft

文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …

线扫相机DALSA软件开发套件有哪些

Win10和Win7系统完整SDK目录截图&#xff1a; Sapera Configuration 缓存与内存管理&#xff0c;以及通信端口配置工具&#xff0c;部分功能等效于Detection(查找相机)内的Settings。 Sapera Log Viewer 打开Log Viewer后会显示之前发生过的所有与Sapera LT软件有关的运行信息…

CSS与基本选择器

<div class"c1" id"d1"></div> CSS基本知识 什么是css&#xff1a;CSS&#xff08;Cascading Style Sheet&#xff0c;层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表&#xff0c;他就会按照这个样式l来进行渲染。其实就是让HT…

Codeforces Round 882 (Div. 2)

目录 A. The Man who became a God 题目分析: B. Hamon Odyssey 题目分析: C. Vampiric Powers, anyone? 题目分析: A. The Man who became a God 题目分析: n个人分成k组&#xff0c;每一组的力量都是这样的&#xff0c;那么如果分成k组那么就会有k-1个力量不被统计…

【强化学习】17 ——DDPG(Deep Deterministic Policy Gradient)

文章目录 前言DDPG特点 随机策略与确定性策略DDPG&#xff1a;深度确定性策略梯度伪代码代码实践 前言 之前的章节介绍了基于策略梯度的算法 REINFORCE、Actor-Critic 以及两个改进算法——TRPO 和 PPO。这类算法有一个共同的特点&#xff1a;它们都是在线策略算法&#xff0c…

IDEA 设置代码注释模板

功能简介&#xff1a; 每次看别人代码时&#xff0c;面对毫无注释的类&#xff0c;除了头大还是头大&#xff0c; 以下提供了一种代码类注释模板 新建java类的时候&#xff0c;自动增加类注释&#xff0c;养成代码开发好习惯 效果展示&#xff1a; 代码模板&#xff1a; #if (…

时序预测 | MATLAB实现时间序列ACF和PACF分析

时序预测 | MATLAB实现时间序列ACF和PACF分析 目录 时序预测 | MATLAB实现时间序列ACF和PACF分析基本介绍程序设计参考资料基本介绍 自回归分析是线性回归分析的一种推广,主要是研究一个序列反映的自我因果关系。普通线性回归基于互相关分析,涉及两个以上的变量,一个作为因变…