C++ STL标准模板库——map和multimap
基本概念
- map中所有元素都是pair
- pair中第一个元素为key(键值),起索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值自动排序
map和multimap属于关联式容器,底层结构是用二叉树实现
优点:
- 可以根据key值快速找到value值
map和multimap的区别:
- map不允许容器中有重复key值元素
- multimap允许容器中有重复key值元素
void myprintf(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;
}
构造和赋值
构造:
- map<T1,T2> mp; //默认构造函数
- map(const map &mp); //拷贝构造函数
赋值:
- 操作符 = ;
示例:
void fun()
{
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));
myprintf(m);
map<int, int> m1(m);
myprintf(m1);
map<int, int> m2;
m2 = m1;
myprintf(m2);
}
大小和交换
- size(); //返回容器中元素的个数
- empty(); //判断容器是否为空
- swap(); //交换两个容器的元素
示例:
void fun()
{
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));
myprintf(m);
/*if (!m.empty())
{
cout << "m不为空" << endl;
cout << "m大小为:" << m.size() << endl;
}
else
{
cout << "m为空" << endl;
}*/
map<int, int> m1;
m1.insert(make_pair(6, 90));
m1.insert(make_pair(7, 60));
m1.insert(make_pair(8, 70));
m1.insert(make_pair(9, 80));
myprintf(m1);
cout << "交换后" << endl;
m.swap(m1);
myprintf(m);
myprintf(m1);
}
插入和删除
- insert(); //在容器中插入元素
- clear(); //清除容器中的所有元素
- erase(pos); //删除pos迭代器所指的元素
- erase(beg,end); //删除区间[beg,end]内所有的元素
- erase(key); //删除容器中值为key的元素
示例:
void fun()
{
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));
myprintf(m);
m.erase(m.begin());
myprintf(m);
m.erase(3);
myprintf(m);
m.clear();
m.erase(m.begin(),m.end());
myprintf(m);
}
查找和统计
- find(key); //查找key是否存在,若存在,返回该键元素的迭代器,若不存在,返回map.end()
- count(key); //统计key的元素个数
示例:
void fun()
{
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));
myprintf(m);
map<int, int>::iterator its = m.find(3);
if (its!=m.end())
{
cout << "找到了Key=" << its->first << " value=" << its->second << endl;
}
else
{
cout << "没有找到" << endl;
}
int num=m.count(20);
cout << num << endl;
}
排序
map容器默认是按照key值从小到大排序,可以利用仿函数,改变排序规则
示例:
//map的排序
#include<iostream>
#include<map>
using namespace std;
class mycompare
{
public:
bool operator()(int a,int b)
{
return a > b;
}
};
void myprintf(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;
}
cout << endl;
}
void fun()
{
map<int, int, mycompare> m;
m.insert(make_pair(1, 10));
m.insert(make_pair(4, 20));
m.insert(make_pair(3, 30));
m.insert(make_pair(2, 40));
myprintf(m);
}
int main()
{
fun();
return 0;
}