c – 排序中的<运算符断言无效

前端之家收集整理的这篇文章主要介绍了c – 排序中的<运算符断言无效前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试实现一个简单的比较器,用于根据数组“_vec”中的值对索引进行排序.我收到“无效<运算符”运行时错误消息.我无法理解以下代码有什么问题:
class Compare{
vector<int>& _vec;
public:
    Compare(vector<int>& vec) : _vec(vec) {}
    bool operator()(size_t i,size_t j){
        if(_vec[i] != _vec[j])
        return _vec[i] < _vec[j];
        else
        return (double)rand()/RAND_MAX < 0.5; 
    }
};

我正在使用以下函数调用

sort(inds.begin(),inds.end(),Compare(vals));

其中inds只是一个包含索引从1到15(比如说)的数组,而vals是长度为15的数组,其中包含一些我希望计算其排序索引的值.总体目标是在val中的两个(或更多)条目相等时随机化排序顺序.有帮助吗?

解决方法

std :: sort()期望比较操作稳定 – 如果比较两个项时返回特定结果,则比较必须返回相同的结果(如果稍后再次比较这些项).当你返回一个随机值时,显然不一定会持有.

C 03 25.3 / 4“排序和相关操作”说:

If we define equiv(a,b) as !comp(a,b) && !comp(b,a),then the
requirements are that comp and equiv both be transitive relations:

  • comp(a,b) && comp(b,c) implies comp(a,c)
  • equiv(a,b) && equiv(b,c) implies equiv(a,c)

[Note: Under these conditions,it can be shown that

  • equiv is an equivalence relation
  • comp induces a well-defined relation on the equivalence classes determined by equiv
  • The induced relation is a strict total ordering.

—end note]

为澄清,表28定义了等价关系:

== is an equivalence relation,that is,it satisfies the following
properties:

  • For all a,a == a.
  • If a == b,then b == a.

所以你的Compare()操作不会产生等价关系.

获得断言而不是随机丢失数据真是太好了.

当_vec中的两个(或更多个)条目相等时,解决排序顺序随机化问题的一种方法是构成这些索引的随机值,并在index =>的映射中跟踪这些随机值.随机值或其他东西.只需确保以这样的方式跟踪和使用这些随机值,即Compare()的传递和等价属性保持不变.

猜你在找的C&C++相关文章