map/multimap容器
map中所有的元素都是pair(对组)
pair中的第一个元素为key(键),起到索引作用
,第二个元素为value(值)
所有元素都会根据元素的键值自动排序
map/multimap是关联式容器,底层结构用
二叉树实现
map和multimap区别
map不允许容器中有重复的key值元素
multimap允许容器中有重复的key值元素
函数原型
size(); //返回容器中的元素个数
empty(); //判断容器是否为空
swap(mp); //交换两个容器
insert(elem); //容器中插入操作,elem是对组
clear(); //容器清空
erase(pos); //删除指定位置元素
erase(beg,end); //删除区间元素
erase(key); //根据key进行删除
find(key); //根据key查找,存在返回对应的迭代器
不存在,则返回mp.end();
count(key); //统计key的个数,map只会返回0和1
#include <iostream>
#include <string>
#include <deque>
#include <algorithm>
#include <list>
#include <set>
#include <map>
using namespace std;
/*
map容器中所有元素都是成对(pair)出现,插入元素时需要使用对组
*/
void printMap(const map<int, int> &mp)
{
for (map<int, int>::const_iterator it=mp.begin(); it != mp.end(); it++)
{
cout<<"key:"<<(*it).first<<" "<<"value:"<<it->second<<endl;
}
cout<<endl;
}
//构造、拷贝函数,赋值操作
void test1()
{
map<int, int> mp;
//以pair<int, int>对组匿名对象作为插入参数
mp.insert(pair<int, int>(1, 20));
mp.insert(pair<int, int>(4, 30));
mp.insert(pair<int, int>(2, 40));
mp.insert(pair<int, int>(3, 10));
printMap(mp); //输出结果以key进行排序
//map拷贝构造函数
map<int, int> mp1(mp);
printMap(mp1);
//map赋值操作
map<int, int> mp2 = mp1;
printMap(mp2);
}
//empty、size和swap使用
void test2()
{
map<int, int> mp;
mp.insert(pair<int,int>(1, 20));
mp.insert(pair<int,int>(2, 10));
mp.insert(pair<int,int>(3, 30));
if (mp.empty())
{
cout<<"mp容器为空"<<endl;
}
else
{
cout<<"mp容器不为空"<<endl;
cout<<"size:"<<mp.size()<<endl;
}
map<int, int> mp1;
mp1.insert(pair<int,int>(4, 20));
mp1.insert(pair<int,int>(5, 10));
mp1.insert(pair<int,int>(6, 30));
mp.swap(mp1);
printMap(mp);
printMap(mp1);
}
void test3()
{
map<int, int> mp;
//第一种
mp.insert(pair<int, int>(1, 20));
//第二种
mp.insert(make_pair(2, 30));
//第三种
mp.insert(map<int, int>::value_type(3, 40));
//第四中,不建议做插入操作,即使键不存在,会返回value默认值0
//一般用于根据key来获取对应的value值
mp[4] = 50;
printMap(mp);
cout<<mp[5]<<endl;//即使键为5的不存在,也会返回值,不会报错
//根据迭代器位置进行删除
mp.erase(mp.begin());
printMap(mp);
//根据key进行删除
mp.erase(4);
printMap(mp);
//根据区间进行删除
mp.erase(mp.begin(), mp.end());
printMap(mp);
}
void test4()
{
map<int, int> mp;
mp.insert(pair<int, int>(1, 10));
mp.insert(pair<int, int>(2, 20));
mp.insert(pair<int, int>(3, 30));
map<int, int>::iterator pos = mp.find(3);
if (pos != mp.end())
{
cout<<"find:"<< pos->first <<" "<<pos->second<<endl;
}
else
{
cout<<"not find"<<endl;
}
//count统计,结果只会0或1, map不允许插入相同的key元素,multimap可以插入重复的key
cout<<"count:"<<mp.count(3);
}
//自定义排序
class MyCompare
{
public:
bool operator()(int v1, int v2)
{
return v1>v2;
}
};
void test5()
{
map<int, int, MyCompare> mp;
mp.insert(pair<int, int>(1, 10));
mp.insert(pair<int, int>(2, 20));
mp.insert(pair<int, int>(3, 30));
for (map<int, int ,MyCompare>::iterator it=mp.begin(); it!=mp.end(); it++)
{
cout<<it->first<<" "<<it->second<<endl;
}
cout<<endl;
}
int main()
{
test5();
}