c++中map用法

map的特性是,所有元素都会根据元素的减值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素会被视为键值,第二个元素会被视为实值。map不允许两个元素拥有相同的键值。

map的基本构造函数

  • map<string,int>strMap;

  • map<int ,string>intMap;

  • map<string, char>strMap;

  • map< char ,string>charMap;

  • map<char, int>charMap;

  • map<int , char >intMap;

map添加元素

map<int ,string> maplive;

  1. pair<int,string> value(1,"a");maplive.insert(value);

​ 等价于maplive.insert(pair<int,string>(1,"a"));

  1. maplive.insert(map<int,string>::value_type(1,"a"));
  2. maplive[1]="a";//map中最简单最常用的插入添加!

map的基本操作函数

 begin() 返回指向map头部的迭代器

 clear() 删除所有元素

count()          返回指定元素出现的次数

empty()          如果map为空则返回true

end()            返回指向map末尾的迭代器

equal_range()    返回特殊条目的迭代器对

erase()          删除一个元素

find()           查找一个元素

get_allocator()  返回map的配置器

insert()         插入元素

key_comp()       返回比较元素key的函数

lower_bound()    返回键值>=给定元素的第一个位置

max_size()       返回可以容纳的最大元素个数

rbegin()         返回一个指向map尾部的逆向迭代器

rend()           返回一个指向map头部的逆向迭代器

size()           返回map中元素的个数

swap()            交换两个map

upper_bound()     返回键值>给定元素的第一个位置

value_comp()      返回比较元素value的函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;

int main(){
map<string,int> strMap; //以string为键值,以int为实值
strMap[string("jjhou")] = 1;
strMap[string("jerry")] = 2;
strMap[string("jason")] = 3;
strMap[string("jimmy")] = 4;

pair<string,int> value(string("david"),5);
strMap.insert(value);//插入新元素

//遍历操作
for(map<string,int>::iterator it = strMap.begin();it !=strMap.end();it++)
{
//first为键,second为值
cout<<it->first<<' '<<it->second<<endl;
}
cout<<endl;

int number = strMap[string("jjhou")];
cout<<number<<endl;
cout<<endl;

//查找元素
map<string,int>::iterator iter1;
//面对关联式容器,应该使用其所提供的find函数来搜索元素,会比使用STL算法find()更有效率。因为STL算法find()只是循环搜索。
iter1 = strMap.find(string("mchen"));
if(iter1 == strMap.end())//找不到默认为末尾
cout<<"mchen no fount"<<endl;
cout<<endl;

iter1 = strMap.find(string("jerry"));
if(iter1 != strMap.end())
cout<<"jerry fount"<<endl;
cout<<endl;

//修改实值,键值不可修改
iter1->second = 9; //可以通过map迭代器修改“value”(not key)
int number1 = strMap[string("jerry")];
cout<<number1<<endl;

//删除元素
for(map<string,int>::iterator it = strMap.begin();it !=strMap.end();it++)
{
cout<<it->first<<' '<<it->second<<endl;
}
cout<<endl;

strMap.erase(iter1);//删除一个条目
strMap.erase(string("jason"));//根据键值删除

map<string,int>::iterator strmap_iter2 = strMap.begin();
for(;strmap_iter2 !=strMap.end();strmap_iter2++)
{
cout<<strmap_iter2->first<<' '<<strmap_iter2->second<<endl;
}
return 0;
}

map用的最多的还是key排序和value排序。这里我们重点讲value排序。

我们可能想到要用sort函数来排序,但是直接用的话又不可以,

这里我们就需要用vector来进行排序.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include <vector>
#include<string>
#include<map>
#include <functional> // std::greater
using namespace std;


bool cmp(const pair<string, int>& a, const pair<string, int>& b) {//对成绩进行排序
return a.second < b.second;
}

int main()
{
//1、map这里指定less作为其默认比较函数(对象),就是默认按键值升序排列
map<string, int> name_score_map;
name_score_map["LiMin"] = 90;
name_score_map["ZiLinMi"] = 79;
name_score_map["BoB"] = 92;
name_score_map.insert(make_pair("Bing", 99));
name_score_map.insert(make_pair("Albert", 86));

//输出添加的内容
map<string, int>::iterator iter;
for (iter = name_score_map.begin(); iter != name_score_map.end(); ++iter) {
cout << (*iter).first << endl;
}
cout << endl;

// 将map中的内容转存到vector中
vector<pair<string, int>> vec(name_score_map.begin(), name_score_map.end());
//对线性的vector进行排序
sort(vec.begin(), vec.end(), cmp);
for (int i = 0; i < vec.size(); ++i)
cout << vec[i].first << endl;

system("pause");
return 0;
}

理解之后,我们可以看下下面的题:

题目链接

题目描述

世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,AA市对 所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根 据计划录取人数的150%150%划定,即如果计划录取mm名志愿者,则面试分数线为排名第m×150%m×150% (向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有 选手。

现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。

输入输出格式

输入格式:

第一行,两个整数 n,m(5≤n≤5000,3≤m≤n)n,m(5≤n≤5000,3≤mn),中间用一个空格隔开,其 中nn表示报名参加笔试的选手总数,mm表示计划录取的志愿者人数。输入数据保证 m×150% 向下取整后小于等于 n。

第二行到第 n+1n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号 k(1000≤k≤9999)k(1000≤k≤9999)和该选手的笔试成绩s(1≤s≤100)s(1≤s≤100)。数据保证选手的报名号各不相同。

输出格式:

第一行,有22个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。

从第二行开始,每行包含22个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。

输入样例:

6 3
1000 90
3239 88
2390 95
7231 84
1005 95
1001 88

输出样例:

88 5
1005 95
2390 95
1000 90
1001 88
3239 88

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;

bool cmp(const pair<int, int>& a, const pair<int, int>& b) {//排序,分数相同就比较序号
if(a.second==b.second)
return a.first>b.first;
else return a.second < b.second;
}

int main()
{
int n,m,cnt=0;
cin >> n>>m;
int a[n],b[n];
map<int,int>p;
for(int i=0;i<n;i++){
cin >> a[i]>>b[i];
p[a[i]]=b[i];
}
vector<pair<int,int> >sore(p.begin(),p.end());
sort(sore.begin(),sore.end(),cmp);
int link=floor((m-1)*1.50);
int fenlink = sore[n-link-1].second;//已经按照从小到大排序了,但是题目要求是从大到小.
for(int i=0; i<sore.size(); i++){
if(sore[i].second >= fenlink) {
cnt++;
}
}
cout << fenlink << " "<< cnt << endl;
for(int i=sore.size()-1;i>=0;i--){
if(sore[i].second >= fenlink) {
cout << sore[i].first << " "<<sore[i].second << endl;
}
}
return 0;
}