map基本概念
简介:
- map中所有元素都是pair
- pair中第一个元素为key(键值) , 起到索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值自动排序
本质:
- map/multimap属于关联式容器,底层结构是用二叉树实现
优点:
map和multimap区别:
- map不允许容器中有重复key值元素
- multimap允许容器中有重复的key值元素
map容器构造和赋值
函数原型:
构造:
- map<T1 , T2>mp; //map默认构造函数
- map(const map &mp) //拷贝构造函数
赋值:
- map& operator=(const map &ma); //重载等号操作符
示例:
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;
}
cout<< endl;
}
void test01()
{
map<int , int>mp;
mp.insert(pair<int , int>(1 , 10));
mp.insert(pair<int , int>(4 , 40));
mp.insert(pair<int , int>(3 , 30));
mp.insert(pair<int , int>(2 , 20));
PrintMap(mp);
map<int, int>m2(mp);
PrintMap(m2);
map<int, int>m3;
m3 = m2;
PrintMap(m3);
}
map容器大小和交换
函数原型:
- size(); //返回容器中元素数目
- empty(); //判断容器是否为空
- swap(); //交换两个集合容器
示例:
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;
}
cout << 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));
if (m.empty())
{
cout << "m为空!" << endl;
}
else
{
cout << "m不为空!" << endl;
cout << "m大小为:" << m.size() << endl;
}
}
void test02()
{
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));
map<int, int>m2;
m2.insert(pair<int, int>(4, 110));
m2.insert(pair<int, int>(5, 220));
m2.insert(pair<int, int>(6, 330));
cout << "交换前" << endl;
PrintMap(m);
PrintMap(m2);
m.swap(m2);
cout << "交换后" << endl;
PrintMap(m);
PrintMap(m2);
}
map容器插入和删除
函数原型:
- insert(elem); //在容器中插入元素
- clear(); //清空所有元素
- erase(pos); //删除pos迭代器所指元素,返回下一个元素的迭代器
- erase(beg , end); //删除区间[beg , end]的所有元素,返回下一个元素的迭代器
- erase(key); //删除容器中值为key的元素
示例:
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;
}
cout << endl;
}
void test01()
{
map<int, int>m;
m.insert(pair<int , int>(1, 10));
m.insert(pair<int , int>(2, 20));
m.insert(make_pair(4, 400));
m.insert(make_pair(5, 500));
m.insert(map<int, int>::value_type(7, 700));
m[8] = 800;
PrintMap(m);
m.erase(m.begin());
PrintMap(m);
m.erase(4);
PrintMap(m);
m.clear();
PrintMap(m);
}
map容器查找和统计
函数原型:
- find(key); //查找key是否存在,返回改键的元素的迭代器,若不存在,返回map.end();
- count(key); //统计key的元素个数
示例:
void test01()
{
map<int, int>m;
m.insert(make_pair(1, 10));
m.insert(make_pair(3, 30));
m.insert(make_pair(2, 20));
m.insert(make_pair(2, 40));
map<int, int>::iterator pos = m.find(3);
if (pos != m.end())
{
cout << "查找了元素 key = " << pos->first << " value = " << pos->second << endl;
}
else
{
cout << "未找到元素!" << endl;
}
int num = m.count(3);
cout << "num = " << num << endl;
}
map容器排序
主要技术:
示例:
class MyCompare
{
public:
bool operator()(int v1, int v2)const
{
return v1 > v2;
}
};
void test01()
{
map<int, int ,MyCompare>m;
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(2, 20));
m.insert(make_pair(3, 30));
m.insert(make_pair(4, 40));
m.insert(make_pair(5, 50));
for (map<int, int , MyCompare>::const_iterator it = m.begin(); it != m.end(); it++)
{
cout << "key = " << it->first << " value = " << it->second << endl;
}
cout << endl;
}