gpt4 book ai didi

c++ - STL 少运算符和 "invalid operator<"错误

转载 作者:IT老高 更新时间:2023-10-28 22:33:11 26 4
gpt4 key购买 nike

我有一些代码在 VS 10.0 中编译得很好,但是在下面的 Orders 映射中插入一些项目后,我在 Microsoft 调试库中收到“无效的运算符 <”错误。我的 less 运算符很简单,只是将 8 字节字符串 char 逐个比较。有人知道为什么我会收到此错误吗?

typedef struct MY_orderID_t
{
char orderID[8];
} MY_orderID_t;

struct std::less<MY_orderID_t>
{
bool operator()(const MY_orderID_t& k1, const MY_orderID_t& k2) const
{
for( int i=0; i < 8; i++ )
{
if( k1.orderID[i] < k2.orderID[i] )
return( true );
}
return( false );
}
};

std::map< MY_orderID_t, MY_order_t > Orders[5];

最佳答案

我认为这里的问题是您比较两个 MY_orderID_t 的方法不是 strict weak order ,C++ STL 要求的排序关系类型。要成为严格的弱顺序,您的小于运算符必须具有以下四个属性:

  1. 非自反性:x < x 总是假的。
  2. 反对称:如果 x < y,则 y < x 始终为假。
  3. 传递性:如果 x < y 且 y < z,则 x < z 始终为真。
  4. 等价传递性:如果 x 和 y 不可比,y 和 z 不可比,则 x 和 z 不可比。

现在,您的排序不符合属性 (2) 或 (3)。

*首先,(2)被以下内容违反:

(0, 4) < (2, 2) 
(2, 2) < (0, 4)

*第二,违反(3),因为

(0, 1) < (2, 0) < (-1, 1)

// but

(0, 1) < (-1, 1) // Fail

要解决这个问题,不要使用您当前的比较,而是使用 lexicographical comparison 喜欢这个:

return std::lexicographical_compare(k1.orderID.begin(), k1.orderID.end(),
k2.orderID.begin(), k2.orderID.end());

这种比较是严格的弱排序,是所有 STL 容器默认使用的。切换到此比较符合属性 (1) - (4),应该会导致一切正常工作。

希望这会有所帮助!

关于c++ - STL 少运算符和 "invalid operator<"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9040689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com