导航
1.map基本认识,构造和赋值
2.map容器的大小与交换
3.map容器的插入与删除
4.map的查找与统计
5.map的排序
———————————————————————————————————
1.map基本认识,构造和赋值
1.map中所有元素时pair,是成对出现的
2.pair中第一个元素为key,起索引作用,第二个元素为value(实值)
3.所有元素会根据元素的键值自动排序
本质:都是关联式,底层结构用的是二叉树
优点:可以根据key值快速找到value
区别:
1.map中不允许有重复的key值元素,value值可以有重复
2.multimap允许有重复key值元素,value值可以有重复
构造函数:
map< T1,T2> mp; //注意有两个参数
map(const map& mp); //拷贝构造
赋值:
operator= 重载
例子:
#include <iostream> using namespace std; #include <map> void PrintMap(map<int,int>&m) { for(map<int,int>::iterator it = m.begin();it!=m.end();it++) { cout<<(*it).first<<" "<<(*it).second<<endl; //输入成组数据时用first和second } cout<<endl; } void test() { map<int,int> mp; mp.insert(pair<int,int>(1,10)); //插入时要插入成对数用pair mp.insert(pair<int,int>(2,20)); mp.insert(pair<int,int>(4,40)); mp.insert(pair<int,int>(3,30)); //查完之后会根据key值进行自动排序 PrintMap(mp); map<int,int> mp1; mp1 = mp; //operator= 赋值 PrintMap(mp1); map<int,int> mp2(mp1); //拷贝构造 PrintMap(mp2); } int main() { test(); system("pause"); return 0; }
运行结果:
注意点:
1.map容器插入要用pair类型
2.插入的会根据key自动排序
3.输出其中数时,first代表key,second代表value
———————————————————————————————————
2.map容器的大小与交换
size(); //map容器里的大小
empty(); //判断容器是否为空
swap(st); //进行交换容器
———————————————————————————————————
3.map容器的插入与删除
insert()
clear()
erase(pos) //删除对应元素的迭代器指向的元素
erase(beg,end) //删除指向区间元素的迭代器
erase(key) //根据key值来删除value值
可以用[key] 来访问value值
例子:
#include <iostream> using namespace std; #include <map> void PrintMap(map<int,int>&m) { for(map<int,int>::iterator it = m.begin();it!=m.end();it++) { cout<<(*it).first<<" "<<(*it).second<<endl; //输入成组数据时用first和second } cout<<endl; } void test() { map<int,int> mp; //insert插入有好几种 //第一种 mp.insert(pair<int,int>(1,10)); //插入时要插入成对数用pair //第二种 mp.insert(make_pair(2,20)); //第三种 mp.insert(map<int,int>::value_type(3,30)); //第四种 mp[4] = 40; //不太推荐用[]来插入,一旦用[]会默认赋值0 //也可以通过用[]中放入key找到value cout<<mp[2]<<endl; PrintMap(mp); //删除单个用迭代器所指的方向 mp.erase(mp.begin()); PrintMap(mp); //也可以根据key值删除单个 mp.erase(3); PrintMap(mp); //也可以删迭代器所指区间 //mp.erase(mp.begin(),mp.end()); //或者用clear() mp.clear(); PrintMap(mp); } int main() { test(); system("pause"); return 0; }
运行结果:
———————————————————————————————————
4.map的查找与统计
find(key) //找到的话返回该键元素的迭代器,没有找到返回mp.end()
count(key) //统计数量,因为map中没有重复的key值,所以只能返回0或1
例子:
#include <iostream> using namespace std; #include <map> void test() { map<int,int> mp; mp.insert(pair<int,int>(1,10)); //插入两组键值对 mp.insert(make_pair(1,20)); map<int,int>::iterator it = mp.find(1); //find会返回指向对应位置的迭代器,没有找到返回mp.end() if(it != mp.end()) //如果不等说明找到了 { cout<<"找到该元素key:"<<it->first<<" value:"<<it->second<<endl; } else { cout<<"未找到该元素"<<endl; } cout<<"key为1的元素数量:"<<mp.count(1)<<endl; //因为map容器中没有重复的key值对,所以结果只有1或0 } int main() { test(); system("pause"); return 0; }
运行结果:
———————————————————————————————————
5.map的排序
要自定义一个仿函数,自定义规则降序排序
例子:
#include <iostream> using namespace std; #include <map> class MyCompare { public: bool operator()(int v,int v1) //写一个仿函数,自定义排序规则 { return v>v1; } }; void test() { map<int,int,MyCompare> mp; mp.insert(pair<int,int>(1,10)); //插入两组键值对 mp.insert(pair<int,int>(2,20)); mp.insert(pair<int,int>(5,50)); mp.insert(pair<int,int>(4,40)); mp.insert(pair<int,int>(3,30)); //遍历 for(map<int,int>::iterator it = mp.begin();it!=mp.end();it++) { cout<<"key:"<<it->first<<" value:"<<it->second<<endl; } } int main() { test(); system("pause"); return 0; }
运行结果: