STL学习(16):map映射

常用的映射类是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 查看本文章

猜你喜欢

转载自blog.csdn.net/QQ2558030393/article/details/93468984