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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(四)docker:为mysql和java jar运行环境创建同一网络,容器互联

看了很多资料&#xff0c;说做互联的一个原因是容器内ip不固定&#xff0c;关掉重启后如果有别的容器启动&#xff0c;之前的ip会被占用&#xff0c;所以做互联创建一个网络&#xff0c;让几个容器处于同一个网络&#xff0c;就可以互联还不受关闭再启动ip会改变的影响&#xf…

ArcGIS for Android 禁止地图旋转

ArcGIS for Android 禁止地图旋转 话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; public class LoadMap extends AppCompatActivity {// 地图private MapView mapView;private ArcGISMap map;Overrideprotected void onCreate(Bundle savedInstanceSta…

Ubuntu 系统内核 kernel panic

Ubuntu 系统内核 kernel panic 不能进入系统&#xff1a;报错end kernel panic -not syncing: attemped to kill init! exit code 0x00000100 系统启动的时候&#xff0c;按下‘e’键进入grub编辑界面&#xff0c;编辑grub菜单&#xff0c;选择“kernel /vmlinuz-XXXXro root…

听听ChatGPT对IT行业的发展和就业前景的看法

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:PYTHON学习系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 (1)判断素数 写法1: 写法2: (2)计算1-100的偶数之和 写法1: 写法2: (3)计算1-100的奇数之和 (4)多层循环 IT行业哪个方向比较…

k8s 多网卡方案multus

kubernetes 多网卡方案之 Multus_CNI 部署以及基本使用 一、multus cni 出现的背景 在k8s的环境中启动一个容器&#xff0c;默认情况下只存在两个虚拟网络接口&#xff08;loopback 和 eth0&#xff09;&#xff0c; loopback 的流量始终都会在本容器内或本机循环&#xff0c…

【中国知名企业高管团队】系列57:康佳KONKA

今天开始&#xff0c;华研荟为大家介绍中国电视行业的知名企业&#xff0c;接下来三天介绍位于深圳的电视三巨头&#xff0c;这三巨头以电视机研发、生产和销售起步&#xff0c;2000左右生产过非智能手机&#xff0c;但是在互联网时代被小米们抢走了电视和手机的很大一部分市场…

【音视频 | opus】opus编解码库(opus-1.4)详细介绍以及使用——附带解码示例代码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

《动态顺序表》的实现

目录 前言&#xff1a; 认识线性表&#xff1a; 关于顺序表 实现动态顺序表&#xff1a; 顺序表的动态存储定义&#xff1a; 初始化顺序表&#xff1a; 顺序表的销毁&#xff1a; 尾插&#xff1a; 判断是否需要扩容&#xff1a; 总代码&#xff1a; 头插&#xff1a…

C++——类和对象(中)完结

赋值运算符重载 运算符重载 C 为了增强代码的可读性引入了运算符重载 &#xff0c; 运算符重载是具有特殊函数名的函数 &#xff0c;也具有其 返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型与参数列表与普通的函数类似。 函数名字为&#xff1a;关键…

父子进程之间的等待(wait和waitpid的介绍+原理),status的介绍+恢复退出码(位运算+宏),非阻塞等待(宏),signal查看

目录 父子进程之间的等待 介绍 为什么要有等待 内存泄漏 如何等待 介绍 pid_t wait (int* status) 介绍 status指针 示例 ​编辑 pid_t waitpid (pid_t pid,int* status,int options) pid options WNOHANG -- 非阻塞等待 示例 status 查看status status问题 …

Mybatis与Mybatis-Plus(注解与Xml)(单表与多表)

准备工作 这里我们准备了两个与数据库表对应的实体类&#xff0c;stu为学生表&#xff0c;cls为班级表 类属性上的注解如 TableId等 为Mybatis-Plus的注解&#xff0c;使用mybatis会无视掉这些注解 在Stu 类的最后一个属性我们定义了Cls实体类的对象&#xff0c;对于单表查询&…

EASYX输出文字

在EASYX中绘制出字符串和字符 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define PI 3.14、 //…

Windows 下编译 TensorFlow 2.9.1 CC库

参考 Intel 的 tensorflow 编译指导&#xff0c;不过项目还是可以用 TF原本的&#xff0c;不是一定要选择Intel 的TF版本。 安装 MSVC 2019 安装 Intel OneDNN OneMKL 似乎也可以不安装 ( & ) https://www.intel.cn/content/www/cn/zh/developer/articles/tool/one…

算法随想录算法训练营第四十七天| 647. 回文子串 516.最长回文子序列

647. 回文子串 题目&#xff1a;给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字…

开发知识点-PHP从小白到拍簧片

从小白到拍簧片 位异或运算&#xff08;^ &#xff09;引用符号(&)strlen() 函数base64_encode预定义 $_POST 变量session_start($array);操作符php 命令set_time_limit(7200)isset()PHP 命名空间(namespace)new 实例化类extends 继承 一个类使用另一个类方法error_reporti…

【C语法学习】16 - fclose()函数

文章目录 1 函数原型2 参数3 返回值4 示例 1 函数原型 fclose()&#xff1a;关闭已打开的文件&#xff0c;并刷新缓冲区&#xff0c;函数原型如下&#xff1a; int fclose(FILE *stream);2 参数 fclose()函数只有一个参数stream&#xff1a; 参数stream是一个指向FILE类型结…

Daily neaty和希亦内衣洗衣机哪款好,高性价比内衣洗衣机测评

现在市面最火的小家电莫过于是内衣洗衣机&#xff0c;那么它是否真的好用还是只是智商税呢&#xff1f;但关于内衣洗衣机&#xff0c;很多小伙伴都会选入手来释放自己的双手的&#xff0c;现在内衣洗衣机品牌众多&#xff0c;而且Daily neaty和希亦CEYEE-ACE这两个大品牌会被许…

【漏洞复现】Apache_HTTPD_换行解析漏洞(CVE-2017-15715)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、深度利用GetShell 1.6、修复建议 说明内容漏洞编号CVE-2017-15715漏洞名称Ap…

京东数据平台:2023年9月京东智能家居行业数据分析

鲸参谋监测的京东平台9月份智能家居市场销售数据已出炉&#xff01; 9月份&#xff0c;智能家居市场销售额有小幅上涨。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年9月&#xff0c;京东平台智能家居的销量为37万&#xff0c;销售额将近8300万&#xff0c;同比增…

如何理解所谓的【指令执行速度】

公式&#xff1a; 指令执行速度 主频/平均CPI 先不看主频&#xff0c;如下图&#xff0c;假设一秒钟能有4个正弦波&#xff0c;那就说明频率是4。 而计算机很厉害&#xff0c;一秒能有很多个正弦波 把一个正弦波&#xff0c;看做一个时钟周期 则主频表示&#xff0c;计算机…