1.基本概念
- map容器中所有容器都是pair(成对出现)
- pair中第一个元素是key(索引),第二个值是value(实值)
- 所有元素根据元素键值自动排序
本质:关联式容器,底层为二叉树
优势:
- 根据key查找value
- map中不允许重复值key,value可以重复
- multimap中允许重复值出现 ,key可以重复
2.map函数的构造与赋值
- map<T1,T2> mp;//默认构造函数
- map<const map &mp>;//拷贝构造函数
- map &operator=(const map &mp)//等号赋值
//打印
void printMap(map<int, int>&m)
{
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "key值="<<it->first << " value值="<<it->second<<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,30));
printMap(m);
//拷贝构造
map<int, int> m2(m);
printMap(m2);
//赋值操作
map<int, int> m3;
m3 = m2;
}
3.map容器的大小和交换
size();//返回元素中元素数目
empty();//判断容器是否为空
swap(st);//交换两个集合容器
4.map容器的插入与删除
insert(elem);
clear();
erase(pos);删除pos迭代器指向的元素,返回下一个元素的迭代器
erase(beg,end);
erase(key);//删除容器中键是key的元素,value值输入没用
map<int, int> m;
m.insert(pair<int, int>(1, 10));
//第二种
m.insert(make_pair(2, 20));
//第三种
m.insert(map<int, int>::value_type(3, 30));
//第四种,不建议插入,但可以利用key访问value
m[4] = 40;
printMap(m);
//删除
cout << "-----------" << endl;
m.erase(m.begin());
printMap(m);
cout << "------------" << endl;
m.erase(3);
printMap(m);
5.map容器查找与统计
find(key);//查找key是否存在,存在返回键元素迭代器;不存在,返回end();迭代器需要用iterator接受
cout(key);统计key元素的个数,如key为3有几个这种,具体数值
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));
map<int, int>::iterator pos = m.find(3);
if (pos != m.end())
{
cout << "查找到元素 key=" << pos->first << " value= " << pos->second << endl;
}
else
{
cout << "未查找到该元素" << endl;
}
printMap(m);
int num = m.count(3);
cout << "num= " << num << endl;
6.map排序
利用仿函数改变排序规则
int数据类型
class myCompare
{
public:
bool operator()(int v1, int v2)
{
return v1 > v2;
}
};
//打印
void printMap(map<int, int,myCompare>&m)
{
for (map<int, int,myCompare>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "key值=" << it->first << " value值=" << it->second << endl;
}
}
void test01()
{
map<int, int,myCompare> 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));
printMap(m);
}
自定义数据类型:operator降序排列是改变<>左边的参数,需要调换person与int的位置,编辑第一个参数
//降序排列
class compare
{
public:
bool operator()(const Person &p1,const Person &p2)
{
return p1.m_Age>p2.m_Age;
}
};
//自定义数据类型
void test02()
{
map<Person,int,compare> m;
Person p1("张三", 24);
Person p2("许八", 18);
Person p3("黄芪", 20);
Person p4("王五", 19);
Person p5("李四", 18);
m.insert(make_pair(p1, 1));
m.insert(make_pair(p2, 2));
m.insert(make_pair(p3, 3));
m.insert(make_pair(p4, 4));
m.insert(make_pair(p5, 5));
for (map< Person,int,compare>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "序号为: "<<it->second<<" 姓名:" << it->first.m_Name << " 年龄:" << it->first.m_Age << endl;
}