STL之map/multimap关联式容器学习

来源:互联网 发布:virtualbox 安装mac 编辑:程序博客网 时间:2024/05/16 17:35

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 . 实值比较

通过函数value_comp可以进行实值比较,返回类型为value_compare。value_compare决定了map中元素的排列顺序。

(5)获取内存分配器

函数get_allocator()用于返回map或multimap的内存配置器,内存配置器类似指针的首地址,用于指明对象的初始存储位置,获取容器的内存分配器直观重要。
Allocator get_allocator() const;
函数只能读取内存分配器,不能改变内存分配器,即不能改变容器变量所存储的位置量。
0 0
原创粉丝点击