我正在尝试实现一个简单的比较器,用于根据数组“_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()的传递和等价属性保持不变.