VS2010上 C++ multimap容器 运行时出错

#include<iostream>#include<map>usingstd::multimap;usingstd::cout;usingstd::endl;using... #include <iostream>
#include <map>
using std::multimap;
using std::cout;
using std::endl;
using std::make_pair;

int main(){
multimap< int, int, std::greater_equal<int> > a;

a.insert( make_pair(1, 2) );
a.insert( make_pair(1, 3) );
a.insert( make_pair(3, 2) );
a.insert( make_pair(3, 1) );
a.insert( make_pair(2, 2) );

multimap<int, int, std::greater_equal<int> >::iterator pos;
for( pos = a.begin(); pos != a.end(); pos++ )
cout << pos->first << " " << pos->second << endl;
}
如图 什么都没有输出就这样,请问哪里出错了???
展开
 我来答
jht_1111111
2011-10-19 · TA获得超过156个赞
知道小有建树答主
回答量:222
采纳率:0%
帮助的人:191万
展开全部
两处 multimap< int, int, std::greater_equal<int> >
改为multimap< int, int, std::greater<int> >
------------
至于为什么,我觉得可能是用带等号的
因为需要比较2个元素,无法比较,
比如 1 2 和1 3
1>=1 ,排序结束,但是这个排序是错的
如果改为不带等号的
1>1 不成立,然后比较 2>3 不成立
结果为 1 3 ,1 2
追问
为什么不能等于呢
追答
我不是说了嘛
先(1,2),后 (1,3) 用greater_equal排序
比较的顺序是:只用>=号 比较first,然后只用>=号比较secend
if(1>=1)
这个成立了, 这里若是判定(1,2)>=(1,3)那么是错的
若是再比较 if(2>3),不成立,这样一个成立一个不成立怎么排序.
-------------
除非再用==判断first是否相等,才能得出正确结论
----------------
你可以自己试一试,只用>=号 ,能不能排序2个pair
----------------------------------------------------------------------------------
以上只是猜测
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友9df37c8
2011-10-19 · TA获得超过215个赞
知道小有建树答主
回答量:309
采纳率:0%
帮助的人:223万
展开全部
template<class _Pr, class _Ty1, class _Ty2> inline
bool __CLRCALL_OR_CDECL _Debug_lt_pred(_Pr _Pred, const _Ty1& _Left, const _Ty2& _Right,
const wchar_t *_Where, unsigned int _Line)
{ // test if _Pred(_Left, _Right) and _Pred is strict weak ordering
if (!_Pred(_Left, _Right))
return (false);
else if (_Pred(_Right, _Left))
_DEBUG_ERROR2("invalid operator<", _Where, _Line);
return (true);
}

Right和Left相等的时候就不行了。
用std::less< int >
----------------------------
你再看下她模板的定义:
template<class _Kty,
class _Ty,
class _Pr = less<_Kty>,
class _Alloc = allocator<pair<const _Kty, _Ty> > >
class multimap
: public _Tree<_Tmap_traits<_Kty, _Ty, _Pr, _Alloc, true> >
本来就是要你传个less的仿函数。
更多追问追答
追问
谢谢了 为什么一定要这么写呢? 不让equal是什么原因?
红黑树的原因?
追答
stl::less是默认的比较函数,你可以用自己的仿函数,这样就无所谓了,想怎么比就怎么比。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
滨崎步最爱
2011-10-19 · TA获得超过665个赞
知道小有建树答主
回答量:705
采纳率:0%
帮助的人:457万
展开全部
http://www.cplusplus.com/reference/stl/multimap/
“shall return true if a is to be placed at an earlier position than b in a strict weak ordering operation. ”
可以看出,比较函数要求严格弱排序 。
如果非要知道为什么不让用equal,只能查看源代码是用什么方法定义的
追问
那有multimap的源码吗? 能不能麻烦贴出一部分来看下?
追答
你在安装文件中找vc/include,找到map文件,用vs2010打开看看,这个定义还是很麻烦的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式