第08篇 ACM/ICPC竞赛之STL--map
在STL的头文件<map>中定义了模板类map和multimap,用有序二叉树来存贮类型为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是指向插入元素对的迭代器,其second为true;若map中已经存在与key相等的键值时,其first是指向该元素对的迭代器,second为false。
3、查找元素对,例如:
int i = m[key];
要注意的是,当与该键值相匹配的元素对不存在时,会创建键值为key的元素对。
map<string, int>::iterator it = m.find(key);
如果map中存在与key相匹配的键值时,find操作将返回指向该元素对的迭代器,否则,返回的迭代器等于map的end()(参见vector中提到的begin和end操作)。
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 }
未完待续===