zoukankan      html  css  js  c++  java
  • ACM/ICPC竞赛

    08篇 ACM/ICPC竞赛之STL--map

    STL的头文件<map>中定义了模板类mapmultimap,用有序二叉树来存贮类型为pair<const Key, T>的元素对序列。序列中的元素以const Key部分作为标识,map中所有元素的Key值都必须是唯一的,multimap则允许有重复的Key值。

    可以将map看作是由Key标识元素的元素集合,这类容器也被称为“关联容器”,可以通过一个Key值来快速确定一个元素,因此非常适合于需要按照Key值查找元素的容器。

    map模板类需要四个模板参数,第一个是键值类型,第二个是元素类型,第三个是比较算子,第四个是分配器类型。其中键值类型和元素类型是必要的。

    map的基本操作有:

    1、定义map对象,例如:

        map<string, int> m;

    2、向map中插入元素对,有多种方法,例如:

        m[key] = value;

        [key]操作是map很有特色的操作,如果在map中存在键值为key的元素对,则返回该元素对的值域部分,否则将会创建一个键值为key的元素对,值域为默认值。所以可以用该操作向map中插入元素对或修改已经存在的元素对的值域部分。

        m.insert( make_pair(key, value) );

        也可以直接调用insert方法插入元素对,insert操作会返回一个pair,当map中没有与key相匹配的键值时,其first是指向插入元素对的迭代器,其secondtrue;若map中已经存在与key相等的键值时,其first是指向该元素对的迭代器,secondfalse

    3、查找元素对,例如:

        int i = m[key];

        要注意的是,当与该键值相匹配的元素对不存在时,会创建键值为key的元素对。

        map<string, int>::iterator it = m.find(key);

        如果map中存在与key相匹配的键值时,find操作将返回指向该元素对的迭代器,否则,返回的迭代器等于mapend()(参见vector中提到的beginend操作)。

    4、删除元素对,例如:

        m.erase(key);

        删除与指定key键值相匹配的元素对,并返回被删除的元素的个数。

        m.erase(it);

        删除由迭代器it所指定的元素对,并返回指向下一个元素对的迭代器。

    看一段简单的示例代码:

       

     1  #include<map>
     2 
     3     #include<iostream>
     4 
     5      
     6 
     7     using namespace std;
     8 
     9      
    10 
    11     typedef map<int, string, less<int> > M_TYPE;
    12 
    13     typedef M_TYPE::iterator M_IT;
    14 
    15     typedef M_TYPE::const_iterator M_CIT;
    16 
    17      
    18 
    19     int main()
    20 
    21     {
    22 
    23      M_TYPE MyTestMap;
    24 
    25      
    26 
    27      MyTestMap[3] = "No.3";
    28 
    29      MyTestMap[5] = "No.5";
    30 
    31      MyTestMap[1] = "No.1";
    32 
    33      MyTestMap[2] = "No.2";
    34 
    35      MyTestMap[4] = "No.4";
    36 
    37      
    38 
    39      M_IT it_stop = MyTestMap.find(2);
    40 
    41      
    42 
    43      cout << "MyTestMap[2] = " << it_stop->second << endl;
    44 
    45      it_stop->second = "No.2 After modification";
    46 
    47      cout << "MyTestMap[2] = " << it_stop->second << endl;
    48 
    49      
    50 
    51      cout << "Map contents : " << endl;
    52 
    53      for(M_CIT it = MyTestMap.begin(); it != MyTestMap.end(); it++)
    54 
    55      {
    56 
    57       cout << it->second << endl;
    58 
    59      }
    60 
    61      
    62 
    63      return 0;
    64 
    65     }
    66 
    67  
    68 
    69 程序执行的输出结果为:
    70 
    71  
    72 
    73     MyTestMap[2] = No.2
    74 
    75     MyTestMap[2] = No.2 After modification
    76 
    77     Map contents :
    78 
    79     No.1
    80 
    81     No.2 After modification
    82 
    83     No.3
    84 
    85     No.4
    86 
    87     No.5

    再看一段简单的示例代码:

        

     1 #include <iostream>
     2 
     3     #include <map>
     4 
     5     using namespace std;
     6 
     7     main()
     8 
     9     {
    10 
    11         map<string, int> m;
    12 
    13         m["one"] = 1;
    14 
    15         m["two"] = 2;
    16 
    17         // 几种不同的insert调用方法
    18 
    19         m.insert(make_pair("three", 3));
    20 
    21         m.insert(map<string, int>::value_type("four", 4));
    22 
    23         m.insert(pair<string, int>("five", 5));
    24 
    25  
    26 
    27         string key;
    28 
    29         while (cin>>key)
    30 
    31         {
    32 
    33             map<string, int>::iterator it = m.find(key);
    34 
    35             if (it==m.end())
    36 
    37             {
    38 
    39                 cout << "No such key!" << endl;
    40 
    41             }
    42 
    43             else
    44 
    45             {
    46 
    47                 cout << key << " is " << it->second << endl;
    48 
    49                 cout << "Erased " << m.erase(key) << endl;
    50 
    51             }
    52 
    53         }
    54 
    55         return 1;
    56 
    57     }

    未完待续===

     

     

     

  • 相关阅读:
    HDU 6182 A Math Problem 水题
    HDU 6186 CS Course 位运算 思维
    HDU 6188 Duizi and Shunzi 贪心 思维
    HDU 2824 The Euler function 欧拉函数
    HDU 3037 Saving Beans 多重集合的结合 lucas定理
    HDU 3923 Invoker Polya定理
    FZU 2282 Wand 组合数学 错排公式
    HDU 1452 Happy 2004 数论
    HDU 5778 abs 数论
    欧拉回路【判断连通+度数为偶】
  • 原文地址:https://www.cnblogs.com/jeff-wgc/p/4480336.html
Copyright © 2011-2022 走看看