C++进阶STL-map、multimap

map、multimap容器

  • (1)map相对于set来说,map具有键值和实值,将元素组合成pair再插入到map容器,pair的第一个元素被称为键值,第二个元素被称为实值。
  • (2)map也是以红黑树为底层的实现机制,map容器根据插入元素的键值会自动排序,如果不是普通类型,需要自定义规则
  • (3)map的键值不可以重复,实值可以重复,multimap键值实值都可以重复
  • (4)map的键值不可修改,可以改变实值,想修改键值只有删除再插入

map构造函数

  • map <T1,T2> mymap   //默认构造
  • map(const map& mymap) //拷贝构造

map赋值

  • map& operator(const map& mymap) //重载=操作符
  • swap(mymap) //交换两个容器

map大小

  • size() //返回容器中元素的个数
  • empty() //判断容器是否为空

map插入元素

  • mymap.insert( pair<T1,T2>(T1实例,T2实例) )
  • mymap.insert( make_pair(T1实例,T2实例))
  • mymap.insert( map<T1,T2>::value_type(T1实例,T2实例))
  • mymap[T1实例]=T2实例
	map< int, int>mymap;
	
	//方法1
	mymap.insert(pair<int, int>(10, 10));

	//方法2
	mymap.insert(make_pair(20, 20));

	//方法3
	mymap.insert(map<int, int>::value_type(30, 30));

	//方法4
	mymap[40] = 40;



	for (map<int, int>::iterator it = mymap.begin(); it != mymap.end(); it++)
	{
		cout << "key is: " << it->first << ";"<< " value is :" << it->second << endl;
	}

结果:
在这里插入图片描述

NOTE:

  • 如果用mymap.insert插入相同key的元素不会成功
  • 但是用 mymap[40]=10 去插入,如果容器中有相同的key值的元素,则修改此元素的value值为10
  • 如果访问map容器中没有的元素,如:cout << “mymap[50]:” << mymap[50] << endl;,容器会添加key=50的元素,value值初始化为0

map元素删除

  • clear()  //清除所有元素
  • erase(pos)  //删除pos迭代器所指的元素,返回下一个元素的迭代器
  • erase(begin(),end() );  //删除[begin end]之间的所有元素,返回下一个元素的迭代器
  • erase(key) //删除容器中键值为key的元素

map元素查找

  • find(key)   //查找key键值是否存在,若存在返回第一次出现该键的元素的迭代器,若不存在,返回map.end()
  • count(key) //返回容器中键值为key的元素的个数,对于map来说要么0,要么1,对于multimap来说有可能大于1
  • lower_bound(key) //返回第一个键值 >= key 的元素的迭代器 @1
  • upper_bound(key) //返回第一个键值 > key 的元素的迭代器 @2
  • equal_range(key)  //返回pair<@1,@2 >

实例: 在1 2 3 4 中equal_range(2) ,第一个>=2 的是2,第一个> 2是3,应该返回 2 , 3

	map<int, int> mymap;
	
	mymap.insert(make_pair(1,10));
	mymap.insert(make_pair(2,20));
	mymap.insert(make_pair(3,30));
	mymap.insert(make_pair(4, 40));

	pair<map<int, int>::iterator, map<int, int>::iterator> mypair = mymap.equal_range(2);

	cout << mypair.first->first << " : "<< mypair.first->second << endl;
	cout << mypair.second->first<< " : " <<  mypair.second->second << endl;

结果:
在这里插入图片描述


map容器的自定义排序规则

#include "stdafx.h"
#include <map>
#include <iostream>
using namespace std;

class Key
{
public:
	Key(int ID, int age):m_ID(ID),m_age(age) {}
	int m_ID;
	int m_age;
};

struct Compare  //自定义的规则,用Key.m_age排序 ,从小到大
{
	bool operator()(const Key& key1, const Key& key2)
	{
		return key1.m_age <  key2.m_age;
	}
};

int main()
{
	map<Key, int, Compare> mymap;
	mymap.insert(make_pair(Key(1, 1), 1));
	mymap.insert(make_pair(Key(2, 2), 2));
	mymap.insert(make_pair(Key(3, 3), 3));
	mymap.insert(make_pair(Key(4, 4), 4));

	for (map<Key, int, Compare>::iterator it=mymap.begin(); it != mymap.end(); it++)
	{
		cout << it->first.m_age << " : " << it->first.m_ID << " : " << it->second << endl;
	}
    return 0;
}

结果:struct Compare 返回的是 return key1.m_age < key2.m_age;

在这里插入图片描述

结果:struct Compare 返回的是 return key1.m_age > key2.m_age;
在这里插入图片描述












map容器的综合小实例

  • 给5个员工分配部门,每个员工具有:姓名,电话,年龄,薪水
  • 部门有三个:销售部,研发部,财务部
  • 按照部门打印出每个员工的信息
#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>
#include <map>
#include <time.h>


using namespace std;
#define SALE_DEPARTMENT 1
#define DEVELOP_DEPARTMENT 2
#define FINACIAL_DEPARTMENT 3

class Worker
{
public:
	string m_name;
	string m_tele;
	int m_age;
	int m_salary;
};

//创建员工
void Creat_Worker(vector<Worker>& Workers)
{
	string seed = "ABCDE";
	for (int i = 0; i < 5; i++)
	{
		Worker Wok;
		Wok.m_name = "员工";
		Wok.m_name+=seed[i];
		Wok.m_age = rand() % 10 + 20;
		Wok.m_salary = rand() % 10000 + 10000;
		Wok.m_tele = "010-73829783";

		Workers.push_back(Wok);
	}
}

//员工分组
void Worker_Group(vector<Worker>& Workers, multimap <int, Worker>& Workergroup)
{
	srand(time(NULL));
	for (vector<Worker>::iterator it = Workers.begin(); it != Workers.end(); it++)
	{
		int DeparID = rand() % 3 + 1;
		switch (DeparID)
		{
			case SALE_DEPARTMENT:
				Workergroup.insert(make_pair(SALE_DEPARTMENT, (*it)));
				break;
			case DEVELOP_DEPARTMENT:
				Workergroup.insert(make_pair(DEVELOP_DEPARTMENT, (*it)));
				break;
			case FINACIAL_DEPARTMENT:
				Workergroup.insert(make_pair(FINACIAL_DEPARTMENT, (*it)));
				break;
		default:
			break;
		}
	}

}

//打印部门员工
void ShowWorkers(multimap <int, Worker>& Workergroup, int dep)
{
	//打印销售部SALE_DEPARTMENT
	multimap<int, Worker>::iterator it = Workergroup.find(dep);
	int num = Workergroup.count(dep);
	for (it; it != Workergroup.end() && num != 0; it++, num--)
	{
		cout << "name: " << it->second.m_name << endl;
		cout << "age:" << it->second.m_age << endl;
		cout << "salary:" << it->second.m_salary << endl;
		cout << "tel:" << it->second.m_tele << endl; 
	}
}

//打印每个部门的员工信息
void Print_Worker(multimap <int, Worker>& Workergroup)
{
	cout << "---------------销售部---------------" << endl;
	ShowWorkers(Workergroup, SALE_DEPARTMENT);
	cout << "---------------研发部---------------" << endl;
	ShowWorkers(Workergroup, DEVELOP_DEPARTMENT);
	cout << "---------------财务部---------------" << endl;
	ShowWorkers(Workergroup, FINACIAL_DEPARTMENT);
}


int main()
{
	vector<Worker> Workers;
	
	multimap <int, Worker> Workergroup;
	//创建员工
	Creat_Worker(Workers);

	//员工分组
	Worker_Group(Workers, Workergroup);

	//打印每个部门的员工信息
	Print_Worker(Workergroup);

	return 0;
}

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zzyczzyc/article/details/82944540
今日推荐