一、 map基本概念
简介:
map中所有元素都是pair
pair中第一个元素为key(键值),起到索引惟用,第二个元素为value(实值)
所有元素都会根据元素的键值自动排序
本质:
map/multimap属于关联式容器,底层结构是用二叉树实现
优点:
可以根据key值快速找到value值
map和multimap区别:
map不允许容器中有重复key值元素
multimap允许容器中有重复key值元素
二、 map构造和赋值
函数原型:
构造:
map<T1,T2> mp;
//map默认构造函数:
map(const map &mp);
//拷贝构造函数
赋值:
map& operator=(const map &mp);
//重载等号操作符
#include<iostream>
using namespace std;
#include<map>
void print(map<int, int>& m)
{
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "key=" << (*it).first << "value=" << (*it).second << endl;
}
cout << endl;
}
void test()
{
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, 40));
print(m);
map<int, int> m1(m);
print(m1);
map<int, int>m2;
m2 = m;
print(m2);
}
int main()
{
test();
return 0;
}
三、map大小和交换
函数原型:
size();
//返回容器中元素的数目
empty();
//判断容器是否为空
swap(st);
//交换两个集合容器
#include<iostream>
using namespace std;
#include<map>
void print(map<int, int>& m)
{
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "key=" << (*it).first << "value=" << (*it).second << endl;
}
cout << endl;
}
void test()
{
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, 40));
print(m);
if (m.empty())
{
cout << "m为空" << endl;
}
else
{
cout << "m不为空" << endl;
cout << "m大小为:" << m.size() << endl;//4
}
map<int, int> m2;
m2.insert(pair<int, int>(5, 100));
m2.insert(pair<int, int>(6, 200));
m2.insert(pair<int, int>(7, 300));
m2.insert(pair<int, int>(8, 400));
cout << "交换前:" << endl;
print(m);
print(m2);
cout << "交换后:" << endl;
m.swap(m2);
print(m);
print(m2);
}
int main()
{
test();
return 0;
}
四、 map插入和删除
函数原型:
insert(elem);
//在容器中插入元素。
clear();
//清除所有元素
erase(pos);
//删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg, end);
//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(key);
//删除容器中值为key的元素
#include<iostream>
using namespace std;
#include<map>
void print(map<int, int>& m)
{
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "key=" << (*it).first << "value=" << (*it).second << endl;
}
cout << endl;
}
void test()
{
map<int, int> m;
//第一种
m.insert(pair<int, int>(1, 10));
print(m);
//第二种
m.insert(make_pair(2, 20));
print(m);
m.erase(m.begin());
print(m);
m.erase(1);
print(m);
m.erase(m.begin(), m.end());
print(m);
m.clear();
print(m);
}
int main()
{
test();
return 0;
}
五、 map查找和统计
函数原型:
find(key);
//查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key);
//统计key的元素个数
#include<iostream>
using namespace std;
#include<map>
void test()
{
map<int, int>m;
m.insert(make_pair(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(4);
if (pos != m.end())
{
cout << "找到元素 key= " << pos->first << "value=" << pos->second << endl;
}
else
{
cout << "没有找到!" << endl;
}
int num = m.count(4);
cout << "num=" << num << endl;
}
int main()
{
test();
return 0;
}
六、 map容器排序
利用仿函数,可以改变排序规则
#include<iostream>
using namespace std;
#include<map>
class compare
{
public:
bool operator()(const int a,const int b)const
{
//降序
return a > b;
}
};
void test()
{
map<int, int,compare>m;
m.insert(make_pair(1, 10));
m.insert(make_pair(5, 50));
m.insert(make_pair(4, 40));
m.insert(make_pair(6, 60));
m.insert(make_pair(2, 20));
m.insert(make_pair(3, 30));
for (map<int, int,compare>::iterator it = m.begin(); it != m.end(); it++)
{
cout << " key= " << (*it).first << " value= " << it->second << endl;
}
}
int main()
{
test();
return 0;
}