map基本概念:
简介:
- map中所有元素都是pair
- pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值自动排序
本质:
- map/multimap属于关联式容器,底层结构是二叉树实现
优点:
map和multimap区别:
-
map不允许容器中有重复key值元素
-
multimap允许容器中有重复key值元素
map构造和赋值:
构造:
-
map<T1,T2> mp:map默认构造函数
-
map(const map &map):拷贝构造函数
赋值:
-
map& operator=(const map &map):重载等号操作符
#include<bits/stdc++.h>
using namespace std;
void printmap(map<int,int>&m){
for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
cout<<"key="<<(*it).first<<" values:"<<it->second<<endl;
}
cout<<endl;
}
//map容器构造和赋值
void test01(){
map<int,int>m;
m.insert(pair<int,int>(1,10));
m.insert(pair<int,int>(3,30));
m.insert(pair<int,int>(2,20));
m.insert(pair<int,int>(4,40));
printmap(m);
//拷贝构造
map<int,int>m2(m);
printmap(m2);
//赋值
map<int,int>m3;
m3=m2;
printmap(m3);
}
int main(){
test01();
return 0;
}
map大小和交换
函数原型:
-
size():返回容器中元素的数目
-
empty():判断容器是否为空
-
swap(st):交换两个集合
#include<bits/stdc++.h>
using namespace std;
//map容器的大小与交换
void printmap(map<int,int>m){
for(map<int,int>::const_iterator it=m.begin();it!=m.end();it++){
cout<<"keys:"<<(*it).first<<" values:"<<it->second<<endl;
}
cout<<endl;
}
void test01(){
map<int,int>m1;
m1.insert(pair<int,int>(1,10));
m1.insert(pair<int,int>(2,20));
m1.insert(pair<int,int>(3,30));
m1.insert(pair<int,int>(4,40));
printmap(m1);
if(m1.empty()){
cout<<"容器为空"<<endl;
}
else {
cout<<"容器不为空"<<endl;
cout<<"容器的容量为:"<<m1.size()<<endl;
}
}
//交换
void test02(){
map<int,int>m1;
m1.insert(pair<int,int>(1,10));
m1.insert(pair<int,int>(2,20));
m1.insert(pair<int,int>(3,30));
m1.insert(pair<int,int>(4,40));
printmap(m1);
map<int,int>m2;
m2.insert(pair<int,int>(1,1000));
m2.insert(pair<int,int>(2,2000));
m2.insert(pair<int,int>(3,3000));
m2.insert(pair<int,int>(4,4000));
cout<<"交换前:"<<endl;
printmap(m1);
printmap(m2);
cout<<"交换后:"<<endl;
//交换
m2.swap(m1);
printmap(m1);
printmap(m2);
}
int main(){
//test01();
test02();
return 0;
}
map的插入和删除
函数原型:
-
insert(elem):在容器中插入元素
-
clear():清除所有元素
-
erase(pos):删除pos迭代器所指的元素,返回下一个元素的迭代器
-
erase(beg,end):删除区间[beg,end)的所有元素,返回下一个元素的迭代器
-
erase(key):删除容器中的值为key的元素
#include<bits/stdc++.h>
using namespace std;
void printmap(map<int,int>m){
for(map<int,int>::const_iterator it=m.begin();it!=m.end();it++){
cout<<"keys:"<<(*it).first<<" values:"<<it->second<<endl;
}
cout<<endl;
}
void test01(){
map<int,int>m;
//插入
//第一种
m.insert(pair<int,int>(1,10));
//第二种
m.insert(make_pair(2,20));
m.insert(make_pair(3,30));
m.insert(make_pair(4,40));
//第三种
m.insert(map<int,int>::value_type(5,50));
//第四种
m[6]=60;
printmap(m);
cout<<m[7]<<endl;
printmap(m); //新插入了一个keys:7 values:0,不建议用[]插入,但可以通过key访问value
//删除
m.erase(m.begin());
printmap(m);
//按照key删除
m.erase(7);
printmap(m);
//删除区间的元素
m.erase(m.begin(),m.end());
printmap(m);
}
int main(){
test01();
return 0;
}
map查找和统计
函数原型:
-
find(key):查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end()
-
count(key):统计key的元素个数
#include<bits/stdc++.h>
using namespace std;
void printmap(map<int,int>m){
for(map<int,int>::const_iterator it=m.begin();it!=m.end();it++){
cout<<"keys:"<<(*it).first<<" values:"<<it->second<<endl;
}
cout<<endl;
}
//map查找与统计
void test01(){
//查找
map<int,int>m;
m.insert(make_pair(1,10));
m.insert(make_pair(2,20));
m.insert(make_pair(3,30));
m.insert(make_pair(4,40));
map<int,int>::iterator pos=m.find(4);
if(pos!=m.end()){
cout<<"查到了元素key="<<(*pos).first<<" values:"<<pos->second<<endl;
}
else{
cout<<"未找到元素"<<endl;
}
//统计 map不允许插入key重复的元素
int num=m.count(3);
cout<<"num的值:"<<num<<endl;
}
int main(){
test01();
return 0;
}
map容器的排序:
#include<bits/stdc++.h>
using namespace std;
class cmp{
public:
bool operator ()(int v1,int v2){
//降序
return v1>v2;
}
};
void printmap(map<int,int>m){
for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
cout<<"key="<<it->first<<" values="<<it->second<<endl;
}
cout<<endl;
}
//map容器排序
void test01(){
map<int,int,cmp>m;
m.insert(make_pair(1,10));
m.insert(make_pair(2,20));
m.insert(make_pair(3,30));
m.insert(make_pair(4,40));
m.insert(make_pair(5,50));
for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
cout<<"key="<<it->first<<" values="<<it->second<<endl;
}
cout<<endl;
}
int main(){
test01();
return 0;
}