关于map的简单用法

在使用map的时候需要添加头文件 #include< map >
map一般配合着pair(也是一个模板类),pair类似于数学中的函数,一双一对,一对一的关系

1.map和pair的构造
map<数据类型1,数据类型2>名称 , 例如 :
map< int , int >mp;
map< int , vector< int >>mp;

数据类型不止c++自有的,还有自定义的,比如说class Student等

pair<数据类型1,数据类型2>名称,例如 : pair< int , int>x;

map相当于是pair的集合

2.map和pair的数据插入
对于map而言,有三种方式 :
(1)采用insert函数将pair数据插入到map中 :

mp.insert(x);

(2)采用insert函数插入value_type数据 :

mp.insert(map<string, int>::value_type("123", 123));

ps : 采用 insert() 方法的时候 , 如果关键字存在,则会报错

(3)采用数组的方式插入数据(迭代器的使用) :

#include <map>  
#include <string>  
#include <iostream>  
using namespace std;  
int main()  
{  
       map<int, string> mapStudent;  
       mapStudent[1] =  "student_one";  
       mapStudent[2] =  "student_two";  
       mapStudent[3] =  "student_three";  
       map<int, string>::iterator  iter;  
       for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
       {  
          cout<<iter->first<<"   "<<iter->second<<endl;  
       }  
}  

对于pair中的,第一个数据可以相当于索引,第二个元素是该索引对应的值

pair中的 first 相当于是关键字,而当关键字存在的时候 insert 函数是不能将之前的 second值覆盖,想要覆盖掉的话就只能用数组的方式去插入(插入方法的区别

扫描二维码关注公众号,回复: 8876064 查看本文章

3.map的相关函数
(1)size函数,用于返回现在的map的大小 (就是有map里多少pair)
(2)count函数,用于判断该关键字是否出现过,返回0或者1
(3)find函数,用于找到该关键字的位置,找到时返回关键字所在位置的迭代器,没有 找到时返回end函数的迭代器
(4)clear函数,用于清空map
(5)empty函数,用于判断map是否为空
(6)erase函数,用法详解

#include <map>  
#include <string>  
#include <iostream>  
using namespace std;  
int main()  
{  
       map<int, string> mapStudent;  
       mapStudent.insert(pair<int, string>(1, "student_one"));  
       mapStudent.insert(pair<int, string>(2, "student_two"));  
       mapStudent.insert(pair<int, string>(3, "student_three"));  
       //如果你要演示输出效果,请选择以下的一种,你看到的效果会比较好  
       //如果要删除1,用迭代器删除  
       map<int, string>::iterator iter;  
       iter = mapStudent.find(1);  
       mapStudent.erase(iter);  
       //如果要删除1,用关键字删除  
       int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0  
       //用迭代器,成片的删除  
       //一下代码把整个map清空  
       mapStudent.earse(mapStudent.begin(), mapStudent.end());  
       //成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合  
     //自个加上遍历代码,打印输出吧  
}  

 begin()         返回指向map头部的迭代器
 end()           返回指向map末尾的迭代器
 equal_range()   返回特殊条目的迭代器对
 get_allocator() 返回map的配置器
 insert()        插入元素
 key_comp()      返回比较元素key的函数
 lower_bound()   返回键值>=给定元素的第一个位置
 max_size()      返回可以容纳的最大元素个数
 rbegin()        返回一个指向map尾部的逆向迭代器
 rend()          返回一个指向map头部的逆向迭代器
 swap()          交换两个map
 upper_bound()   返回键值>给定元素的第一个位置
 value_comp()    返回比较元素value的函数

C++ maps是一种关联式容器,包含"键-值"对

应用举例 :
题目1 :
给定一篇只含有由小写字母组成的文章,要求输出总单词数(相同的单词只算一次)。随后有多次询问,每 次询问一个单词,要求输出单词在文章中出现的次数。
输入格式 :
第一行两个整数n,m,分别表示文章中单词数和询问的次数。
第二行一个字符串,表示要处理的文章(文章中只含有小写字母及空格,不含任何标点符号)。
接下来m行,每行一个只含小写字母的字符串,表示被询问的单词。
输出格式 :
第一行输出一个正整数,表示文章中的总单词数(相同的单词只算一次)。
接下来m行,每行一个自然数,表示被询问单词在文章中出现的次数,若单词不存在,则输出0。

题目分析 :
经过分析可知,题目中要求表示的数据有两个,一个是单词,另一个是该单词对应的出现次数,而且不止有一个单词,是一篇文章的多个不重复单词,所以很符合 map 的用法,可以将 string 类型的单词作为关键字,而出现的次数作为它的值(属于一 一对应的函数关系)

#include<iostream>
#include<map>
#include<string>
using namespace std;

int main() {
	string str;
	int n,m;
	cin >> n >> m;
	map<string, int>mp;
	for (int i = 0; i < n; i++) {
		cin >> str;
		mp[str]++;
	}
	cout << mp.size() << endl;
	for (int i = 0; i < m; i++) {
		cin >> str;
		cout << mp[str] << endl;
	}
	return 0;
}
//ps当使用数组方式插入数据时,如果索引存在,那么把之前的值覆盖掉,如果索引不存在,那么将初始化该索引
//这里的索引就是关键字,也就是上文的单词 str
发布了3 篇原创文章 · 获赞 4 · 访问量 166

猜你喜欢

转载自blog.csdn.net/qq_45836635/article/details/104064572