multimap是关联容器,每个元素都有 Key 和 Value 两个部分,并且Key可以重复。
如果需要修改关键字Key需要删除再添加。不能直接修改。
容器中的元素是按照Key进行排序的
类模板
容器模板定义如下:
template < class Key, class T, class Pred = less<Key>, class A = allocator<T> >
class multimap
{
...
typedef pair <const Key, T> value_type;
...
};
关于Key,T, Pred,A的作用见C++中的 set和multiset
可以看出 multimap 中的元素都是 pair 模板类的对象
multimap 中的 value_type
实际上就表示容器中元素的类型。这是在类的内部重新定义了类型 value_type
。
要访问multimap每个元素 i->first
访问Key,i->second
访问Value。i是迭代器。
其他成员函数
成员函数或成员函数模板 | 作 用 |
---|---|
iterator find( const Key & val); | 在容器中查找关键字等于 val 的元素,返回其迭代器;如果找不到,返回 end() |
iterator insert (pair <Key, T> const &p); | 将 pair 对象 p 插入容器中并返回其迭代器 |
void insert(iterator first, iterator last); | 将区间 [first, last) 插入容器 |
int count( const Key & val); | 统计有多少个元素的关键字和 val 相等 |
iterator lower_bound( const Key & val); | 查找一个最大的位置 it,使得 [begin( ), it) 中所有的元素的关键字都比 val 小 |
iterator upper_bound(const Key & val); | 查找一个最小的位置 it,使得 [it, end()) 中所有的元素的关键字都比 val 大 |
pair < iterator, iterator > equal_range (const Key & val); | 同时求得 lower_bound 和 upper_bound |
iterator erase(iterator it); | 删除 it 指向的元素,返回其后面的元素的迭代器(Visual Studio 2010 中如此,但是在 C++ 标准和 Dev C++ 中,返回值不是这样) |
iterator erase(iterator first, iterator last); | 删除区间 [first, last),返回 last(Visual Studio 2010 中如此,但是在 C++ 标准和 Dev C++ 中,返回值不是这样) |
在比较大小时用的是 < 和 > 同时为假,而不是 ==
补充
insert
成员函数使用方法:
mp.insert(make_pair(1,"abc"));
//使用make_pair()获得 pair
mp.insert(multimap<int,string>::value_type(2,"def"));
//使用multimap内部的类型定义一个pair
map
map和multimap的区别就是 map 中的元素Key值不能重复
map 还有一个 T & operator[] (Key k);
成员函数,用来返回 first 的值为 k 的元素的 second 部分的引用。如果没有这样的 first 则添加一个,second部分使用无参构造函数。
使用举例:
string s = mp[2];
cout<<s<<endl;
s = mp.operator[](1);
cout<<s<<endl;