关于map容器的一些函数和用法(附真题实战)

本文介绍了一名大学生的技术博主分享其学习过程,着重讲解了C++中的map容器,包括其数据结构、一对一映射关系以及如何使用迭代器进行遍历。作者还提到在学习Java框架和算法的同时,计划分享更多关于算法和竞赛函数的内容。
摘要由CSDN通过智能技术生成

每一个点开我的文章的小伙伴大家好!

在发这篇文章的时候,我是一名大二的学生,我将在博客记载我的学习之路!

这是我的第十四篇博客文章,这是关于C++的map容器的文章,主要介绍竞赛常用的容器

        前言:最近更新文章比较少,因为我在学习后端开发的一些知识,比如说Spring、Springboot、Maven等基于JAVA语言的框架,学习了一些进阶算法,比如回溯算法、动态规划等算法思想。我打算开一个栏目专门讲讲算法思想和竞赛函数,希望如果有志同道合的C++友们能和我交流交流!

介绍一下map容器:


map映射容器的元素数据是由一个键值和一个映射数据组成的,键值与映照数据之间具有一一映照的关系。

map容器的数据结构也采用红黑树来实现的,插入元素的键值不允许重复,比较函数只对元素的键值进行

比较,元素的各项数据可通过键值检索出来。由于map与set采用的都是红黑树的结构,所以,用法基本相似。

找到一个可以描述键值对应的图:

其中,键值和它的映照数据是一一对应的,不能说一个键值Jack对应98.5 和98两个值。

下面我们开始对map容器进行代码的描述和解读:

首先就是定义一个map容器:

map<typename1, typename2> m;   typename1是键的类型,typename2是值的类型
如果是字符串到整型的映射,必须使用string而不能用char数组   map<string, int> m;
再举个栗子例子:map的键和值也可以是STL容器,例如以下代码将一个set容器映射到一个字符串:map<set<int>, string> mp;

先定义<int int >的:  意思就是,键值是int型,映射数据也是int型

//定义一个map,名称为m 
	map<int, int>m;   
	for (int i = 0; i < 19; i++)
	{
		m[i] = 2 * i + 3;
	}

此时我们定义好了一个容器,并且往容器中填了19个数据,此时我们想形象的把他们的关系表达出来,就像这张图

我们可以遍历map容器然后分别输出它的键值和映射数据,但是我们需要用到C++中迭代器,迭代器和C语言中的指针非常类似,但是功能更加多,下面是我找到的关于迭代器的介绍:

什么是迭代器(iterator)
迭代器(iterator)是一种可以遍历容器元素的数据类型。
迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。
C++更趋向于使用迭代器而不是数组下标操作,
因为标准库为每一种标准容器(如vector、map和list等)定义了一种迭代器类型,
而只有少数容器(如vector)支持数组下标操作访问容器元素。
可以通过迭代器指向你想访问容器的元素地址,通过*x打印出元素值。
这和我们所熟知的指针极其类似。

了解完迭代器之后,我们开始遍历map容器:

其中,迭代器 it->first 代表的是 it 指向的键值,it->second 代表的是 it 指向的映射数据

//定义迭代器  it  类似指针
	map<int, int>::iterator it;
	for (it=m.begin();it!=m.end();it++)
	{
		cout << "键值" << it->first << "的元素为:" << it->second << endl;
	}

遍历结果:

我们不光可以定义一个<int int>的,还可以定义<string int>  字符串到整型的映射:

//定义一个字符串到整型的映射
	map<string, int>p;
	p["fsa"] = 3;
	p["ad"] = 2;
	p["cjkaxx"] = 9;
	p["asdcc"] = 10;

接着遍历map:

map<string, int>::iterator in;
	for(in=p.begin();in!=p.end();in++)
		cout << "键为" << in->first << "的元素为:" << in->second << endl;

相信看到这里,map容器在你大脑里已经有了一个初步的印象

接下来我们运用map容器可以解决一些题目,这里我就用一道学校oj的题目作为例子:

题目要求如果出现至少三次,那就输出YES。

测试用例:

4
3
1 1 1
5
9 10 9 3 9
4
1 2 3 4
3
1000000000 -1000000000 1000000000

这题很适合用map容器来做,为什么这么说呢,因为出现的每一种数据,我们都可以把它以键值的形式存储起来,然后出现的次数作为映射的数据。这样一看是不是就很简单了。

#include<iostream>
#include<map>

using namespace std;

int main()
{
	
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int m;
		cin >> m;
		map<int, int>ma;   //定义map容器
		for (int j = 0; j < m; j++)
		{
			int x;
			cin >> x;
			ma[x]++;       //ma[x] 中的 x 其实就是键值  ma[x]整体代表的是键值 x 的映射数据
		}
		bool flag = false;
		for (auto y : ma)  
		{
			if (y.second >= 3)
			{
				flag = true;
			}
		}
		cout << (flag ? "YES" : "NO") << endl;

	}
}

结果:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值