STL Practice —— 【map (1)】

Description

给出学生姓名和分数,要求你输入姓名查询分数。

Input

输入包含T组测试数据。

开头是一个正整数T (0<T<10),为测试数据数量。

对于每组测试数据,第一行是一个正整数N (0<N<=100000)。

接下来有N行,每行包含一个姓名和一个分数,姓名长度不超过50个字符,分数为整数,范围在[0, 100]之内,两者用空格隔开。

接下来一行是一个正整数Q (0<Q<=5000) 代表查询次数。接下来有Q行,每行包含一个姓名,系统保证输入的每个姓名都是不同的。

Output

对于每次查询,输出对应的分数,若该学生不存在,则输出“error”。

Samples

input Copy

1 5

cjc 58

loy 59

zl 92

ydw 80

zz 100

3

cjc

loy

wzj

output Copy

58

59

error

#include <stdio.h>
#include <string.h>
#include <map>
#include <iostream>
using namespace std; 
void print(map<string,int>mp);
struct chaxu
{
    char name[51];
    int s;
};
char w[1000];
map<string,int>mp;
map<string,int>mp2;
struct chaxu p[100000];
int main(void)
{
    int t,n,m;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        scanf("%d",&n);
        getchar();
        for(int i=0;i<n;++i)
        {
            scanf("%s %d",&p[i].name,&p[i].s);
            mp2[p[i].name]++;
            getchar();
        }
        for(int i=0;i<n;++i)
        {
            mp[p[i].name]=p[i].s;
        }
        scanf("%d",&m);
        getchar();
        while(m--)
        {
            gets(w);
            if(mp2[w]!=0) cout<<mp[w]<<endl;
            else if(mp2[w]==0) printf("error\n");
        }
    //    print(mp);
        mp.clear();
    }
    return 0;
}
void print(map<string,int>mp)
{
    for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++)
    {
        cout<<"key的值为"<<(*it).first<<" value: "<<(*it).second<<endl; 
    }
}

//这道题就是如果能用字符串当下表就好了,所以自然而然的就想到了map,map只知道一些基本用法,如逆序输出

map<int,int>mp;

map<int,int>::reverse_iterator it;

for(it=mp.rbegin();it!=rend;it++)

还是it->first it->second;

然后你想试试用map和不用map的时间差

有一个时间函数是计算时间用的

#include <time.h>

clock_t start,stop;

printf("%e\n",(double)clock()/CLOCKS_PER_SEC);

至于为什么要用这个%e,是因为他的精度高啊,加油。

热门文章