简介
map中所有的元素都是pair(对组)。
pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
所有元素会根据元素的键值来自动排序。
本质
底层结构是二叉树。
优点
快速通过key值找到value。
map容器与multimap容器区别?
map容器不允许容器中有重复的key值元素。
multimap容器允许容器中有重复的key值。multi(多,多重)
#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 << "key = " << (*it).first << " value = " << it->second << endl;
}
}
int main(int argc,char *argv[])
{
//1. 创建map容器。
map<int,int> m;
//2. 创建几个对组。
pair<int,int> p1(1,10);
pair<int,int> p2(2,20);
pair<int,int> p3(3,30);
pair<int,int> p4(4,40);
pair<int,int> p5(5,50);
//3. 将这些对组放在容器中。
m.insert(p1);
m.insert(p3);
m.insert(p2);
m.insert(p5);
m.insert(p4);
printMap(m);
cout << "--------------" << endl;
map<int,int> m2(m);
printMap(m2);
cout << "--------------" << endl;
map<int,int> m3;
m3 = m2;
printMap(m3);
if(m3.empty())
{
cout << "m3为空" << endl;
}
else{
cout << "m3不为空" << endl;
cout << "m3的大小:" << m3.size() << endl;
}
map<int,int> m4;
pair<int,int> p11(11,100);
pair<int,int> p22(22,200);
pair<int,int> p33(33,300);
pair<int,int> p44(44,400);
pair<int,int> p55(55,500);
m4.insert(p11);
m4.insert(p33);
m4.insert(p22);
m4.insert(p55);
m4.insert(p44);
cout << "交换前:" << endl;
printMap(m3);
printMap(m4);
m3.swap(m4);
cout << "交换后:" << endl;
printMap(m3);
printMap(m4);
m3.erase(11);
printMap(m3);
return 0;
}
构造:
map<T1,T2> mp; //map默认构造函数
map(const map &mp); //拷贝构造函数
赋值:
map& operator=(const map&mp); //重载等号操作符 operator(操作符)
大小和交换
size(); //返回容器中元素的数目
empty(); //判断容器是否为空 empy(空的;空洞的,)
swap(); //交换两个集合容器 swap(交换)
插入与删除
insert(elem); //在容器中插入元素 insert(插入)
clear(); //清除所有元素 clear(清除)
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end);//删除区间[beg,end)的所有元素,返回下一个元素的迭代器
erase(key); //删除容器中值为key的元素。 erase(擦除)
查找与统计
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器,如不存在,返回set.end();
count(key); //统计key的元素个数 count(数数;计数)
map容器排序。
学习目标:
map容器默认排序规则按照从大到小排序,掌握住如何改变排序的规则,key值是整型。
技术点:仿函数。(重载后的()运算符调用)list容器是全局,set/map是类内
#include <iostream>
using namespace std;
#include <map>
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;
}
}
int main(int argc,char *argv[])
{
//1. 创建map容器
map<int,int,Mycompare> m; //默认是升序的。
//2. 将对组插入到容器
m.insert(make_pair(2,20));
m.insert(make_pair(1,10));
m.insert(make_pair(5,50));
m.insert(make_pair(4,40));
m.insert(make_pair(3,30));
printMap(m);
return 0;
}