STL-set和map

news2024/11/26 16:24:11

目录

一、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;//10
    cout << "Second element: " << myPair.second << endl;//3.14
    return 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 9
	return 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 13

	set<int>::iterator itlow = s.lower_bound(7);//>= val值位置的iterator
	set<int>::iterator itup = s.upper_bound(11);//>  val值位置的iterator
	cout << "*itlow: " << *itlow << "     *itup: " << *itup << endl;//7  12

	s.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;//4
	cout << *(range.second) << endl;//5
}
int main()
{
	test();
	return 0;
}

三、multiset

(一)介绍

template < class T,                        // multiset::key_type/value_type
           class Compare = less<T>,        // multiset::key_compare/value_compare
           class 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 11

	multiset<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 11

	size_t n =s.erase(2);
	print(s);//1 5 6 7 8 11
	cout << 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 11

	pair<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 11

	cout << "2出现次数:"<<s.count(2) << endl;//3
}
int main()
{
	test();
	return 0;
}

四、map

  • map是kv型数据结构

(一)map的模板参数列表

template < class Key,                                     // map::key_type
           class T,                                       // map::mapped_type
           class Compare = less<Key>,                     // map::key_compare
           class 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", "排序"));//插入匿名对象pair
	dict.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.coloradmin.cn/o/1169426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mediapipe流水线分析 一

object detection Graph 以目标检测为例分析mediapip流水线处理机制 一 流水线上游输入处理 1 Calculator 算子 它是在MediaPipe框架中用于创建插件/算子 机制的基础 在MediaPipe中&#xff0c;插件是一种可扩展的计算模块&#xff0c;可以用于实现各种不同的计算功能。calc…

路由器基础(九):防火墙基础

防火墙 (Fire Wall) 是网络关联的重要设备&#xff0c;用于控制网络之间的通信。外部网络用户的访问必须先经过安全策略过滤&#xff0c;而内部网络用户对外部网络的访问则无须过滤。现在的防火墙还具有隔离网络、提供代理服务、流量控制等功能。 一、三种防火墙技术 常见的…

努努之歌:英雄联盟外传 SongOfNunu(单人冒险游戏) 免安装中文版下载

《努努之歌&#xff1a;英雄联盟外传》是一款由Tequila Works开发的单人冒险游戏。置身于弗雷尔卓德的未知之地&#xff0c;探索扣人心弦的故事&#xff0c;一步步揭开努努和威朗普的过去&#xff0c;了解背后的真相。 游戏介绍 建立深厚友谊 扮演小男孩努努&#xff0c;在好朋…

WebGL:基础练习 / 简单学习 / demo / canvas3D

一、前置内容 canvas&#xff1a;理解canvas / 基础使用 / 实用demo-CSDN博客 WebGL&#xff1a;开始学习 / 理解 WebGL / WebGL 需要掌握哪些知识 / 应用领域 / 前端值得学WebGL吗_webgl培训-CSDN博客 二、在线运行HTML 用来运行WebGL代码&#xff0c;粘贴--运行&#xff…

Flutter 06 动画

一、动画基本原理以及Flutter动画简介 1、动画原理&#xff1a; 在任何系统的Ul框架中&#xff0c;动画实现的原理都是相同的&#xff0c;即&#xff1a;在一段时间内&#xff0c;快速地多次改变Ul外观&#xff1b;由于人眼会产生视觉暂留&#xff0c;所以最终看到的就是一个…

算法:弗洛里德算法Floyd

弗洛里德算法 简介 英文名Floyd 作用&#xff1a;寻找图中任意两点之间的最短路径 数据结构&#xff1a;邻接矩阵&#xff08;二维数组&#xff09; 思想 如果说从start到end之间转个弯能使得路径变短,那么就记录更短的路径&#xff0c; 对所有弯都试一下没到最后取最短的&am…

Zabbix监控联想服务器的配置方法

简介 图片 随着科技的发展&#xff0c;对于数据的敏感和安全大部分取决于对硬件性能、故障预判的监测&#xff0c;由此可见实时监测保障硬件的安全很重要&#xff0c;从而衍生了很多对硬件的监测软件&#xff0c;Zabbix就一个不错的选择。开源 开源 开源&#xff01; zabbix是…

SpringCloud(八) Gateway网关路由详解

目录 一, Gateway服务网关 1.1 为什么需要网关 1.2 网关的实现方式 1.3 Gateway快速入门 1. 创建gateway服务,引入依赖 2. 编写启动类 3. 编写基础配置和路由规则 4. 重启测试 5. 网关路由的流程图 6. 总结 二, Gateway断言工厂 三, 过滤器工厂 3.1 路由过滤器…

【Mysql】Mysql中表连接的原理

连接简介 在实际工作中&#xff0c;我们需要查询的数据很可能不是放在一张表中&#xff0c;而是需要同时从多张表中获取。下面我们以简单的两张表为例来进行说明。 连接的本质 为方便测试说明&#xff0c;&#xff0c;先创建两个简单的表并给它们填充一点数据&#xff1a; …

【Truffle】三、可视化测试报告的生成

在truffle中&#xff0c;我们可以引入第三方插件&#xff0c;对truffle的测试进行更好的提升&#xff0c;这里介绍两个插件&#xff0c;分别是mocha-junit-reporter和mochawesome两个插件。 一、mocha-junit-reporter插件 mocha-junit-reporter是一个用于Truffle测试框架的插件…

随机森林算法的加速:OpenMP方法

使用OpenMP加速随机森林 前言使用OpenMP对RF训练的加速代码加速效果 对特征重要性评估的加速代码 加速效果附录Windows中使用OpenMPLinux中使用OpenMP 项目主页&#xff1a;randomforest C implementation of random forests classification, regression, proximity and variab…

【德哥说库系列】-Oracle 19C PDB创建大全

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

双绞线(寻线仪,测线仪),光纤测试工具(红光笔,OTDR,光功率计)

网络测试方式&#xff1a; 根据测试中是否向被测网络注入测试流量&#xff0c;可以将网络测试方法分为主动测试和被动测试。 主动测试&#xff1a;利用测试工具有目的地主动问被测网络注入测试流量&#xff0c;根据测试流量的传送情况分析网络技术参数。优点是具备良好的灵活…

读程序员的制胜技笔记03_有用的反模式(上)

1. 教条 1.1. 一成不变的法则 1.2. 这些东西会遮蔽我们的双眼&#xff0c;你坚持相信的时间越久&#xff0c;你被遮蔽双眼的程度也就越深 2. 质疑所有教给你的东西 2.1. 它们有多么有用 2.2. 使用它们的理由 2.3. 使用它们的好处 2.4. 使用它们的代价 3. 反模式 3.1. …

13、Kubernetes核心技术 - Ingress

目录 一、概述 二、Ingress工作原理 三、Ingress 使用 3.1)、Ingress-http方式 3.1.1)、创建Ingress Controller和对应的Service 3.1.2)、创建tomcat的Pod和Service 3.1.3)、创建nginx的Pod和Service 3.1.4)、创建ingress http代理 3.1.5)、配置本地host文件 3.1.6)、…

基于STM32设计的室内环境监测系统(华为云IOT)_2023

一、设计需求 基于STM32+华为云物联网平台设计一个室内环境监测系统,以STM32系列单片机为主控器件,采集室内温湿度、空气质量、光照强度等环境参数,将采集的数据结果在本地通过LCD屏幕显示,同时上传到华为云平台并将上传的数据在Android移动端能够实时显示、查看。 【1…

更新版PHP神算网八字算命星座解梦周易占卜程序源码/PC+H5移动端整站适配/PHP源码带手机版

源码简介&#xff1a; 这个是更新版PHP神算网八字算命星座解梦周易占卜程序源码&#xff0c;能够在PCH5移动端整站适配。作为H5付费算命PHP源码&#xff0c;八字算命网站源码&#xff0c;功能很多强大实用。 2023.3 更新记录&#xff1a; 1、更新了23年属相信息&#xff1b;…

12 pinctrl 和 gpio 子系统

一、pinctrl 子系统 1. 什么是 pinctrl 子系统&#xff1f; 首先回顾一下如何初始化 LED 所使用的 GPIO&#xff1a; ①、修改设备树&#xff0c;添加相应的节点&#xff0c;节点里面重点是设置 reg 属性&#xff0c; reg 属性包括了 GPIO相关寄存器。 ②、获取 reg 属性中 …

基于顺序表实现的可存储性通讯录!!!

基于顺序表实现的通讯录 通讯录的基本功能 顺序表顺序表的部分变量修改修改处一修改处二修改处三 头文件 Contact.h通讯录自定义结构体 功能实现 源文件 Contact.c读取文件中联系人的信息 void ContactReadFile(contact* pcon)保存到文件 void ContactSave(contact* pcon) 测试…

Python:知道什么叫类吗,我这人实在不知道啥叫累。Python类的定义和使用。

前言 在 python 中&#xff0c;对于相同类型的对象进行分类&#xff0c;抽象后&#xff0c;得出共同的特征而形成了类&#xff08;class&#xff09;&#xff0c;面向对象程序设计的关键就是如何合理地定义这些类并且组织多个类之间的关系。 创建类时用变量形式表示对象特征的…