常用的映射类是map, multimap。在前述的各个容器中,仅保存着一样东西,但是在映射中将会得到两样东西:关键字以及作为对关键字进行查询得到的结果值,即一对值<Key, Value>。map单映射中Key与Value是一对一的关系,multimap多映射中Key与Value可以是一对多的关系。
常用函数
//(1)构造函数
map(const Pred& comp = Pred(), const A& al = A());//创建空映射map(const map& x);
//拷贝构造函数
map(const value_type *first, const value_type *last,const Pred& comp = Pred(), const A& al = A());//拷贝[first,last)之间元素构成新映射
multimap(const Pred& comp = Pred(), const A& al = A());//创建空映射
multimap(const multimap& x);// 拷贝构造函数
multimap(const value_type *first, const value_type *last, const Pred& comp = Pred(), const A& al = A());//拷贝[first,last)之间元素构成新映射
//(2)大小、判断空函数
int size() const ;//返回容器元素个数
bool empty() const ;//判断容器是否空,若返回true,表明容器已空
//(3)增加、删除函数
iterator insert(const value_type& x); // 插入元素x
iterator insert(iterator it, const value_type& x); //在迭代指针it处插入元素x
void insert(const value_type *first, const value_type *last);//插入[first,last)间元素
iterator erase(iterator it); // 删除迭代指针it处元素
iterator erase(iterator first, iterator last);// 删除[first, last)迭代指针间元素
size_type erase(const Key& key); // 删除键值等于key的元素
//(4)遍历函数
iterator begin(); // 返回首元素的迭带器指针
iterator end(); // 返回尾元素后的迭带器指针,而不是尾元素的迭带器指针
reverse_iterator rbegin(); // 返回尾元素的逆向迭带器指针,用于逆向遍历容器
reverse_iterator rend(); // 返回首元素前的逆向迭带器指针,用于逆向遍历容器
//(5)操作函数
const_iterator lower_bound(const Key& key);//返回键值等于key迭代指针,否则返回end()
const_iterator upper_bound(const Key& key);//
int count(const Key& key) const;//返回容器中键值等于key的元素个数
pair<const_iterator , const_iterator> equal_range(const Key& key) const;//返回容器中键值等于key的迭代指针[first, last)
const_iterator find(const Key& key) const;//查找功能,返回键值等于key迭代器指针
void swap(map& s);// 交换单映射元素
void swap(multimap& s);// 交换多映射元素
//(6)特殊函数
reference operator[](const Key& 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 ++;
}
}
void main()
{
map<int, string> mymap;
pair<int, string> s1(1, "zhangsan");
pair<int, string> s2(3, "lisi");
pair<int, string> s3(6, "wangwu");
pair<int, string> s4(5, "zhaoliu");
pair<int, string> s5(1, "zhangsan");
mymap.insert(s1);
mymap.insert(s2);
mymap.insert(s3);
mymap.insert(s4);
mymap.insert(s5);
cout << "通过insert函数创建:" << endl;
Display(mymap);
cout << "通过拷贝构造函数创建:" << endl;
map<int, string> mymap2(mymap);
Display(mymap2);
}
单映射map中operator[]用法。
#include <iostream>
#include <string>
#include <map>
using namespace std ;
void main()
{
map<string, string> mymap;
mymap["1-1"] = "元旦"; //通过赋值形式添加影射,键在[]内,值在等号右侧
mymap["5-1"] = "五一国际劳动节";
mymap["7-1"] = "党的生日";
mymap["8-1"] = "建军节";
mymap["10-1"]= "国庆节";
string s = mymap["1-1"]; //通过operator[]完成查询功能,赋给string变量s
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;
}
}
综合操作示例
假设公司雇员属性有:雇员姓名(没有重复的姓名)、部门名称。编制管理雇员的集合类,仅包含:(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 name, string departname)
{
this->name = name;
this->departname = departname;
}
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 CManage //雇员集合维护类
{
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.GetDepart() << "\t" << obj.GetName() << endl;
te ++;
}
}
};
void main()//测试main函数
{
CEmployee e1("zhangsan", "人力部");
CEmployee e2("zhouqi", "装配部");
CEmployee e3("wangwu", "制造部");
CEmployee e4("zhaoliu", "制造部");
CEmployee e5("lisi", "装配部");
CEmployee e6("tianjiu", "制造部");
CManage manage;
manage.Add(e1);manage.Add(e2);
manage.Add(e3);manage.Add(e4);
manage.Add(e5);manage.Add(e6);
manage.Show();
}
扫描二维码关注公众号,回复:
6744915 查看本文章