每一个点开我的文章的小伙伴大家好!
在发这篇文章的时候,我是一名大二的学生,我将在博客记载我的学习之路!
这是我的第十四篇博客文章,这是关于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;
}
}
结果: