C++STL通用容器 之 映射

                          常用的映射类是 map, multimap
各个容器中,仅保存着一样东西,但是在映射中将会得到两样东西:关键字以及作为对关键字进行查询得到的结果值,即一对值<Key,Value>。map单映射中Key与Value是一对一的关系,multimap多映射中Key与Value可以是一对多的关系。

(1)构造函数

map(constPred&comp = Pred(),constA& al = A());创建空映射·map(constmap& x);  拷贝构造函数


map(constvalue_type*first, constvalue_type*last,constPred&comp = Pred(),constA& al = A());[first,last)之间元素构成


新映射。


multimap(constPred&comp = Pred(),constA& al = A());创建空映射


multimap(constmultimap&x);  拷贝构造函数


multimap(constvalue_type*first, constvalue_type*last,    constPred&comp = Pred(),constA& al = A());拷


贝[first,last)之间元素构成新映射


(2)大小、判断空函数


intsize() const  ;返回容器元素个数


boolempty() const  ;判断容器是否空,若返回true,表明容器已空


(3)增加、删除函数


iterator insert(constvalue_type&x);  插入元素x


iterator insert(iteratorit, constvalue_type&x);在迭代指针it处插入元素x


void insert(constvalue_type*first, constvalue_type*last);插入[first,last)间元素


iterator erase(iteratorit);  删除迭代指针it处元素


iterator erase(iteratorfirst, iterator last); 删除[first,last)迭代指针间元素  size_typeerase(constKey& key); 删除键值等于key的元素


(4)遍历函数

iteratorbegin()返回首元素的迭带器指针


iteratorend()返回尾元素后的迭带器指针,而不是尾元素的迭带器指针


reverse_iteratorrbegin()返回尾元素的逆向迭带器指针,用于逆向遍历容器


reverse_iteratorrend()返回首元素前的逆向迭带器指针,用于逆向遍历容器


(5)操作函数

const_iteratorlower_bound(constKey& key);返回键值等于key迭代指针,否则返回end()


const_iteratorupper_bound(constKey& key);


intcount(constKey& key) const;返回容器中键值等于key的元素个数


pair<const_iterator,const_iterator>equal_range(constKey& key) const;返回容器中键值等于key的迭代指针[first,last)


const_iteratorfind(constKey& key) const;查找功能,返回键值等于key迭代器指针


voidswap(map&s); 交换单映射元素


voidswap(multimap&s)交换多映射元素


(6)特殊函数

referenceoperator[](constKey& k);仅用在单映射map类中,可以以数组的形式给映射添加键---值对,并可返回值的引用。


两种常用形成映射方法
#include<iostream>
#include <string>
#include <map>
using namespace std;
void Display(map<int,string>&m)
{
    map<int,string>::iterator te=m.begin();
    while (te!=m.end())
    {
        cout<<(*te).first<<"\t"<<(*te).second<<endl;
        te++;
    }
}
int main()
{
    map<int,string>mymap;
    pair<int,string>s1(1,"张三");
    pair<int,string>s2(3,"张思");
    pair<int,string>s3(6,"爱迪生");
    pair<int,string>s4(5,"阿道夫");
    pair<int,string>s5(1,"位飞");
    mymap.insert(s1);
    mymap.insert(s2);
    mymap.insert(s3);
    mymap.insert(s4);
    mymap.insert(s5);
    cout<<"通过insert函数创建:"<<endl;
    Display(mymap);
    cout<<endl;
    cout<<"通过复制构造函数创建:"<<endl;
    map<int,string>mymap2(mymap);
    Display(mymap2);
    return 0;
}
单映射mapoperator[]用法。
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
    map<string,string>mymap;
    mymap["1-1"]="元旦";
    mymap["5-1"]="五一国际劳动节";
    mymap["7-1"]="党的生日";
    mymap["8-1"]="建军节";
    string s=mymap["1-1"];
    if(s.size()>0)
    {
        cout<<"1-1是:"<<s<<endl;
    }
    else
    {
        cout<<"6-1没有登记"<<endl;
    }
    s=mymap["6-1"];
    if(s.size()>0)
    {
        cout<<"6-1是:"<<s<<endl;
    }
    else
    {
        cout<<"6-1没有登记"<<endl;
    }
    return 0;
}


假设公司雇员属性有:雇员姓名(没有重复的姓名)、部门名称。编制管理雇员的集合类,仅包含:(1)添加雇员功能;(2)显示功能,要求按部门名称升序排列,若部门名相同,则姓名按升序排列。

分析:应该利用集合类,在添加雇员时,直接完成先按部门升序排列,再按姓名升序排列,即在恰当的位置重载operator<运算符,完成自定义排序规则功能。由于一个部门可以有许多雇员,因此应当采用multiset类。设雇员基本类为CEmployee,雇员集合类为CManage。则代码如下所示
#include <iostream>
#include <string>
#include <set>
using namespace std;
class CEmployee
{
private:
    string name;
    string departname;
public:
    CEmployee(string na,string depart):name(na),departname(depart){}
    bool operator<(const CEmployee &e)const
    {
        bool mark=(departname.compare(e.departname)<0)? true:false;
        if(departname.compare(e.departname)==0)
        {
            mark=(name.compare(e.name)<0)?true:false;
        }
        return mark;
    }
    string GetName()
    {
        return name;
    }
    string GetDepart()
    {
        return departname;
    }
};
class CMange
{
    multiset<CEmployee>myset;
public:
    bool Add(CEmployee &e)
    {
        myset.insert(e);
        return true;
    }
    void show()
    {
        multiset<CEmployee>::iterator te=myset.begin();
        while (te!=myset.end())
        {
            CEmployee obj=*te;
            cout<<obj.GetName()<<"\t\t"<<obj.GetDepart()<<endl;
            te++;
        }
    }
};
int main()
{
    CEmployee e1("爱的","大厦");
    CEmployee e2("爱的的","奥迪");
    CEmployee e3("啊","爱疯");
    CEmployee e4("地方","阿斯顿");
    CEmployee e5("阿道夫","地方");
    CEmployee e6("恩恩","的");
    CMange mange;
    mange.Add(e1);
    mange.Add(e2);
    mange.Add(e3);
    mange.Add(e4);
    mange.Add(e5);
    mange.Add(e6);
    mange.show();
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值