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_

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

被折叠的 条评论
为什么被折叠?



