ACM/ICPC竞赛之STL--map

本文详细解析了C++标准库STL中的map和multimap容器,包括它们的使用方法、基本操作和特性。map容器通过有序二叉树存储元素,支持高效的查找、插入和删除操作。通过实例代码展示了如何定义、插入、查找和修改map容器中的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在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所指定的元素对,并返回指向下一个元素对的迭代器。 


看一段简单的示例代码: 


#include<map>#include<iostream> using namespace std; typedef map<int, string, less<int> > M_TYPE;typedef M_TYPE::iterator M_IT;typedef M_TYPE::const_iterator M_CIT; int main(){ M_TYPE MyTestMap; MyTestMap[3] = "No.3"; MyTestMap[5] = "No.5"; MyTestMap[1] = "No.1"; MyTestMap[2] = "No.2"; MyTestMap[4] = "No.4"; M_IT it_stop = MyTestMap.find(2); cout << "MyTestMap[2] = " << it_stop->second << endl; it_stop->second = "No.2 After modification"; cout << "MyTestMap[2] = " << it_stop->second << endl; cout << "Map contents : " << endl; for(M_CIT it = MyTestMap.begin(); it != MyTestMap.end(); it++) { cout << it->second << endl; } return 0;} 
程序执行的输出结果为: 


MyTestMap[2] = No.2 
MyTestMap[2] = No.2 After modification 
Map contents : 
No.1 
No.2 After modification 
No.3 
No.4 
No.5 


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


#include <iostream> 
#include <map> 
using namespace std; 
main() 

map<string, int> m; 
m["one"] = 1; 
m["two"] = 2; 
// 几种不同的insert调用方法 
m.insert(make_pair("three", 3)); 
m.insert(map<string, int>::value_type("four", 4)); 
m.insert(pair<string, int>("five", 5)); 


string key; 
while (cin>>key) 

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

cout << "No such key!" << endl; 

else 

cout << key << " is " << it->second << endl; 
cout << "Erased " << m.erase(key) << endl; 


return 1; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值