1.map和multimap基础
map是由许多对的键值组成的排序结构体,键值独一无二。 容器类型multimap和容器map基本一致。只是multimap允许重复元素,而map不允许。 两种型别的模版为: template< class Key,class T,class Compare=less<Key>,class Allocator=allocator<pair<const Key,T>>> class map; template< class Key,class T,class Compare=less<Key>,class Allocator=allocator<pair<const Key,T>>> classmultimap; 第一个参数是容器中元素的key(键),第二个元素template参数被当作元素的value。前两个参数必须具备可赋值(assignable)和可复制(copyable)的性质。并且由于容器内部要排序,所以key必须是可以比较(comaprable)的。第三个参数可有可无,用于定义排序准则。元素的顺序仅由key决定,和value是无关的。默认排序准则是"less<>"。(1)map和multimap的定义、初始化
#include <iostream>
#include <map>
using namespace std;
void Print(map<int ,double> &m)
{
map<int,double>::iterator it;
for(it=m.begin();it!=m.end();++it)
{
pair<int,double> p1=(pair<int ,double>)(*it);
cout<<p1.first<<", ";
cout<<p1.second<<"; "<<endl;
}
}
void PrintM(multimap<int,double> &m)
{
multimap<int ,double>::iterator it;
for(it=m.begin();it!=m.end();++it)
{
pair<int,double> p1=(pair<int ,double>)(*it);
cout<<p1.first<<", ";
cout<<p1.second<<"; "<<endl;
}
}
void PrintG(map<int,double,greater<int> > &m)
{
map<int ,double,greater<int> >::iterator it;
for(it=m.begin();it!=m.end();++it)
{
pair<int,double> p1=(pair<int ,double>)(*it);
cout<<p1.first<<", ";
cout<<p1.second<<"; "<<endl;
}
}
void PrintG_M(multimap<int,double,greater<int> > &m)
{
multimap<int ,double>::iterator it;
for(it=m.begin();it!=m.end();++it)
{
pair<int,double> p1=(pair<int ,double>)(*it);
cout<<p1.first<<", ";
cout<<p1.second<<"; "<<endl;
}
}
void PrintL_M(map<int,double,less<int> > &m)
{
map<int ,double>::iterator it;
for(it=m.begin();it!=m.end();++it)
{
pair<int,double> p1=(pair<int ,double>)(*it);
cout<<p1.first<<", ";
cout<<p1.second<<"; "<<endl;
}
}
int main()
{
map<int ,double>::iterator itm;
map<int ,double ,greater<int> >::iterator itmG;
map<int ,double ,less<int > >::iterator itmL;
map<int ,double> m1;
map<int ,double,greater<int> >m2;
multimap<int ,double> m3;
multimap<int,double,greater<int> >m4;
m1.insert(pair<int ,double>(1,2.0));
m1.insert(pair<int ,double>(2,5.0));
m1.insert(pair<int ,double>(3,7.0));
m1.insert(pair<int ,double>(4,8.0));
m1.insert(pair<int ,double>(5,11.0));
m1.insert(pair<int ,double>(6,6.0));
cout<<"m1: "<<endl;
Print(m1);
m2.insert(pair<int ,double>(1,2.0));
m2.insert(pair<int ,double>(2,5.0));
m2.insert(pair<int ,double>(3,7.0));
m2.insert(pair<int ,double>(4,8.0));
m2.insert(pair<int ,double>(5,11.0));
m2.insert(pair<int ,double>(6,6.0));
cout<<"m2(greater<int>:)"<<endl;
PrintG(m2);
m3.insert(pair<int ,double>(1,2.0));
m3.insert(pair<int ,double>(2,5.0));
m3.insert(pair<int ,double>(3,7.0));
m3.insert(pair<int ,double>(4,8.0));
m3.insert(pair<int ,double>(5,11.0));
m3.insert(pair<int ,double>(6,6.0));
cout<<"m3: "<<endl;
PrintM(m3);
m4.insert(pair<int ,double>(1,2.0));
m4.insert(pair<int ,double>(2,5.0));
m4.insert(pair<int ,double>(3,7.0));
m4.insert(pair<int ,double>(4,8.0));
m4.insert(pair<int ,double>(5,11.0));
m4.insert(pair<int ,double>(6,6.0));
cout<<"m4(greater<int>:)"<<endl;
PrintG_M(m4);
map<int,double>::allocator_type ma;
ma=m2.get_allocator();
map<int,double> m5(less<int>(),ma);
m5.insert(pair<int ,double>(16,1.0));
m5.insert(pair<int ,double>(15,7.0));
m5.insert(pair<int ,double>(24,9.0));
m5.insert(pair<int ,double>(23,13.0));
m5.insert(pair<int ,double>(32,21.0));
m5.insert(pair<int ,double>(11,27.0));
cout<<"m5(less<int>)"<<endl;
PrintL_M(m5);
return 0;
}
(2)map的容量
size_type size() const; size_type max_size() const;2.map和multimap的成员函数
(1)判空函数
bool empty() const; 如果map或multimap为空,成员函数empty()返回true.(2)遍历容器
容器map和multimap不支持元素直接存取。元素的存取需要经过迭代器实现,并且map和multimap的迭代器均是双向迭代器。此类成员函数包括:begin(), end() ,rbegin(),rend() const_iterator begin() const; iterator begin(); const_iterator end() const; iterator end(); const_reverse_iterator rbegin() const; reverse_iterator rbegin(); const_reverse_iteratro rend() const; reverse_iteratro rend();#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,double,greater<int> >m1;
multimap<int ,double,greater<int> >m2;
map<int,double,greater<int> >::iterator it;
map<int,double,greater<int> >::reverse_iterator itR;
multimap<int ,double,greater<int> >::iterator itM;
multimap<int ,double,greater<int> >::reverse_iterator itRM;
m1.insert(pair<int,double>(1,5.0));
m1.insert(pair<int,double>(2,7.0));
m1.insert(pair<int,double>(3,7.0));
m1.insert(pair<int,double>(4,17.0));
m1.insert(pair<int,double>(5,11.0));
m2.insert(pair<int,double>(1,4.0));
m2.insert(pair<int,double>(2,8.0));
m2.insert(pair<int,double>(3,9.0));
m2.insert(pair<int,double>(4,12.0));
m2.insert(pair<int,double>(5,19.0));
cout<<"map:"<<endl;
for(it=m1.begin();it!=m1.end();++it)
{
cout<<(*it).first<<", "<<(*it).second<<", "<<endl;
}
cout<<endl;
cout<<"multimap:"<<endl;
for(itM=m2.begin();itM!=m2.end();++itM)
{
cout<<(*itM).first<<", "<<(*itM).second<<", "<<endl;
}
cout<<endl;
it=m1.begin();
cout<<"The first element is: "<<(*it).first<<","<<(*it).second<<";"<<endl;
it=m1.end();
pair<int,double> temp=*(--it);
cout<<"The last element is :"<<temp.first<<","<<temp.second<<";"<<endl;
//cout<<"The last element is :"<<(*(it--)).first<<","<<(*(--it)).second<<";"<<endl;
return 0;
}
3.map和multimap的高级编程
(1)map/multimap的插入和删除
容器map/multimap的成员函数insert()可以加入一个对象、一个对象的若干复制,或者某个范围内的对象。函数insert()把一个或若干个元素插入到iterator指示的位置。所插入的元素将出现在Iteratro指出的位置之前。函数insert()的原型为:pair<iterator,bool > insert (const value_type &x);iterator insert(iterator it,const value_type &x);void insert(const value_type *first,const value_type *last);第1种语法的功能是将元素x插入到map的末尾,第2种语法的功能是将元素x插入到迭代器it 之前,第3种语法的功能是将迭代器(first,last)指定范围的元素插入到map中。函数erase()的原型为:iterator erase(iterator it);iterator erase(iterator first, iterator lase);size_type erase(const Key& key);函数erase()可以用来删掉由一个iterator指出的元素,也可以删掉一个范围的元素。第1种语法的功能是将迭代器it 所指向的元素删除;第2种语法的功能是将迭代器(first,end)所指范围中的元素全部删除;第3中语法的功能是将元素key删除。 同样,容器map还提供了成员函数clear(). void clear const; 函数clear()可以删除容器中所有元素,并且比函数erase()的管理功能更强大且更加灵活.#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,double,greater<int> >m1;
map<int,double,greater<int> >::iterator it;
m1.insert(pair<int,double>(1,5.0));
m1.insert(pair<int,double>(2,7.0));
m1.insert(pair<int,double>(3,7.0));
m1.insert(pair<int,double>(4,17.0));
m1.insert(pair<int,double>(5,11.0));
int size=m1.size();
cout<<"The size of map is :"<<size<<endl;
for(it=m1.begin();it!=m1.end();++it)
{
cout<<(*it).first<<", "<<(*it).second<<", "<<endl;
}
cout<<endl;
m1.erase(5); //删除的是key=5的一对
for(it=m1.begin();it!=m1.end();++it)
{
cout<<(*it).first<<", "<<(*it).second<<", "<<endl;
}
cout<<endl;
m1.erase(m1.begin(),--m1.end());//除了最后一个其余都删除
for(it=m1.begin();it!=m1.end();++it)
{
cout<<(*it).first<<", "<<(*it).second<<", "<<endl;
}
return 0;
}
(2)元素交换函数swap()
map和multimap还提供了元素交换函数swap()。参与交换的两个对象必须类型一致。函数原型为: void swap(map &str); 函数swap()一般包括两种形式:swap(m1,m2)和m1.swap(m2).值得注意的是,第二种方法只是m1的内容发生改变。(3)元素个数统计、查找元素和元素的随机访问
count()函数的功能是返回元素在map/multimap中出现的次数。对于map型容器,其元素具有唯一性,不包含重复的元素,函数返回值只有两个:“0”或者“1”。对于multimap型容器,其函数功能和map一致,唯一的区别在于:multimap 允许数据重复,函数返回的不止"0"和"1" size_type count(const Key &key) const; 实现查找元素功能的成员函数是find()。其功能是返回指向key的迭代器,如果该迭代器定义的是常迭代器,返回的类型是const_iterator。如果和键值key对应 的元素不存在,则函数返回迭代器end()。还可以使用STL的通用算法find()和find()_if()。 元素的随机访问功能包括两个函数upper_bound()和lower_bound();还有函数equal_range()。 函数equal_range()实现的功能是返回容器中元素上下限的两个迭代器,由于迭代器是常迭代器,所以equal_range()可以返回map/multimap容器元素中上下限的两个常迭代器,如果元素没找到,则返回最后一个元素,函数返回的是end()。函数返回的两个迭代器中,第一个迭代器和函数lower_bound()返回值一样:第二个迭代器和函数upper_bound()返回值一样。 函数upper_bound(Key key)返回值的是返回指向大于key元素的迭代器:lower_bound()的功能在于返回指向key前面的元素的迭代器,即key是“界限”。#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,double,greater<int> >m1;
map<int,double,greater<int> >::iterator it;
m1.insert(pair<int,double>(1,5.0));
m1.insert(pair<int,double>(2,7.0));
m1.insert(pair<int,double>(3,7.0));
m1.insert(pair<int,double>(4,17.0));
m1.insert(pair<int,double>(5,11.0));
int size=m1.size();
cout<<"The size of map is :"<<size<<endl;
for(it=m1.begin();it!=m1.end();++it)
{
cout<<(*it).first<<", "<<(*it).second<<", "<<endl;
}
cout<<endl;
int count=m1.count(4);
cout<<"The count of key 4 in the map m1 "<<count<<endl;
it=m1.find(5);
cout<<"The element of key 3:---"<<(*it).first<<","<<(*it).second<<endl;
pair<map<int ,double,greater<int> >::iterator,map<int ,double,greater<int> >::iterator > p1=m1.equal_range(3);
cout<<"The lower_bound(3) and upper_bound(3):---"<<p1.first->second<<","<<p1.second->second<<endl;
it=m1.lower_bound(1.9);
cout<<"The lower_bound(1.9):---"<<(*it).first<<", "<<(*it).second<<endl;
it=m1.upper_bound(3.1);
cout<<"The lower_bound(3.1):---"<<(*it).first<<", "<<(*it).second<<endl;
return 0;
}
(4)元素大小比较
1 . 键值比较 通过函数key_comp可以进行键值的比较,返回类型为key_comp, key_comp决定了map中元素的排列顺序。2 . 实值比较