在使用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值覆盖,想要覆盖掉的话就只能用数组的方式去插入(插入方法的区别)
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