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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS2010上 C++ multimap容器 运行时出错相关的知识,希望对你有一定的参考价值。

#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;

如图 什么都没有输出就这样,请问哪里出错了???

参考技术A 两处 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
----------------------------------------------------------------------------------
以上只是猜测

参考技术B 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是默认的比较函数,你可以用自己的仿函数,这样就无所谓了,想怎么比就怎么比。

追问

大神,有multimap的源码吗? 那里应该可以找到为什么不让equal的原因

追答

stl是开源的啊

本回答被提问者采纳
参考技术C 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打开看看,这个定义还是很麻烦的

以上是关于VS2010上 C++ multimap容器 运行时出错的主要内容,如果未能解决你的问题,请参考以下文章

C++ 关联容器set | map | multiset | multimap

类 C++ STL 的双向 Multimap

C++进阶:关联式容器

C++进阶:关联式容器

C++进阶:关联式容器

新手学C++,用vs2010运行书上的一个实例时出现问题,求解~~