让人感到头大的一些multimap的迭代器用法

本文探讨了在解决动态规划问题时遇到的C++ multimap迭代器使用难题,特别是正向和反向迭代器在插入操作时的不同逻辑。文章指出,multimap.end()指向最后一个元素之后,而rend()指向反向迭代器的第一个元素之后。正确使用迭代器避免程序溢出的方法是:end()--用于获取最后一个元素,rend()--用于获取第一个元素。此外,multimap中相同key的排序遵循插入顺序。
摘要由CSDN通过智能技术生成

         这几天因为在研究动态规划:单调减子序列这个问题时,用到了c++的STL容器multimap,结果被它的迭代器搞的鸡飞狗跳。它的迭代器用法有些逻辑是我想明白了的,但有些逻辑又使我感到困扰,尤其是正向迭代器和反向迭代器的插入算法的逻辑居然不一样,非常不解啊!在这里把这些问题列出来,算是一些经验吧。

首先,就是multimap.end()和multimap.rend()这两个迭代器到底是指向何处。经测试,multimap.end()指向multimap最后一个元素之后一个位置,如果直接使用multimap.end()来作为一个pair<>元素的话,程序是要溢出的;multimap.rend()是反向迭代器的最后一个元素之后一个位置,如果直接使用程序也是要溢出。如果要用正向迭代器定位最后一个元素,必须是用multimap.end()--;而要想用反向迭代器定位第一个元素,必须是用multimap.rend()--。

        附带说一下,我们知道multimap是按key的大小有小至大排序的,而multimap允许重复key元素存在,那么相同key怎么排序呢?答案就是当插入相同key的pair时,multimap是按照插入顺序的先后进行排序的。

测试代码:

int main()
{
	multimap<int,int> map_multi;
	multimap<int,int>::iterator iter,last_iter;
	multimap<int,int>::reverse_iterator reverse_iter;
	map_multi.insert(pair<int,int>(1,87));
	map_multi.insert(pair<int,int>(5,98));
	map_multi.insert(pair<int,int>(1,62));
	map_multi.insert(pair<int,int>(5,78));
	map_multi.insert(pair<int,int>(5,82));

	cout<<"Elements of multimap in order:";
	for(iter=map_multi.begin(); iter!=map_multi.end(); iter++)
		cout<<"<"<<iter->first<<","<<iter->second<<"> ";
	cout<<endl;

	iter=map_multi.begin();
	cout<<"multimap.begin():"<<"<"<<iter->first<<","<<iter->second<<"> "<<endl;

	iter=map_multi.end();			//指向的是multimap中最后一个元素后面的一位;
	iter--;
	cout<<"multimap.end()--:"<<"<"<<iter->first<<","<<iter->second<<"> "<<endl;

	reverse_iter=map_multi.rbegin();
	cout<<"multimap.rbegin():"<<"<"<<reverse_iter->first<<","<<reverse_iter->second<<"> "<<endl;

	reverse_iter=map_multi.rend();	// 指向的是multimap中最后一个元素后面的一位;
	reverse_iter--;
	cout<<"multimap.rend()--:"<<"<"<<reverse_iter->first<<","<<reverse_iter->second<<"> "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值