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