我有一个类函子(太复杂了,无法实现为lambda),但为了简化这个想法,我想确保函子满足Compare谓词。问题是,我希望所有大于(1)
的值都以升序排列,但将(1)
的所有值都放在"末尾",例如,被视为"较大"值。
例如{2, 2, 2, 3, 3, 3, 4, 5, 6, 6, ..., 1, 1, 1}
函数对象被实现为一个结构,用于从构造它的(复杂)对象引用中提取参数,但重要的部分是函数对象中的方法。简化:
bool operator () (unsigned i, unsigned j)
{
if (i == 1) return false; // (1 >= x)
if (j == 1) return true; // (x <= 1)
return (i < j);
}
这似乎与std::sort
和std::stable_sort
的预期工作一样。但是,就严格弱序而言,我仍然不相信它正确地满足Compare
的标准。请注意,在所有情况下都是x <= 1
,也就是说,对于:i, j >= 1
。显然,(1, 1) => false
我的"调整过的"函子正确吗,即使它在末尾放置了(1)
的值?也就是说,(1)
已被处理为大于值x > 1
?或者我只是幸运地实现了sort
?
正如我应该澄清的那样,值(0)
不会出现。我最初在评论中有这个(非常聪明)被接受的答案,但错误地删除了它。
如果您可以定义一个双射运算,其中比较是全序/弱序,那么您就可以了。我们发现,对于您的类型(unsigned
),这只是-=2
/+=2
bool operator()(unsigned i, unsigned j) const{
return (i-2) < (j-2); // usigned will wrap around 0
}
好吧,这也取决于你想用零做什么。
这依赖于1 - 2 == std::numeric_limits<unsigned>::max()
,所以当你"比较"例如1
和x
时,你得到的std::numeric_limits<unsigned>::max() < x - 2
就是false
,即使x
也是1
(如果有0
也是如此)。