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     }

    未完待续===

     

     

     

  • 相关阅读:
    poi隐藏列
    凯西太太的果园
    java中不可变对象深入理解
    excel添加空白行的快捷键
    如何在多个页面中,引入一个公共组件
    对后端返回的数据进行适配
    我与时间管理的故事
    在前端团队的那些日子(初见)
    我是这样做时间管理的(下)
    我是这样做时间管理的(上)
  • 原文地址:https://www.cnblogs.com/jeff-wgc/p/4480336.html
Copyright © 2011-2022 走看看