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