環(huán)境:ide:Mac+clion
視頻鏈接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5
map中所有的元素都是pair,pair中其實(shí)第一個(gè)就是key(鍵值)房午,第二個(gè)是value(實(shí)值)峡懈。
而且map 中是按照鍵值進(jìn)行排序的疏日。也稱為關(guān)聯(lián)容器彼哼。
map中不允許有重復(fù)鍵值坎穿。
multimap 允許有重復(fù)鍵值。
void printMap(const map<string,int>&m){
for(map<string,int>::const_iterator it = m.begin();it != m.end();it++){
cout << it->first << " " << it->second <<endl;
}
}
//map 按照key 進(jìn)行排序。
void test(){
map<string,int> m;
pair<string,int> p2 = make_pair("sheik2",2);
pair<string,int> p1 = make_pair("sheik1",1);
m.insert(p2);
m.insert(p1);
printMap(m);
map<string,int> m1(m);
cout << "------------------"<<endl;
printMap(m1);
map<string,int> m2;
m2 = m;
cout << "------------------"<<endl;
printMap(m2);
}
map大小和交換:size/empty/swap
map 的插入和刪除insert/erase/clear
map的查找和統(tǒng)計(jì):find/count .find 按照key的方式來查找露久,如果找到返回當(dāng)前的迭代器奕污,如果沒有就會(huì)返回end。
map<string,int> m;
pair<string,int> p2 = make_pair("sheik2",2);
pair<string,int> p1 = make_pair("sheik1",1);
m.insert(p1);
m.insert(p2);
//map<string,int>::iterator pos = m.find(p1.first);//查找到數(shù)據(jù)sheik1 1
map<string,int>::iterator pos = m.find("sheik3");//沒有查到此數(shù)據(jù)
if (pos != m.end()){
cout << "查找到數(shù)據(jù)"<<pos->first <<" " << pos->second<<endl;
}else{
cout <<"沒有查到此數(shù)據(jù)" << endl;
}
cout << m.count("sheik1")<<endl;//1
}
map容器的排序:map 默認(rèn)排序仍然是從小到大宾肺,利用仿函數(shù),來改變它的排序規(guī)則。仿函數(shù)状共,也是重載operator() 方式。
class MyCompare{
public:
bool operator()(const string v1,const string v2) const{
return v1 > v2;
}
};
void test02(){
map<string,int,MyCompare> m;
pair<string,int> p2 = make_pair("sheik2",2);
pair<string,int> p1 = make_pair("sheik1",1);
m.insert(p1);
m.insert(p2);
for (map<string,int,MyCompare>::iterator it=m.begin();it != m.end();it ++){
cout << it->first << " " << it->second << endl;
}
// sheik2 2
// sheik1 1
}
學(xué)習(xí)案例:
10個(gè)人谁帕,分別分配到美術(shù)/研發(fā)/策劃三個(gè)部門峡继。分別打印出三個(gè)部門的人力情況和薪資情況。
#define CEHUA 0
#define YANFA 1
#define MEISHU 2
class Person {
public:
string m_Name;
int m_Salary;
};
void createPerson(vector<Person> &v) {
const string nameSeed = "ABCDEFGHIJ";
for (int i = 0; i < 10; i++) {
Person person;
person.m_Name = "員工";
person.m_Name += nameSeed[i];
person.m_Salary = rand() % 10001 + 10000;//10000 -20000
v.push_back(person);//把創(chuàng)建的同學(xué)放到vector容器中匈挖。
}
}
void setGroupByPerson(vector<Person> &v, multimap<int, Person> &m) {
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
//這里開始分部門碾牌。
int depId = rand() % 3;// 部門分為 0 1 2
m.insert(make_pair(depId, *it));//把每個(gè)人進(jìn)行分配好部門后,放到multimap 容器中儡循。
}
}
void showPersonByDepId(const multimap<int, Person> &m) {
multimap<int, Person>::const_iterator pos = m.find(CEHUA);//通過key 來查找人
int count = m.count(CEHUA);
int index = 0;
cout << "策劃部門:"<<endl;
for (;pos != m.end() && index < count ;pos++,index++){
cout << "員工姓名:"<<pos->second.m_Name << " 薪資:"<<pos->second.m_Salary<<endl;
}
pos = m.find(YANFA);//通過key 來查找人
count = m.count(YANFA);
index = 0;
cout << "研發(fā)部門:"<<endl;
for (;pos != m.end() && index < count ;pos++,index++){
cout << "員工姓名:"<<pos->second.m_Name << " 薪資:"<<pos->second.m_Salary<<endl;
}
pos = m.find(MEISHU);//通過key 來查找人
count = m.count(MEISHU);
index = 0;
cout << "美術(shù)部門:"<<endl;
for (;pos != m.end() && index < count ;pos++,index++){
cout << "員工姓名:"<<pos->second.m_Name << " 薪資:"<<pos->second.m_Salary<<endl;
}
// 策劃部門:
// 員工姓名:員工D 薪資:19895
// 員工姓名:員工I 薪資:13224
// 研發(fā)部門:
// 員工姓名:員工A 薪資:15412
// 員工姓名:員工F 薪資:12907
// 員工姓名:員工H 薪資:14123
// 美術(shù)部門:
// 員工姓名:員工B 薪資:11630
// 員工姓名:員工C 薪資:11972
// 員工姓名:員工E 薪資:16413
// 員工姓名:員工G 薪資:17446
// 員工姓名:員工J 薪資:14929
}
int main() {
// test02();
srand((unsigned int) time(NULL));
vector<Person> v;//創(chuàng)建10個(gè)人舶吗,放到vector容器中。
createPerson(v);
multimap<int, Person> m;//這里分組后择膝,把數(shù)據(jù)放到multimap中誓琼。
setGroupByPerson(v, m);
showPersonByDepId(m);
return 0;
}