C++---map、multimap的使用

  1. 基本概念
    Map的特性是,所有元素都會根據元素的鍵值自動排序。Map所有的元素都是pair,同時擁有實值和鍵值,pair的第一元素被視爲鍵值,第二元素被視爲實值,map不允許兩個元素有相同的鍵值。
    我們可以通過map的迭代器改變map的鍵值嗎?答案是不行,因爲map的鍵值關係到map元素的排列規則,任意改變map鍵值將會嚴重破壞map組織。如果想要修改元素的實值,那麼是可以的。
    Map和list擁有相同的某些性質,當對它的容器元素進行新增操作或者刪除操作時,操作之前的所有迭代器,在操作完成之後依然有效,當然被刪除的那個元素的迭代器必然是個例外。
    Multimap和map的操作類似,唯一區別multimap鍵值可重複。
    Map和multimap都是以紅黑樹爲底層實現機制。

  2. 常用API

  • 構造函數
map<T1, T2> mapTT;//map默認構造函數: 
map(const map &mp);//拷貝構造函數

  • map賦值操作
map& operator=(const map &mp);//重載等號操作符
swap(mp);//交換兩個集合容器
  • 大小操作
size();//返回容器中元素的數目
empty();//判斷容器是否爲空
  • 插入數據
map.insert(...); //往容器插入元素,返回pair<iterator,bool>
map<int, string> mapStu;
// 第一種 通過pair的方式插入對象
mapStu.insert(pair<int, string>(3, "小張"));
// 第二種 通過pair的方式插入對象
mapStu.inset(make_pair(-1, "校長"));
// 第三種 通過value_type的方式插入對象
mapStu.insert(map<int, string>::value_type(1, "小李"));
// 第四種 通過數組的方式插入值
mapStu[3] = "小劉";
mapStu[5] = "小王";

  • map刪除操作
clear();//刪除所有元素
erase(pos);//刪除pos迭代器所指的元素,返回下一個元素的迭代器。
erase(beg,end);//刪除區間[beg,end)的所有元素 ,返回下一個元素的迭代器。
erase(keyElem);//刪除容器中key爲keyElem的對組。

  • 查找操作
find(key);//查找鍵key是否存在,若存在,返回該鍵的元素的迭代器;/若不存在,返回map.end();
count(keyElem);//返回容器中key爲keyElem的對組個數。對map來說,要麼是0,要麼是1。對multimap來說,值可能大於1。
lower_bound(keyElem);//返回第一個key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一個key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key與keyElem相等的上下限的兩個迭代器。

案例

#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<map>
#include<string>
#include<vector>
using namespace std;

//multimap 案例
//公司今天招聘了 5 個員工,5 名員工進入公司之後,需要指派員工在那個部門工作
//人員信息有: 姓名 年齡 電話 工資等組成
//通過 Multimap 進行信息的插入 保存 顯示
//分部門顯示員工信息 顯示全部員工信息


#define SALE_DEPATMENT 1 //銷售部門
#define DEVELOP_DEPATMENT 2 //研發部門
#define FINACIAL_DEPATMENT 3 //財務部門
#define ALL_DEPATMENT 4 //所有部門

//員工類
class person{
public:
	string name; //員工姓名
	int age; //員工年齡
	double salary; //員工工資
	string tele; //員工電話
};

//創建5個員工
void CreatePerson(vector<person>& vlist){

	string seed = "ABCDE";
	for (int i = 0; i < 5; i++){
		person p;
		p.name = "員工";
		p.name += seed[i];
		p.age = rand() % 30 + 20;
		p.salary = rand() % 20000 + 10000;
		p.tele = "010-8888888";
		vlist.push_back(p);
	}

}

//5名員工分配到不同的部門
void PersonByGroup(vector<person>& vlist, multimap<int, person>& plist){


	int operate = -1; //用戶的操作

	for (vector<person>::iterator it = vlist.begin(); it != vlist.end(); it++){

		cout << "當前員工信息:" << endl;
		cout << "姓名:" << it->name << " 年齡:" << it->age << " 工資:" << it->salary << " 電話:" << it->tele << endl;
		cout << "請對該員工進行部門分配(1 銷售部門, 2 研發部門, 3 財務部門):" << endl;
		scanf("%d", &operate);

		while (true){
#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<map>
#include<string>
#include<vector>
using namespace std;

//multimap 案例
//公司今天招聘了 5 個員工,5 名員工進入公司之後,需要指派員工在那個部門工作
//人員信息有: 姓名 年齡 電話 工資等組成
//通過 Multimap 進行信息的插入 保存 顯示
//分部門顯示員工信息 顯示全部員工信息


#define SALE_DEPATMENT 1 //銷售部門
#define DEVELOP_DEPATMENT 2 //研發部門
#define FINACIAL_DEPATMENT 3 //財務部門
#define ALL_DEPATMENT 4 //所有部門

//員工類
class person{
public:
	string name; //員工姓名
	int age; //員工年齡
	double salary; //員工工資
	string tele; //員工電話
};

//創建5個員工
void CreatePerson(vector<person>& vlist){

	string seed = "ABCDE";
	for (int i = 0; i < 5; i++){
		person p;
		p.name = "員工";
		p.name += seed[i];
		p.age = rand() % 30 + 20;
		p.salary = rand() % 20000 + 10000;
		p.tele = "010-8888888";
		vlist.push_back(p);
	}

}

//5名員工分配到不同的部門
void PersonByGroup(vector<person>& vlist, multimap<int, person>& plist){


	int operate = -1; //用戶的操作

	for (vector<person>::iterator it = vlist.begin(); it != vlist.end(); it++){

		cout << "當前員工信息:" << endl;
		cout << "姓名:" << it->name << " 年齡:" << it->age << " 工資:" << it->salary << " 電話:" << it->tele << endl;
		cout << "請對該員工進行部門分配(1 銷售部門, 2 研發部門, 3 財務部門):" << endl;
		scanf("%d", &operate);

		while (true){

			if (operate == SALE_DEPATMENT){  //將該員工加入到銷售部門
				plist.insert(make_pair(SALE_DEPATMENT, *it));
				break;
			}
			else if (operate == DEVELOP_DEPATMENT){
				plist.insert(make_pair(DEVELOP_DEPATMENT, *it));
				break;
			}
			else if (operate == FINACIAL_DEPATMENT){
				plist.insert(make_pair(FINACIAL_DEPATMENT, *it));
				break;
			}
			else{
				cout << "您的輸入有誤,請重新輸入(1 銷售部門, 2 研發部門, 3 財務部門):" << endl;
				scanf("%d", &operate);
			}

		}

	}
	cout << "員工部門分配完畢!" << endl;
	cout << "***********************************************************" << endl;

}

//打印員工信息
void printList(multimap<int, person>& plist, int myoperate){

	if (myoperate == ALL_DEPATMENT){
		for (multimap<int, person>::iterator it = plist.begin(); it != plist.end(); it++){
			cout << "姓名:" << it->second.name << " 年齡:" << it->second.age << " 工資:" << it->second.salary << " 電話:" << it->second.tele << endl;
		}
		return;
	}

	multimap<int, person>::iterator it = plist.find(myoperate);
	int depatCount = plist.count(myoperate);
	int num = 0;
	if (it != plist.end()){
		while (it != plist.end() && num < depatCount){
			cout << "姓名:" << it->second.name << " 年齡:" << it->second.age << " 工資:" << it->second.salary << " 電話:" << it->second.tele << endl;
			it++;
			num++;
		}
	}
}

//根據用戶操作顯示不同部門的人員列表
void ShowPersonList(multimap<int, person>& plist, int myoperate){

	switch (myoperate)
	{
	case SALE_DEPATMENT:
		printList(plist, SALE_DEPATMENT);
		break;
	case DEVELOP_DEPATMENT:
		printList(plist, DEVELOP_DEPATMENT);
		break;
	case FINACIAL_DEPATMENT:
		printList(plist, FINACIAL_DEPATMENT);
		break;
	case ALL_DEPATMENT:
		printList(plist, ALL_DEPATMENT);
		break;
	}
}

//用戶操作菜單
void PersonMenue(multimap<int, person>& plist){

	int flag = -1;
	int isexit = 0;
	while (true){
		cout << "請輸入您的操作((1 銷售部門, 2 研發部門, 3 財務部門, 4 所有部門, 0退出):" << endl;
		scanf("%d", &flag);

		switch (flag)
		{
		case SALE_DEPATMENT:
			ShowPersonList(plist, SALE_DEPATMENT);
			break;
		case DEVELOP_DEPATMENT:
			ShowPersonList(plist, DEVELOP_DEPATMENT);
			break;
		case FINACIAL_DEPATMENT:
			ShowPersonList(plist, FINACIAL_DEPATMENT);
			break;
		case ALL_DEPATMENT:
			ShowPersonList(plist, ALL_DEPATMENT);
			break;
		case 0:
			isexit = 1;
			break;
		default:
			cout << "您的輸入有誤,請重新輸入!" << endl;
			break;
		}

		if (isexit == 1){
			break;
		}
	}

}

int main(){

	vector<person>  vlist; //創建的5個員工 未分組
	multimap<int, person> plist; //保存分組後員工信息

	//創建5個員工
	CreatePerson(vlist);
	//5名員工分配到不同的部門
	PersonByGroup(vlist, plist);
	//根據用戶輸入顯示不同部門員工信息列表 或者 顯示全部員工的信息列表
	PersonMenue(plist);

	system("pause");
	return EXIT_SUCCESS;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章