关于VS2008/2010中SORT,stable_sort的比较函数中strict weak ordering

news/2024/7/7 20:40:37

在VS2008/2010中SORT,stable_sort的比较函数是strict weak ordering。当比较的时候出现元素相等的情况是编译器默认必须返回false,而如果在自定义比较函数时,将相等返回true。将会出现invalid operator<的异常。

注意:这种异常在DEVCPP中时不会出现的。

如:

1 bool cmp(datatype x,datatype y)
2 {if(x>y)
3  return true;
4 if(x==y)
5 return true;//x==y,返回true,将出现invalid operator<异常
6 return false;
7 }

 

所以当比较出现相等的时候必须返回false;

 

即:

bool cmp(datatype x,datatype y)
{
if(x>y)
return true;
if(x<y)
return false;

return false;//当x==y时,返回false;
}

微软官方说明:http://support.microsoft.com/kb/949171

Assertion Failure When Sorting STL Vector using Custom Predicate

Article ID: 949171 - View products that this article applies to.
Expand all | Collapse all
Source: Microsoft Support
 

RAPID PUBLISHING

RAPID PUBLISHING ARTICLES PROVIDE INFORMATION DIRECTLY FROM WITHIN THE MICROSOFT SUPPORT ORGANIZATION. THE INFORMATION CONTAINED HEREIN IS CREATED IN RESPONSE TO EMERGING OR UNIQUE TOPICS, OR IS INTENDED SUPPLEMENT OTHER KNOWLEDGE BASE INFORMATION.
 

Action

 Sort any STL collection using stable_sort() or sort() with duplicate items using the following custom predicate


1 bool CustPredicate (int elem1, int elem2 )
2 {
3     if(elem1 > elem2)
4         return true;
5 
6     if (elem1 < elem2)
7         return false;
8     return true;
9 }

 









 

Result

It works fine in Visual C++ 2002 and Visual C++ 2003.
It throws and assertion failed error, "Expression: invalid operator < " in Visual C++  2005 and Visual C++ /2008.
 

Cause



The STL algorithms for stable_sort() and sort() require the binary predicate to be strict weak ordering.

For example:

· Strict: pred(X, X) is always false.

· Weak: If !pred(X, Y) && !pred(Y, X), X==Y.

· Ordering: If pred(X, Y) && pred(Y, Z), then pred(X, Z).







Resolution

Below either of the options will resolve the issue

First Option:-

 1 bool CustPredicate (int elem1, int elem2 )
 2 {
 3     if(elem1 > elem2)
 4         return true;
 5 
 6     if (elem1 < elem2)
 7         return false;
 8 
 9     return false; //Should return false if both the vaules are same
10 }

 




Second Option:-
1 bool CustPredicate (int elem1, int elem2 )
2 {
3     return elem1 > elem2;
4 }

 









 

DISCLAIMER

MICROSOFT AND/OR ITS SUPPLIERS MAKE NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY, RELIABILITY OR ACCURACY OF THE INFORMATION CONTAINED IN THE DOCUMENTS AND RELATED GRAPHICS PUBLISHED ON THIS WEBSITE (THE “MATERIALS”) FOR ANY PURPOSE. THE MATERIALS MAY INCLUDE TECHNICAL INACCURACIES OR TYPOGRAPHICAL ERRORS AND MAY BE REVISED AT ANY TIME WITHOUT NOTICE.

TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, MICROSOFT AND/OR ITS SUPPLIERS DISCLAIM AND EXCLUDE ALL REPRESENTATIONS, WARRANTIES, AND CONDITIONS WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED TO REPRESENTATIONS, WARRANTIES, OR CONDITIONS OF TITLE, NON INFRINGEMENT, SATISFACTORY CONDITION OR QUALITY, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, WITH RESPECT TO THE MATERIALS.
 

Properties

Article ID: 949171 - Last Review: February 13, 2008 - Revision: 1.0
APPLIES TO
  • Microsoft Visual Studio 2005 Express Edition
  • Microsoft Visual Studio 2005 Professional Edition
  • Microsoft Visual Studio 2005 Service Pack 1
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Team Suite
  • Microsoft Visual Studio 2008 Academic Edition
  • Microsoft Visual Studio 2008 Professional Edition
  • Microsoft Visual Studio 2008 Standard Edition
  • Microsoft Visual Studio Team System 2008 Team Suite
  

转载于:https://www.cnblogs.com/zjushuiping/archive/2012/08/08/2629038.html


http://www.niftyadmin.cn/n/4254509.html

相关文章

lv扩展磁盘空间

2019独角兽企业重金招聘Python工程师标准>>> 1、查看磁盘空间&#xff0c;有一部分没有加进来 [rootlocalhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rootvg-lvroot 29G 7.1G 21G 26% / tmpfs …

TreeView 控件应用详解

TreeView 控件应用详解TreeView控件是在VFP的数据处理中很有用的一个ActiveX 控件,但是VFP的帮助中却没有相关的说明&#xff0c;为帮助大家对这一控件有一个详细的了解&#xff0c;现将TreeView控件应用详解如下&#xff1a;一、概述  TreeView控件显示Node对象的分层列表…

查看存储服务器被挂载的位置,存储服务器挂载服务器

存储服务器挂载服务器 内容精选换一换本章节指导用户挂载已有数据的系统盘。系统盘目前支持离线挂载&#xff0c;即云服务器处于“关机”状态&#xff0c;才可以挂载系统盘。您可以在磁盘列表中查看磁盘属性&#xff0c;只有当磁盘属性为“启动盘”&#xff0c;并且磁盘状态为“…

SQL语句的自动优化

在数据库应用系统中编写可执行的SQL语句可以有多种方式实现&#xff0c;但哪一条是最佳方案却难以确定。为了解决这一问题&#xff0c;有必要对SQL实施优化。简单地说&#xff0c;SQL语句的优化就是将性能低下的SQL语句转换成达到同样目的的性能更好的SQL语句。 优化SQL语句的…

性能服务器与华为合作,华为与AMD合作,强势进入主机业务!联想还能坐得住吗?...

在大家的思维里&#xff0c;华为之所以强大&#xff0c;主要是通讯业务&#xff01;这个说法没有毛病&#xff0c;但是大家可能对华为还有点不大了解&#xff0c;就是华为虽然通讯业务很强大&#xff0c;但是在其他相关业务方面&#xff0c;也都做得非常出色&#xff01;在最近…

SQL Server 2012 TSQL增强

--字符串连接 SELECT CONCAT(Hello,world,null,2012)--字符串格式化 --参考http://msdn.microsoft.com/en-US/library/c3s1ez6e.aspx SELECT FORMAT(GETDATE(),g) --2012/8/10 14:12 UNION ALL SELECT FORMAT(GETDATE(),t) --14:13 UNION ALL SELECT FORMAT(GETDATE(),d) --201…

microsoft WINDOWS 系统错误代码

microsoft WINDOWS 系统错误代码 MS Windows Error Messages Code Error Message 0 操作成功完成。 1 功能错误。 2 系统找不到指定的文件。 3 系统找不到指定的路径。 4 系统无法打开文件。 5 拒绝访问。 6 句柄无效。 7 存储控制块被损坏。 8 存储空…

andrid对不能导入的类,知道类路径怎样使用该类

andrid对不能导入的类&#xff0c;知道类路径怎样使用该类&#xff1f;使用java的反射机制。下边是一个样例。 MTK平台对Android源生的Telephone接口进行了扩展&#xff0c;加入了一个TelephonyManagerEx类来对双卡进行支持&#xff1a; 类名&#xff1a; com.mediatek.telepho…