map基本概念
简介:
-
map中所有元素都是pair
-
pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
-
所有元素都会根据元素的键值自动排序
本质:
-
map/multimap属于关联式容器,底层结构是用二叉树实现
优点:
-
可以根据key值快速找到value值
map和multimap区别:
-
map不允许容器中有重复key值元素
-
multimap允许容器中有重复key值元素
map构造和赋值
功能描述:
-
对map容器进行构造和赋值操作
函数原型:
-
map<T1 T2> mp; //map默认构造函数
-
map(const map &mp); //拷贝构造函数
赋值:
-
map& operator=(const map &mp); //重载等号操作符
map大小和交换
功能描述:
-
统计map容器大小以及交换map容器
函数原型:
-
size(); //返回容器中元素的数目
-
empty(); //判断容器是否为空
-
swap(st); //交换两个集合容器
map插入和删除
功能描述:
-
map容器进行插入数据和删除数据
函数原型:
-
insert(elem);
// 在容器中插入元素。
//四种插入方法
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));
//第四种,不建议使用[]插入,但可以使用[]访问
//当错误的使用 [] 赋值时,会在map中额外的插入一个元素
m[4] = 40;
-
clear();
// 清除所有元素 -
erase(pos);
// 删除pos迭代器所指的元素,返回下一个元素的迭代器。 -
erase(beg, end);
// 删除区间[beg, end)的所有元素,返回下一个元素的迭代器。 -
erase(key);
// 删除容器中值为key的元素。
map查找和统计
功能描述:
-
对map容器进行查找数据以及统计数据
函数原型:
-
find(key);
// 查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end(); -
count(key);
// 统计key的元素个数
-
查找 --- find (返回的是迭代器)
-
统计 --- count (对于map,结果为0或者1)
map容器排序
-
map容器默认排序规则为按照key值进行从小到大排序
主要技术点:
-
利用仿函数可以指定map容器的排序规则
-
对于自定义数据类型,map必须要指定排序规则,同set容器
内置数据类型定义仿函数调整map排序方法
#include<iostream>
#include<string>
#include<map>
using namespace std;class myCompare{
public://定义仿函数bool operator()(int a, int b)const{return a > b;}
};
int main(){map<int,string> m1;m1.insert(pair<int,string>(10,"a"));m1.insert(pair<int,string>(20,"b"));m1.insert(pair<int,string>(30,"c"));m1.insert(pair<int,string>(40,"d"));for(map<int,string>::iterator it = m1.begin(); it != m1.end(); it++){cout << it->first << " " << it ->second << endl; }cout << "--------------------------------" << endl;map<int,string,myCompare> m2;m2.insert(pair<int,string>(10,"a"));m2.insert(pair<int,string>(20,"b"));m2.insert(pair<int,string>(30,"c"));m2.insert(pair<int,string>(40,"d"));for(map<int,string,myCompare>::iterator it = m2.begin(); it != m2.end(); it++){cout << it->first << " " << it ->second << endl; }
}
输出结果如下:
自定义数据类型定义仿函数调整map排序方法
如果不定义仿函数,则无法直接按键插入自定义数据类型
#include<iostream>
#include<set>
#include<iostream>
#include<string>
#include<map>
using namespace std;class Person{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};class comparePerson{
public:// 定义仿函数bool operator()(const Person&p1,const Person&p2)const{return p1.m_Age > p2.m_Age;}
};int main(){Person p1("张三",20);Person p2("李四",21);Person p3("王五",22);Person p4("赵六",23);map<Person,string,comparePerson> m1;m1.insert(pair<Person,string>(p1,"a"));m1.insert(pair<Person,string>(p2,"b"));m1.insert(pair<Person,string>(p3,"c"));m1.insert(pair<Person,string>(p4,"d"));for(map<Person,string,comparePerson>::iterator it = m1.begin(); it != m1.end(); it++){cout << " 姓名:" << it->first.m_Name << " 年龄:" << it->first.m_Age << " 等级:" << it ->second << endl; }}
输出结果如下: