🗺️map / multimap - 映射

STL中map/multimap类的详细介绍

map / multimap 基本概念

map 的特性是,所有的元素都会根据元素的键值自动排序;

map 的所有元素都是pair,同时拥有实值和键值。

  • pair的第一元素被视为键值,第二元素被视为实值;

  • map不允许两个元素有相同的键值;

和set类似的原因,我们不能通过迭代器改变map的键值,但我们可以任意修改实值。

map和list在增删元素的时候具有相似的性质。

map和multimap的操作类似,唯一的区别是multimap键值可重复。

map和multimap都是以红黑树作为底层实现机制。

map和multimap包含在同一个头文件中。

map 的遍历

for (map<T1, T2>::iterator it = m.begin(); it != m.end(); it++)
{
    cout << "key = " << it->first << " value = " << it->second << endl;
}

map/multimap 常用API

map 构造函数

map<T1, T2> mapTT; // map默认构造函数
map(const map& mp); // 拷贝构造函数

map 赋值操作

map& operator=(const map& mp); // 重载等号操作符
swap(mp); // 交换两个集合容器

map 大小操作

int size(); // 返回容器中元素的数目
bool empty(); // 判断容器是否为空

map 插入元素操作

pair<iterator, bool> insert(pair<T1, T2> p); // 通过pair的方式插入对象
/*
1. 参数部分可以用pair的构造函数创建匿名对象
2. 也可以使用make_pair创建pair对象
3. 还可以用map<T1, T2>::value_type(key, value)来实现
*/

T2& operator[](T1 key); // 通过下标的方式插入值
// 如果通过下标访问新的键却没有赋值,会自动用默认值填充

map指定排序规则的方式和set类似,都是利用functor在模版类型表的最后一个参数处指定。

map 删除操作

void clear(); // 删除所有元素
iterator erase(iterator pos); // 删除pos迭代器所指的元素,返回下一个元素的迭代器
iterator erase(beg, end); // 删除区间[beg, end)内的所有元素,返回下一个元素的迭代器
erase(keyElem); // 删除容器中key为keyElem的对组

map 查找操作

iterator find(T1 key); 
// 查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end()
int count(T1 keyElem);
// 返回容器中key为keyElem的对组个数,对map来说只可能是0或1,对于multimap可能大于1

iterator lower_bound(T keyElem);
// 返回第一个key>=keyElem元素的迭代器
iterator upper_bound(T keyElem);
// 返回第一个key>keyElem元素的迭代器
pair<iterator, iterator> equal_range(T keyElem);
// 返回容器中key与keyElem上相等的两个上下限迭代器

至此,读者应当对map/multimap的特点及基本操作有了较为全面的认识,使用时API记不清可以回头多看。

最后更新于