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     }

未完待续===

 

 

 

原文地址:https://www.cnblogs.com/jeff-wgc/p/4480336.html