介绍
map
是一个封装红黑树 (自平衡二叉树) 的关联容器。容器中每个元素都是 key/value,其中 key 为排序对象。每个 key 只能出现一次,不允许重复出现。
map
定义于头文件 <map>
中,其声明如下:
template<
class Key,
class T,
class Compare = std::less<Key>,
class Allocator = std::allocator<std::pair<const Key, T> >
> class map;
map
容器是一个类。
map
容器存储元素都是key/value
(键值对)。
初始化
map
容器需要指定排序规则,有两种方式可指定:
- 元素类型重载小于号运算符。
strcut T { …… // 各种参数 // 该函数声明必须这样写 friend bool operator <(const T& a,const T& b) { // check(a,b)为 a < b 成立条件 return check(a,b) ? true : false; } };
- 以 类型参数 定义,需要定义一个 函数对象。如
set<T,greater<T> >
。struct Cmp { bool operator()(const T& a,const T& b) { // check(a,b)为 a < b 成立条件 return check(a,b) ? true : false; } }; class Cmp { public: bool operator()(const T& a,const T& b) { // check(a,b)为 a < b 成立条件 return check(a,b) ? true : false; } }; // 这两个 Cmp 是等价的 map<int,int,Cmp> s;
以下构造函数都不涉及定义排序规则,均采用默认排序规则——升序。
map<T,T> mp;
创建一个空的map
容器。map<int,string> mp;
map<T,T> mp({{num1.key,num1.value},{num2.key,num2.value},……});
创建一个以初值列元素为初值的map
容器。map<int,string> mp({{0,"zero"},{1,"one"}});
map<T,T> mp = {{num1.key,num1.value},{num2.key,num2.value},……};
创建一个以初值列元素为初值的map
容器。map<int,string> mp = {{0,"zero"},{1,"one"}};
map<T,T> mp(mp1);
创建一个 mp1 的同型拷贝 (所有元素都被复制)。map<int,string> mp1 = {{0,"zero"},{1,"one"}}; map<int,string> mp(mp1);
map<T,T> mp = mp1;
创建一个 mp1 的同型拷贝 (所有元素都被复制)。map<int,string> mp1 = {{0,"zero"},{1,"one"}}; map<int,string> mp = mp1;
map<T,T> mp(begin_iterator,end_iterator);
创建一个以迭代器区间为 [begin_iterator,end_iterator) 作为元素初值的map
容器。map<int,string> mp1 = {{0,"zero"},{1,"one"}}; map<int,string> mp(mp1.begin(),mp1.end());
修改
map
容器禁止修改元素内容。
由于 map
容器元素内容为 key/value
,因此 map
容器提供了根据 key
获取 value
的方法。
at(key)
返回键值 key 对应的 value 的引用。如果不存在,则返回std::out_of_range
。operator[key]
返回键值 key 对应的 value 的引用。如果不存在,则插入该键值对。- 迭代器
这种方法需要遍历map
容器。
迭代器指向的是map
容器中的元素,欲获取其中的键和值,需如下使用:map<int,string>::iterator ite = mp.begin(); cout << "键:" << (*ite).first << endl; cout << "值:" << (*ite).second << endl;
查询
empty()
判断map
容器是否为空。size()
返回map
容器中的元素个数。max_size()
返回map
容器大小的理论极限值,即当前内存情况下,允许创建map
容器中元素个数的最大可能值。count(key)
返回map
容器中键值为 key 的元素个数。find(key)
判断map
容器中是否存在键值为 key 的元素,存在返回相应迭代器,否则返回end()
。
比较
按照字典序列比较 map
中的值。
- operator ==
- operator !=
- operator <
- operator <=
- operator >
- operator >=
if(mp == mp1)
{
cout << "mp == mp1" << endl;
}
增加
增加元素,需要传递键值对。在 map
容器中,通常构造 pair<> 进行传递。
operator[]
这是一种特殊的添加元素方法,而且也是平时使用次数比较多的方法。map<int,string> mp; mp[0] = "zero"; mp[1] = "one";
insert(pair<T,T>())
向map
容器中插入一个元素。
其返回值为pair<map<T,T>::iterator,bool>
,map<T,T>::iterator
指向插入元素位置的迭代器,bool
表示插入是否成功 (如果容器中存在该值,则会插入不成功)。insert(pair<int,string>(5,"five"));
insert(begin_iterator,end_iterator)
向map
容器中迭代器区间 [start_iterator,end_iterator) 内的所有元素,元素可能插入不成功。无返回值。map<int,string> mp1 = {{0,"zero"},{1,"one"}}; map<int,string> mp = {{0,"hhh"}}; mp.insert(mp1.begin(),mp1.end()); // 此时 mp 容器元素依次为:{0,,"hhh"},{1,"one"} // mp1 中第一个元素插入失败,第二个元素插入成功
删除
clear()
清空map
容器。erase(pos_iterator)
移除map
容器指定迭代器位置 pos_iterator 的元素。map<int,string> mp = {{0,"zero"},{1,"one"}}; mp.erase(mp.begin()); // 此时 map 容器元素依次为:{0,"zero"}
erase(begin_iterator,end_iterator)
移除map
容器指定迭代器位区间 [begin_iterator,end_iterator) 中的所有元素。map<int,string> mp = {{0,"zero"},{1,"one"}}; mp.erase(mp.begin(),++mp.begin()); // 此时 map 容器元素依次为:{0,"zero"}
erase(key)
移除map
容器中键值为 key 的元素 (如果存在的话)。返回值表示移除元素个数。
其他操作
equal_range(key)
返回键值等于 key 的迭代器区间。
其返回值为pair<map<T,T>::iterator,map<T,T>::iterator>
,map<T,T>::iterator
指向第一个元素键值等于 key 的迭代器位置,第二个map<T,T>::iterator
指向最后一个元素键值等于 key 迭代器位置的下一个位置。map<int,string> mp = {{0,"zero"},{1,"one"}}; pair<map<int,string>::iterator,map<int,string>::iterator> result = mp.equal_range(0);
lower_bound(key) / upper_bound(key)
返回首个元素值 ≥key\ge key≥key 的元素迭代器位置。
返回首个元素值 >key> key>key 的元素迭代器位置。
两者返回值刚好构成equal_range()
的返回值。