zoukankan      html  css  js  c++  java
  • C++ STL map(映射)

    头文件#include<map>,当然,万能库就不用我多说了吧。。

    介绍:map容器是一个键 (key) 到值 (value) 的映射。因为重载了 [ ] 运算符,map像是数组的“高级版”。map的key和value可以是任意类型,其中key必须定义“小于号”运算符。例如可以用一个map <string,int> month_name 来表示“月份名字到月份编号”的映射,然后用month_name["July"]=7;这样的方式来赋值。

    声明

    map<key_type,value_type>name;
    
    

    例如:

    map<long long,bool>vis;
    map<string,int>hash;
    map<pair<int,int>,vector<int>>test;
    

    在很多时候,map容器被当作Hash表使用,建立从复杂信息key(如字符串)到简单信息 value(如一定范围内的整数)的映射。
    因为map基于平衡树实现,所以它的大部分操作的时间复杂度都在(O(log n))级别,略慢于使用 Hash函数实现的传统Hash表。从C++11开始,STL中新增了 unordered_map 等基于Hash的容器,但部分算法竞赛并不支持C++11标准,这里就不再介绍这些新容器。

    size/empty/clear/begin/end
    与set类似,分别为元素个数、是否为空、清空、首迭代器、尾迭代器。

    迭代器
    map 的迭代器和 set 一样,也是“双向访问迭代器”。对 map 的迭代器解除引用后,将得到一个二元组 pair<key_type,value_type>

    insert/erase
    与set类似,分别为插入、删除。insert的参数是pair<key_type,value_type> ,erase的参数可以是pair或者迭代器。

    map<int,int > h;
    h.insert(make_pair(1,2)),h.insert(make_pair(2,3));
    map<int,int > :: iterator it=h.begin();
    pair<int,int > p=*it;
    h.erase(it),h.erase(make_pair(2,3));
    cout<<p.first<<' '<<p.second<<endl;
    

    find
    h.find(x) 在变量名为h 的map 中查找key 为 x 的二元组,并返回指向改二元组的迭代器。若不存在,返回h.end()。时间复杂度为 (O(log n))

    [ ] 操作符
    h[key]返回key映射到的value的引用,时间复杂度为(O(log n))
    [ ]操作符是map最吸引人的地方。我们可以很方便地通过 h[key] 来得到 key 对应的value,还可以对 h[key] 进行赋值操作,改变key对应的value。
    需要特别注意的是,若查找的key不存在,则执行 h[key] 后,h会自动新建一个二元组(key,zero),并返回zero的引用。这里zero表示一个广义“零值”,如整数0、空字符串等。如果查找后不对 h[key] 进行赋值,那么时间一长,h 会包含很多无用的“零值二元组”,白白地占用了空间,降低了程序运行效率。强烈建议读者在用 [ ] 操作符查询之前,先用 find 方法检查 key 的存在性。

    [实例] 用map统计字符串出现的次数
    给定 n 个字符串,m 个问题,每个问题询问一个字符串出现的次数。
    n<=20000,m<=20000,每个字符串的长度都不超过20.

    map<string,int> h;
    char str[25];
    for(int i=1;i<=n;i++){
    	scanf("%s",str);
    	h[str]++;
    }
    for(int i=1;i<=m;i++){
    	scanf("%s",str);
    	if(h.find(str)==h.end())puts("0");
    	else printf("%d
    ",h[str]);
    }
    

    提示
    set头文件中的set和map头文件中的map分别是集合和映射。二者都支持insert、find、count和remove操作,并且可以按照从小到大的顺序循环遍历其中的元素。map还提供了“[ ]”运算符,使得 map 可以像数组一样使用。事实上,map 也称为“关联数组”。

  • 相关阅读:
    670. Maximum Swap
    653. Two Sum IV
    639. Decode Ways II
    636. Exclusive Time of Functions
    621. Task Scheduler
    572. Subtree of Another Tree
    554. Brick Wall
    543. Diameter of Binary Tree
    535. Encode and Decode TinyURL
    博客园自定义背景图片
  • 原文地址:https://www.cnblogs.com/Luvwgyx/p/8456320.html
Copyright © 2011-2022 走看看