关于关联容器map已经在博客https://blog.csdn.net/Master_Cui/article/details/108690877中介绍完了
multimap和map非常类似,容器中的元素按照key进行排序,只不过map的key不能重复,而multimap的key可以重复
map和multimap使用前,都要添加头文件#include <map>
template < class Key, // multimap::key_type
class T, // multimap::mapped_type
class Compare = less<Key>, // multimap::key_compare
class Alloc = allocator<pair<const Key,T> > // multimap::allocator_type
> class multimap;
multimap和map的声明除了名字不同,其余相同,见博客https://blog.csdn.net/Master_Cui/article/details/108690877
multimap();//默认构造函数
explicit multimap (const key_compare& comp, const allocator_type& alloc = allocator_type());//指定key的比较方式的构造函数
explicit multimap (const allocator_type& alloc);
//通过迭代器初始化的普通构造函数
template <class InputIterator>
multimap (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& = allocator_type());
template <class InputIterator>
multimap (InputIterator first, InputIterator last, const allocator_type& = allocator_type());
//拷贝构造
multimap (const map& x);
multimap (const map& x, const allocator_type& alloc);
//列表初始化
multimap (initializer_list<value_type> il, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());
multimap (initializer_list<value_type> il, const allocator_type& alloc = allocator_type());
依然是除了名字不同,其余相同,见博客https://blog.csdn.net/Master_Cui/article/details/108690877
2.multimap的赋值
同map。见博客https://blog.csdn.net/Master_Cui/article/details/108690877
3.multimap的查找
multimap容器的查找函数
size_type count (const key_type& k) const;//计算multimap容器对象中指定key的元素的个数
iterator find (const key_type& k);//查找指定key的元素的所在位置,返回该元素的迭代器,如果没有根据key找到该元素,返回尾后迭代器end()
const_iterator find (const key_type& k) const;
iterator lower_bound (const key_type& k);//查找第一个key>=k的元素,返回该元素的迭代器,如果没有根据key找到该元素,返回尾后迭代器end()
const_iterator lower_bound (const key_type& k) const;
iterator upper_bound (const key_type& k);//查找第一个key>k的元素,返回该元素的迭代器,如果没有根据key找到该元素,返回尾后迭代器end()
const_iterator upper_bound (const key_type& k) const;
pair<const_iterator,const_iterator> equal_range (const key_type& k) const;//将lower_bound和upper_bound的迭代器作为一个pair返回
pair<iterator,iterator> equal_range (const key_type& k);
因为multimap允许一个key对应对个value,所以count函数的返回值并不是非0即1,有可能大于1,所以find函数也是按插入multimap容器对象顺序,返回对应元素的迭代器
示例
void multimapfindtest()
{
multimap<string, int> mulmap;
mulmap.insert(make_pair("egg", 1));
mulmap.insert(make_pair("egg", 2));
mulmap.insert(make_pair("egg", 3));
mulmap.insert(make_pair("egg", 4));
for (multimap<string, int>::iterator it=mulmap.begin();
it!=mulmap.end();/*++it*/) {
if (it==mulmap.find("egg")) {//冗余,只是为了显示find的返回值所指代的元素,可去掉if
cout<<it->second<<endl;
it=mulmap.erase(it);
cout<<"-------"<<endl;
}
}
}
通过上述代码可知,对于同key元素来说,find返回的迭代器指向和元素和插入顺序相同,如果最开始插入的元素被删除,find就返回第二个被插入的同key元素
此外erase返回的是下一个元素的迭代器,不需要自增操作
上面的代码不能这样写
void multimapfindtest()
{
multimap<string, int> mulmap;
mulmap.insert(make_pair("egg", 1));
mulmap.insert(make_pair("egg", 2));
mulmap.insert(make_pair("egg", 3));
mulmap.insert(make_pair("egg", 4));
for (multimap<string, int>::iterator it=mulmap.begin();
it!=mulmap.end();++it) {
if (it==mulmap.find("egg")) {
cout<<it->second<<endl;
mulmap.erase(it);
cout<<"-------"<<endl;
}
}
}
因为没有用erase的返回值更新迭代器,导致it失效,但是之后又对it进行++操作,所以提示尝试对一个失效迭代器自增
即使erase更新迭代器了,也不要在erase时,同时在for循环中自增迭代器
void multimapfindtest()
{
multimap<string, int> mulmap;
mulmap.insert(make_pair("egg", 1));
mulmap.insert(make_pair("egg", 2));
mulmap.insert(make_pair("egg", 3));
mulmap.insert(make_pair("egg", 4));
for (multimap<string, int>::iterator it=mulmap.begin();
it!=mulmap.end();++it) {
cout<<it->second<<endl;
it=mulmap.erase(it);
cout<<"-------"<<endl;
}
}
因为for循环和erase同时更新迭代器,所以跳过了第二个和第四个元素,只删除了第一个和第三个元素,没有将元素全都删除
其余的和map类似,参考博客https://blog.csdn.net/Master_Cui/article/details/108690877
4.multimap的添加
因为multimap的一个key可能对应对个value,所以,multimap没有下标操作,因为无法确定key对应的value,所以multimap不支持下标操作,如果想向multimap对象中添加元素,必须使用insert方法
iterator insert (const value_type& val);//和map略有区别,返回值不同,返回的新插入元素的迭代器
iterator insert (const_iterator position, const value_type& val);
template <class InputIterator>
void insert (InputIterator first, InputIterator last);
void insert (initializer_list<value_type> il);
因为multimap允许一个key对应对个value,所以向multimap对象中插入元素时,一定会成功,不会出现map插入元素时的情况
差别仅此一点,其余的参考博客https://blog.csdn.net/Master_Cui/article/details/108690877
5.multimap的删除
iterator erase (const_iterator position);
size_type erase (const key_type& k);
iterator erase (const_iterator first, const_iterator last);
上述三个函数仅是第二个有略微差别,因为multimap允许一个key对应对个value,第二个函数的返回值有可能大于1
差别仅此一点,其余的参考博客https://blog.csdn.net/Master_Cui/article/details/108690877
同map。见博客https://blog.csdn.net/Master_Cui/article/details/108690877
同map。见博客https://blog.csdn.net/Master_Cui/article/details/108690877
参考
《C++ Primer》
《C++标准库》
http://www.cplusplus.com/reference/map/
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出