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

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>>> class multi map;
第一个参数是容器中元素的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;
函数只能读取内存分配器,不能改变内存分配器,即不能改变容器变量所存储的位置量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值