STL之map篇

度熊所居住的 D 国,是一个完全尊重人权的国度。以至于这个国家的所有人命名自己的名字都非常奇怪。一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字。例如,如果一个人名字是 ACM,那么 AMC, CAM, MAC, MCA, 等也都是这个人的名字。在这个国家中,没有两个名字相同的人。

度熊想统计这个国家的人口数量,请帮助度熊设计一个程序,用来统计每一个人在之前被统计过多少次。

Input

这里包括一组测试数据,第一行包含一个正整数N,接下来的N 行代表了 N个名字。N 不会超过100,000,他们的名字不会超过40位.

Output

对于每输入的一个人名,输出一个整数,代表这个人之前被统计了多少次。

Sample Input

5
ACM
MAC
BBA
ACM
BAB

Sample Output

0
1
0
2
1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<string>
#include<iterator>
using namespace std;
bool compare(char c1,char c2)
{
    return c1 <= c2;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        map<string,int> msi;
        for(int i=0;i<n;++i)
        {
            char temp[45];
            scanf("%s",temp);
            sort(temp,temp+strlen(temp),compare);
            string str(temp);
            //使用find来判断map中是否含有该key
            map<string,int>::iterator it = msi.find(str);
            if(it==msi.end())
            {
                //使用pair来判断是否插入成功
                pair<map<string,int>::iterator,bool> res = msi.insert(pair<string,int>(str,0));
                if(res.second==true)
                {
                    cout<<"OK"<<endl;
                }
                else
                {
                    cout<<"FALSE"<<endl;
                }
            }
            else
            {
                msi[str]++;
            }
            printf("%d\n",msi[str]);
        }

    }
    return 0;
}

1.如何判断map插入成功或者失败:pair<map<string,int>::iterator,bool> res = msi.insert(pair<string,int>(key,value)); res.second的值

2.如何判断map中是否包含某key:map<string,int>::iterator it = msi.find(key);   判断it == msi.end();

3.msi[key] = value;如果key没有被insert过,会通过该式子进行insert。

时间: 2024-08-26 05:17:49

STL之map篇的相关文章

STL之map容器的详解

一.关于map的介绍 map是STL的 一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键 字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据.这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.学习map我们一定要理解什么是一对一的数据映射?比如:一个班级中,每个学生的学号跟他的姓名

STL 之 map的用法

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道.这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处. 下面举例说明什么是一对一的数据映射.比如一个班级中,每个学生的学号跟他的姓名就存在着一一

STL中map容器使用自定义key类型报错详解

引言 STL的map容器中,key的类型是不是随意的呢? 实践 编写测试代码 定义一个结构体来试试: struct a { char* pName; int m_a; }; map<a, int> mp; a a1; a1.m_a = 100; a1.pName = "a1"; a a2; a2.m_a = 200; a2.pName = "a2"; mp.insert(std::make_pair(a1, 1)); mp.insert(std::mak

STL学习——Deque篇

STL学习--Deque篇 deque概述 deque是一种双向开口的连续线性空间.双向开口指可以在头尾两端分别做元素的插入和删除操作.虽然vector也可以在头尾两端进行操作,但是其头部操作效率极差,无法被接受. deque与vector最大差异:1)deque允许于常数时间内对起头端进行元素的插入或移除操作:2)deque没有所谓的容量概念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并连接起来.deque不提供所谓的空间保留功能,不存在重新配置,移动数据,释放原空间操作.

C++ STL中Map的按Key排序和按Value排序

原文  http://blog.csdn.net/iicy266/article/details/11906189 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学

HDU Bombing (STL multiset+map)

题意:给你 n 个坐标(x,y),m 个询问(c,d) c==0,求出x==d有多少个,并删除这些点: c==1,求出y==d有多少个,并删除这些点. map+multiset的多重映射 #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cmath> #include<iostream>

STL中map与hash_map容器的选择

[转]STL中map与hash_map容器的选择 先看看alvin_lee 朋友做的解析,我觉得还是很正确的,从算法角度阐述了他们之间的问题! 实际上这个问题不光C++会遇到,其他所有语言的标准容器的实现及选择上都是要考虑的.做应用程序你可能觉得影响不大,但是写算法或者核心代码就要小心了.今天改进代码,顺便又来温习基础功课了. 还记得Herb Sutter那极有味道的<C++对话系列>么,在其中<产生真正的hash对象>这个故事里就讲了map的选择.顺便回顾一下,也讲一下我在实用中

STL中map与hash_map的比较

1. map : C++的STL中map是使用树来做查找算法; 时间复杂度:O(log2N) 2. hash_map : 使用hash表来排列配对,hash表是使用关键字来计算表位置; 时间复杂度:O(1), 最坏的时间复杂度:O(n) 总体来说:hash_map 比 map 查找速度快,而且查找速度基本和数据量大小无关,属于常数级别,节省一定内存,如果没有必要排序的话,尽量使用 hash_map . 注:hash还有hash函数的耗时.当有100w条记录的时候,map也只需要20次的比较,20

STL 之map解决 Message Flood(原字典树问题)

Message Flood Time Limit:1500MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description Well, how do you feel about mobile phone? Your answer would probably be something like that "It's so convenient and benefits people a lot".