C++ STL Map和Multimap使用方法

本文详细介绍了C++ STL中的Map和Multimap容器,包括它们的使用方法、能力、操作函数以及如何作为关联式数组和字典使用。文章强调了Map不允许重复元素,Multimap则允许,并提醒读者注意Map中key的不可变性和通过key查找元素的高效性。还讨论了元素的安插、移除和修改key的方法,并提供了实例和综合案例。

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

Map和multimap将key/value pair当作元素进行管理,可根据key的排序准则自动为元素排序.

multimap允许重复元素,map不允许

在这里插入图片描述

头文件<map>

在这里插入图片描述
在这里插入图片描述

注意:

第一个模板实参将成为元素的key类型,第二个模板实参将成员元素的值类型.

key和T必须满足以下两个条件:

1.key和value都是可复制的或可搬移的

2.key必须是可比较的

Map和Multimap的能力

在这里插入图片描述
和其他所有关联式容器一样,map/Multimap通常以平衡二叉树完成

Map/和Multimap根据元素的key自动对元素排序,根据已知的key查找某个元素时就能有很好的效率,而根据已知value查找元素,效率就很糟糕.

你不可以直接改变元素的key,因为这回破坏正确次序,要修改元素的key,必须先移除拥有该key的元素,然后插入拥有新key/value的元素

Map和Multimap的操作函数

构造函数和析构函数

在这里插入图片描述

类似set,有两种方式可以定义排序准则:

1.以模板参数定义:
map<float,string,greater<float>>coll;
2.以构造参数定义:可以看最下面的综合例子

非更易型操作

在这里插入图片描述

特殊查找动作

在这里插入图片描述

赋值

在这里插入图片描述

迭代器函数和元素访问

在这里插入图片描述

Map和multimap不支持元素直接访问,但是map提供了at()以及下标操作符可以直接访问元素。

和其他所有关联式容器一样,这里的迭代器是双向迭代器.所以,无法使用随机访问迭代器的STL算法

更重要的是,所有元素的key都被视为常量,元素的实质类型是pair<const key, T>

所有你不能更改key,不能对map、multimap调用任何更易型算法,比如remove(),

因为remove()算法实际上是将其实参值覆盖掉被移除的元素.

下面是使用基于范围的for循环访问map元素:

map<string,float>coll;
...
for(auto elem& : coll)
{
   
	cout << "key: " << elem.first << "\t" << "value: " << elem.second << endl;
}

以迭代器访问元素:

map<string,float>coll;
...
map<string,float>::iterator pos;
for(pos = coll.begin(); pos!= coll.end();++pos)
{
   
	cout << "key: " << pos->first << '\t' << "value: " << pos->second << endl;
}

如果使用算法或lambda来操作map元素,可以这样做:

map<string,float>coll;
...
for_each(coll.begin(),coll.end(),[](pair<const string, float>&elem){
   elem.second +=10;});
for_each(coll.begin(),coll.end(),[](map<string,float>::value_type&elem){
   elem.second +=10;});
for_each(coll.begin(),coll.end(),[](decltype(coll)::value_type&elem){
   elem.second +=10;});
如果一定要改变元素的key,只有一条路:使用一个值相同的新元素替换旧元素
template<typename Cont>
inline bool replace_key(Cont & c, const typename Cont::key_type& old_key, const typename Cont::key_type& new_key)
{
   
	typename Cont::iterator pos;
	pos = c.find(old_key<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值