加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:21:53 所属栏目:百科 来源:网络整理
导读:我正在尝试实现一个简单的比较器,用于根据数组“_vec”中的值对索引进行排序.我收到“无效运算符”运行时错误消息.我无法理解以下代码有什么问题: class Compare{vectorint _vec;public: Compare(vectorint vec) : _vec(vec) {} bool operator()(size_t i,s
我正在尝试实现一个简单的比较器,用于根据数组“_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()的传递和等价属性保持不变.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读