1. Pair對(duì)組
類模板:template <class T1, class T2> struct pair
參數(shù):T1是第一個(gè)值的數(shù)據(jù)類型涯塔,T2是第二個(gè)值的數(shù)據(jù)類型肌稻。
功能:pair將一對(duì)值組合成一個(gè)值,這一對(duì)值可以具有不同的數(shù)據(jù)類型(T1和T2)匕荸,兩個(gè)值可以分別用pair的兩個(gè)公有函數(shù)first和second訪問爹谭。
//第一種方式 創(chuàng)建一個(gè)Pair
pair<int,string> mypair(10,"aaa");
cout<<mypair.first<<" "<<mypair.second<<endl;
//第二種 創(chuàng)建Pair
pair<string,string> mypair2 = make_pair("aaa","bbb");
//等價(jià)于 auto mypair2 = make_pair("aaa","bbb");
cout<<mypair2.first<<" "<<mypair2.second<<endl;
//第三種 拷貝構(gòu)造
pair<int,string> mypair3 = mypair;
cout<<mypair3.first<<" "<<mypair3.second<<endl;
2. map/multimap容器
2.1 map/multimap特性
map相對(duì)于set區(qū)別,map具有鍵值和實(shí)值榛搔,所有元素根據(jù)鍵值自動(dòng)排序诺凡。pair的第一個(gè)元素被稱為鍵值,第二個(gè)元素被稱為實(shí)值践惑。map也是以紅黑樹為底層實(shí)現(xiàn)機(jī)制
1.png
2.png
問題:我們通過map的迭代器可以修改map的鍵值嗎腹泌?
答案是否定的,鍵值關(guān)系到容器內(nèi)元素的排列規(guī)則尔觉,任意改變鍵值會(huì)破壞容器的排列規(guī)則凉袱,但是你可以改變實(shí)值
map和multimap的區(qū)別在于,map不允許相同的key存在侦铜,multimap允許相同key值存在
2.2 map常用API
map構(gòu)造函數(shù)
map<T1,T2> mapTT;//默認(rèn)構(gòu)造
map(const map &mp);//拷貝構(gòu)造
//map容器的模板參數(shù) 需要指定key類型 value 類型
map<int,string> mymap;//默認(rèn)構(gòu)造
map<int,string> mymap2(mymap);//拷貝構(gòu)造
map賦值操作
map &operator=(const map &mp);//
swap(mp);//交換兩個(gè)集合容器
map大小操作
int size();//返回容器中元素的數(shù)目
bool empty();//判斷容器是否為空
map插入數(shù)據(jù)元素操作
pair<itertator,bool> insert(const pair<KEY_TYPE,VALUE_KEY) &val);//只有在val不存在時(shí)插入val.返回值是一個(gè)指向被插入元素的迭代器和一個(gè)描述是否插入的bool值
void insert(iterator beg,iterator end);//插入beg到end的元素到map中
iterator insert(iterator pos,const pair<KEY_TYPE,VALUE_KEY) &val);//插入val到pos后面专甩,然后返回一個(gè)指向這個(gè)元素的迭代器
------------------------------------
pair<itertator,bool> insert(const pair<KEY_TYPE,VALUE_KEY) &val);
map<int,string> mapStu;
//第一種,通過Pair的方式插入對(duì)象
mapStu.insert(pair<int,string>(3,"小張"));
//第二種钉稍,通過pair的方式插入對(duì)象
mapStu.insert(make_pair(-1,"校長"));
//第三種 通過value_type的方式插入對(duì)象那個(gè)
mapStu.insert(map<int,string>::value_type(1,"小李"));
pair<map<int,string>::iterator,bool> ret = mapStu.insert(map<int,string>::value_type(1,"小紅"));//插入成功or失敗返回pair類型
if(ret.second){
cout<<"插入成功"<<endl;
}
else{
cout<<"插入失敗"<<endl;
}
//第四種 通過數(shù)組的方式插入值
mapStu[3] = "小劉";
mapStu[5] = "小王";
mapStu[3] = "小錢";//這樣重復(fù)的話涤躲,如果key值已經(jīng)存在,就會(huì)修改容器指定key值元素的值
//如果你訪問的key不存在贡未,它會(huì)幫你把這個(gè)數(shù)據(jù)給你插進(jìn)去
cout<<"key=20不存在篓叶,value:"<<mapStu[20]<<endl;//value為0
for(map<int,string>::itertaor it = mapStu.begin();it != mapStu.end();it++)
{
cout<<"key:"<<it->first<<" "<<"value:"<<it->second<<endl;
}//你會(huì)發(fā)現(xiàn)竟然多了一個(gè)key為20的元素!P叱印缸托!,所以mapStu[20]不只是讀取瘾蛋,還是插入
cout<<endl;
map刪除和查找
//刪除
void erase(iterator pos);//erase()函數(shù)刪除在pos位置的元素
void erase(iterator start,iterator end);//刪除在start和end之間的元素
size_type erase(const KEY_TYPE &key);//刪除那些值為key的所有元素
void print(map<int, int>& mymap){
for (map<int, int>::iterator it = mymap.begin(); it != mymap.end();it++){
cout << it->first << " " << it->second << " ";
}
cout << endl;
}
void test(){
map<int, int> mymap;
mymap.insert(make_pair(1, 2));
mymap.insert(make_pair(2, 3));
mymap.insert(make_pair(3, 4));
mymap.erase(2); //根據(jù)Key刪除元素
print(mymap);
mymap.erase(mymap.begin()); //刪除第一個(gè)元素
print(mymap);
mymap.erase(mymap.begin(),mymap.end()); // mymap.clear
cout << "map size:" << mymap.size() << endl;
//---------------------------------
//查找
iterator find(const KEY_TYPE &key);
iterator upper_bound(const KEY_TYPE &key);//upper_bound()函數(shù)返回一個(gè)迭代器俐镐,指向map中鍵值>key的第一個(gè)元素
iterator lower_bound(const KEY_TYPE &key)//lower_bound()函數(shù)返回一個(gè)迭代器,指向map中鍵值>=key的第一個(gè)元素
pair<map::iterator,map::itertaor> equal_range(const KEY_TYPE &key);//equal_range()函數(shù)返回兩個(gè)迭代器哺哼,一個(gè)指向第一個(gè)鍵值為key的元素佩抹,另一個(gè)指向最后一個(gè)鍵值為key的元素
int count(KEY_TYPE keyElem);//返回容器中key為keyElem的對(duì)組個(gè)數(shù)。對(duì)map來說取董,要么是0棍苹,要么是1.對(duì)multimap來說,值可能大于1
map<int, int>::iterator pos = mymap.find(3);
if (pos == mymap.end()){
cout << "沒有找到!" << endl;
}
else{
cout << "查找到:" << pos->first << " value:" << pos->second << endl;
}
cout << "---------------" << endl;
pos = mymap.lower_bound(2);
if (pos == mymap.end()){
cout << "沒有找到!" << endl;
}
else{
cout << "查找到:" << pos->first << " value:" << pos->second << endl;
}
pos = mymap.upper_bound(2);
if (pos == mymap.end()){
cout << "沒有找到!" << endl;
}
else{
cout << "查找到:" << pos->first << " value:" << pos->second << endl;
}
pair<map<int, int>::iterator, map<int, int>::iterator> pos2 = mymap.equal_range(2);
if (pos2.first == mymap.end()){ //第一個(gè)迭代器
cout << "沒有找到!" << endl;
}
else{
cout << "查找到:" << pos2.first->first << " value:" << pos2.first->second << endl;
}
if (pos2.second == mymap.end()){ //第二個(gè)迭代器
cout << "沒有找到!" << endl;
}
else{
cout << "查找到:" << pos2.second->first << " value:" << pos2.second->second << endl;
}
}
lower_bound和upper_bound的區(qū)別
multimap練習(xí)
//multimap案例
//公司今天招聘了5個(gè)員工茵汰,5個(gè)員工進(jìn)入公司之后枢里,需要指派員工在哪個(gè)部門工作
//人員信息有:姓名 年齡 電話 工資等組成
//通過multimap進(jìn)行信息的插入 保存 顯示
//分部門顯示員工信息 顯示全部員工信息
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
#define SALE_DEPARTEMENT 1//銷售部
#define DEVELOP_DEPARTMENT 2//開發(fā)部
#define FINACIAL_DEPARTMENT 3//財(cái)務(wù)部
class Employee
{
public:
string name;
int age;
string tele;
double salary;
};
//創(chuàng)建員工 5名
void Create_Employee(vector<Employee> &v){
string nameseed = "ABCDE";
for (int i = 0; i < 5; ++i)
{
Employee ep;
ep.name = "員工";
ep.name += nameseed[i];
ep.age = rand() % 30;
ep.salary = rand() % 10000 + 10000;
ep.tele = "+86-8888888";
v.push_back(ep);
}
}
//對(duì)員工指派部門
void Set_Ep_Group(vector<Employee> &v,multimap<int,Employee> & group){
for(vector<Employee>::iterator it = v.begin();it != v.end();it++){
cout<<"當(dāng)前員工信息"<<endl;
cout<<"名字:"<<it->name<<" 年齡:"<<it->age<<" 工資:"<<it->salary<<" 電話:"<<it->tele<<endl;
int departmentID = -1;
while(true){
cout<<"請(qǐng)輸入部門(1 銷售部 2 開發(fā)部 3 財(cái)務(wù)部):"<<endl;
scanf("%d",&departmentID);
if (departmentID == SALE_DEPARTEMENT)
{
group.insert(make_pair(SALE_DEPARTEMENT,*it));
break;
}
else if(departmentID == DEVELOP_DEPARTMENT)
{
group.insert(make_pair(DEVELOP_DEPARTMENT,*it));
break;
}
else if(departmentID == FINACIAL_DEPARTMENT)
{
group.insert(make_pair(FINACIAL_DEPARTMENT,*it));
break;
}
else
{
cout<<"輸入錯(cuò)誤,請(qǐng)重新輸入"<<endl;
}
}
}
}
//打印各部門員工信息
void Show_EP_Info(multimap<int,Employee> &group){
int departmentID = -1;
while(true){
cout<<"請(qǐng)輸入要查看部門(1 銷售部 2 開發(fā)部 3 財(cái)務(wù)部):"<<endl;
scanf("%d",&departmentID);
//驗(yàn)證輸入的有效性
if (departmentID < 1 || departmentID > 3)
{
continue;
}
multimap<int,Employee>::itertaor ret = group.find(departmentID);
int count = group.count(departmentID);
while(count--){
cout<<"姓名:"<<pos->second.name <<" 年齡:"<<pos->second.age<<" 工資:"<<pos->second.salary<< "電話:"<<pos->second.tele<<endl;
pos++;
}
}
}
int main(int argc, char const *argv[])
{
vector<Employee> v;//放員工信息
Create_Employee(v);//創(chuàng)建員工
//員工分組
multimap<int,Employee> Epgroup;//存放分組后的員工信息
Set_Ep_Group(v,Epgroup);//員工分組
Show_EP_Info(Epgroup);
return 0;
}