map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元
素。
在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的
内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型
value_type绑定在一起,为其取别名称为pair:
typedef pair<const key, T> value_type; std::pair template <class T1,class T2> struct pair; std::make_pair 构造一个匿名的pair返回
在内部,map中的元素总是按照键值key进行比较排序的。
map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序
对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。
map构造
map<int, double> m1; //构造一个key为int类型,value为double类型的空容器
map<int, double> m2(m1); //拷贝构造
map<int, double> m3(m2.begin(), m2.end()); //利用迭代器拷贝构造
map<int, double, greater<int>> m4; //按int降序排序
map的插入
m.insert(pair<int, string>(2, "two"));
或者
m.insert(make_pair(2, "two"));
insert的返回值也是一个pair对象,pair中第一个成员类型是插入的map的迭代器类型,第二个成员类型是bool类型
bool类型的作用如下
- 若待插入元素的键值key在map当中不存在,则insert函数插入成功,并返回插入后元素的迭代器和true。
- 若待插入元素的键值key在map当中已经存在,则insert函数插入失败,并返回map当中键值为key的元素的迭代器和false。
map其他常用成员函数
m.erase(3); // 3 为key
m.find(4); // 返回key=4的迭代器,否则返回m.end()。
map<int, string>::iterator pos = m.find(4);
可以这样用
if (pos != m.end())
{
m.erase(pos);
}
//获取容器中元素的个数
cout << m.size() << endl;
//容器中key值为2的元素个数
cout << m.count(2) << endl;
//清空容器
m.clear();
//容器判空
m.empty();
//交换两个容器中的数据
map<int, string> m;
map<int, string> tmp;
m.swap(tmp);
map的迭代器相关函数
成员函数 | 功能 |
---|---|
begin | 返回map中起始位置元素的迭代器 |
end | 返回map中最后一个元素后面的迭代器 |
rbegin | 返回map第一个元素的反向迭代器 |
rend | 返回map最后一个元素下一个位置的反向迭代器 |
操作
// 正向迭代器遍历
map<int, string>::iterator it = m.begin();
while (it != m.end())
{
cout << it->first << "-" << it->second << endl;
it++;
}
// 反向迭代器遍历
map<int, string>::reverse_iterator it2 = m.rbegin();
while (it2 != m.rend())
{
cout << it2->first << "-" << it2->second << endl;
it2++;
}