环境:ide:Mac+clion
视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5
map中所有的元素都是pair,pair中其实第一个就是key(键值),第二个是value(实值)。
而且map 中是按照键值进行排序的。也称为关联容器。
map中不允许有重复键值。
multimap 允许有重复键值。
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 进行排序。
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的查找和统计:find/count .find 按照key的方式来查找,如果找到返回当前的迭代器,如果没有就会返回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);//查找到数据sheik1 1
map<string,int>::iterator pos = m.find("sheik3");//没有查到此数据
if (pos != m.end()){
cout << "查找到数据"<<pos->first <<" " << pos->second<<endl;
}else{
cout <<"没有查到此数据" << endl;
}
cout << m.count("sheik1")<<endl;//1
}
map容器的排序:map 默认排序仍然是从小到大,利用仿函数,来改变它的排序规则。仿函数,也是重载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
}
学习案例:
10个人,分别分配到美术/研发/策划三个部门。分别打印出三个部门的人力情况和薪资情况。
#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);//把创建的同学放到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));//把每个人进行分配好部门后,放到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 << "研发部门:"<<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 << "美术部门:"<<endl;
for (;pos != m.end() && index < count ;pos++,index++){
cout << "员工姓名:"<<pos->second.m_Name << " 薪资:"<<pos->second.m_Salary<<endl;
}
// 策划部门:
// 员工姓名:员工D 薪资:19895
// 员工姓名:员工I 薪资:13224
// 研发部门:
// 员工姓名:员工A 薪资:15412
// 员工姓名:员工F 薪资:12907
// 员工姓名:员工H 薪资:14123
// 美术部门:
// 员工姓名:员工B 薪资:11630
// 员工姓名:员工C 薪资:11972
// 员工姓名:员工E 薪资:16413
// 员工姓名:员工G 薪资:17446
// 员工姓名:员工J 薪资:14929
}
int main() {
// test02();
srand((unsigned int) time(NULL));
vector<Person> v;//创建10个人,放到vector容器中。
createPerson(v);
multimap<int, Person> m;//这里分组后,把数据放到multimap中。
setGroupByPerson(v, m);
showPersonByDepId(m);
return 0;
}