C++中的map/multimap容器 Posted on 2022-12-10 18:20:14 2022-12-10 18:20:14 by Author 摘要 c++ 学习笔记,map/multimap容器的学习笔记 ##### map/multimap容器 简介: - map所有元素都是pair - pair中第一个元素为key,第二个为value - 所有元素都会根据元素的键值自动排序 - 本质:map(multimap)属于关联式容器,底层使用二叉树实现 优点:map/multimap可以根据key快速找到value map和multimap区别: - map不允许容器中有重复key元素 - multimap运行容器中有重复key值元素 map构造和赋值: - map(T1,T2)mp; - map(const map &mp); - map& operator=(const map &map);//等号赋值 - ```c++ #include<algorithm> #include<map> #include<iostream> using namespace std; void printList(const map<int,int>&l){ for(map<int,int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<"key: "<<(*it).first<<" value"<<it->second<<" "<<endl; } cout<<endl; } void test01(){ map<int,int>m; m.insert(pair<int,int>(1,10)); m.insert(pair<int,int>(2,20)); m.insert(pair<int,int>(3,30)); m.insert(pair<int,int>(4,40)); m.insert(pair<int,int>(5,50)); printList(m); //拷贝构造 map<int,int>m1(m); printList(m1); //operator=赋值 map<int,int>m2 = m1; printList(m2); } int main(){ test01(); return 0; } ``` ##### map大小和交换 函数原型: - size(); - empty(); - swap(st); - ```c++ #include<algorithm> #include<map> #include<iostream> using namespace std; void printList(const map<int,int>&l){ for(map<int,int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<"key: "<<(*it).first<<" value"<<it->second<<" "<<endl; } cout<<endl; } void test02(){ map<int,int>m; m.insert(pair<int,int>(1,10)); m.insert(pair<int,int>(2,20)); m.insert(pair<int,int>(3,30)); m.insert(pair<int,int>(4,40)); m.insert(pair<int,int>(5,50)); printList(m); cout<<m.size()<<endl; cout<<m.empty()<<endl; map<int,int>m2; m2.insert(pair<int,int>(100,10)); cout<<"交换前:"<<endl; printList(m); printList(m2); m2.swap(m); cout<<"交换后:"<<endl; printList(m); printList(m2); } int main(){ test02(); return 0; } ``` ##### map插入和删除 - insert(elem);//插入 - insert(make_pair(2,20)); - clear();//清空 - erase(pos);//删除迭代器位置的 - erase(beg,end);//删除区间的 - erase(key);//删除key的 - ```c++ #include<algorithm> #include<map> #include<iostream> using namespace std; void printList(const map<int,int>&l){ for(map<int,int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<"key: "<<(*it).first<<" value"<<it->second<<" "<<endl; } cout<<endl; } void test03(){ map<int,int>m; m.insert(make_pair(10,20)); m.insert(pair<int,int>(20,30)); printList(m); //可以利用key访问value cout<<m[20]<<endl; //删除 m.erase(m.begin()); printList(m); m.erase(20); cout<<"删除元素key为:20"<<endl; printList(m); } int main(){ test03(); return 0; } ``` ####map查找和统计 - find(key);//查找key的值 - count(key);//统计key元素的个数 - ```c++ #include<algorithm> #include<map> #include<iostream> using namespace std; void printList(const map<int,int>&l){ for(map<int,int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<"key: "<<(*it).first<<" value"<<it->second<<" "<<endl; } cout<<endl; } void test04(){ map<int,int>m; m.insert(make_pair(10,20)); m.insert(pair<int,int>(20,30)); m.insert(pair<int,int>(40,50)); map<int,int>::iterator pos = m.find(20); if(pos!=m.end()){ cout<<"查找到了:key="<<(*pos).first<<" value="<<(*pos).second<<endl; }else{ cout<<"未查找到"<<endl; } int num =m.count(20); cout<<"nums= "<<num<<endl; } int main(){ test04(); return 0; } ``` #### map排序规则 - 仿函数改变排序规则 - ```c++ #include<algorithm> #include<map> #include<iostream> using namespace std; class MyCompare{ public: bool operator()(int v1,int v2){ //降序 return v1>v2; } }; void test05(){ map<int,int,MyCompare>m; m.insert(make_pair(10,20)); m.insert(pair<int,int>(20,30)); m.insert(pair<int,int>(40,50)); for(map<int,int,MyCompare>::const_iterator it=m.begin();it!=m.end();it++){ cout<<"key: "<<(*it).first<<" value"<<it->second<<" "<<endl; } } int main(){ test05(); return 0; } ``` - 对于自定义数据类型,map和set容器一样必须指定排序规则
{{ item.content }}
{{ child.content }}