简介
- map 是一种 关联容器,容器中的每个元素都由 关键字 (key) 和 值 (value) 两部分组成,且每个元素的关键字不允许相同
- map 中每个元素都按关键字 (key) 排序,容器中的元素始终遵循严格的顺序,所有插入的元素都按此顺序指定一个位置。
- map 内部是用红黑树 (一种自平衡二叉查找树) 实现的
- 容器使用分配器对象动态处理其存储需求。
- map 可以在 O(log n) 时间内进行查找,插入和删除操作
C++ STL 中 map 的用法
- 头文件
#include <map>
- 需要使用 std 命名空间
using namespace std;
- C++ 中的 map 模板以泛型方式实现,可以存储任意类型的数据
- map中元素
typedef pair< const Key, T > value_type;
- 下文中含有
c++11
标签的为 C++ 11 中的新特性
1.定义(初始化)map
map<int,double> m;
定义一个key为int类型,value为int类型的mapmap<int,double,less<int> > m;
map 内部元素按升序排列map<int,double,greater<int> > m;
map 内部元素按降序排列
注:有关内存分配器 (allocator) 的使用本文不进行描述,想要了解有关内容可以查阅 c++ 官方手册
2.向 map 中插入元素
使用 [] 操作符插入元素
m[0] = 1.23
// key = 0,value = 1.23
使用 insert 方法插入元素(前 key 后 value)
m.insert(pair<int, double>(1, 2.34))
m.insert(make_pair(2, 3.14))
m.insert(map<int, double>::value_type(3, 4.56))
使用 emplace 方法构造并插入元素 c++11
m.emplace(pair<int, double>(1, 2.34))
m.emplace(make_pair(2, 3.14))
m.emplace(map<int, double>::value_type(3, 4.56))
使用 emplace_hint 方法构造并插入元素 c++11
auto it = m.emplace(make_pair(2, 3.14));
m.emplace_hint(it.first,pair<int, double>(1, 2.34));
m.emplace_hint(it.first,make_pair(2, 3.14));
m.emplace_hint(it.first,map<int, double>::value_type(3, 4.56));
emplace 和 emplace_hint 具体用法及区别
3.查找 map 中元素
m.find(key)
查找指定 key 是否存在,存在返回指向该 key 的迭代器,否则返回指向 m.end() 的迭代器m.count(key)
返回 key 对应的元素个数
由于 map 容器 key 不允许重复,因此返回值为 1 或 0
4.删除 map 中元素
m.erase(key)
通过 key 删除元素m.erase(it)
删除迭代器 it 指向的元素m.erase(begin,end)
删除两个迭代器之间的元素m.clear()
清空 map 中所有元素
//使用迭代器刪除 key 为 2 的元素
map<int,double>::iterator it = m.find(2);
m.erase(it);
//使用迭代器刪除范围内元素
m.erase(m.begin(), m.end());
5.遍历 map 中元素
m[i]
使用 [] 操作符获取 key 为 i 元素的 valuem.at(i)
使用 at 方法获取 key 为 i 元素的 valueC++11
(*it).first
使用迭代器获取元素的 key(*it).second
使用迭代器获取元素的 value
迭代器的获取:
m.begin()
返回指向 map 首元素的迭代器m.end()
返回指向 map 尾元素位置+1的迭代器m.rbegin()
返回指向 map 尾元素的反向迭代器m.rend()
返回指向 map 首元素位置+1的反向迭代器m.cbegin()
返回指向 map 首元素的常量迭代器C++11
m.cend()
返回指向 map 尾元素位置+1的常量迭代器C++11
m.crbegin()
返回指向 map 尾元素的反向常量迭代器C++11
m.crend()
返回指向 map 首元素位置+1的反向常量迭代器C++11
注:常量迭代器 (const_iterator) 只能用于访问元素,不能修改元素
//直接访问元素
//注意:如果map中key不连续,空元素会返回0
for(int i=0;i<m.size();i++)
{
cout<<i<<" "<<m[i]<<endl;
}
//使用迭代器遍历map容器
map<int, double>::iterator it;
for(it=m.begin();it!=m.end();it++)
{
//cout<<(*it).first<<" "<<(*it).second<<endl; //也可以这样访问元素
cout<<it->first<<" "<<it->second<<endl;
}
//使用常量迭代器遍历map容器
map<int, double>::const_iterator it;
for(it=m.cbegin();it!=m.cend();it++)
{
cout<<it->first<<" "<<it->second<<endl;
}
//使用反向迭代器遍历map容器
map<int, double>::reverse_iterator it;
for(it=m.rbegin();it!=m.rend();it++)
{
cout<<it->first<<" "<<it->second<<endl;
}
//使用反向常量迭代器遍历map容器
map<int, double>::const_reverse_iterator it;
for(it=m.crbegin();it!=m.crend();it++)
{
cout<<it->first<<" "<<it->second<<endl;
}
6.其他方法
m.empty()
判断 map 容器是否为空,空返回1,非空返回0m.size()
返回 map 容器大小(元素个数)m.max_size()
返回 map 容器可以容纳的最大元素个数m1.swap(m2)
交换 map m1 m2m.upper_bound(key)
返回 key 大于给定 key 第一个位置的迭代器m.lower_bound(key)
返回 key 大于等于给定 key 第一个位置的迭代器m.key_comp()
返回比较元素 key 的 key_compare 对象m.value_comp()
返回比较元素 value 的 value_compare 对象m.get_allocator()
返回内存分配器对象m.equal_range(key)
返回 pair 其中 pair::first 为 lower_bound 元素,pair::second 为 upper_bound 元素