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     }

 

 

 

未完待续===

 

 

 

你可能感兴趣的:(ICPC)