C++知识点31——使用C++标准库(关联容器multimap及其初始化,赋值,查找,添加,删除与迭代器失效)

关于关联容器map已经在博客https://blog.csdn.net/Master_Cui/article/details/108690877中介绍完了

multimap和map非常类似,容器中的元素按照key进行排序,只不过map的key不能重复,而multimap的key可以重复

map和multimap使用前,都要添加头文件#include <map>

 

1.multimap的声明与初始化

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

 

6.map的一般操作

同map。见博客https://blog.csdn.net/Master_Cui/article/details/108690877

 

7.map与迭代器失效

同map。见博客https://blog.csdn.net/Master_Cui/article/details/108690877

 

参考

《C++ Primer》

《C++标准库》

http://www.cplusplus.com/reference/map/

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值