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<