C++ 使用 'tweaked' 比较函子排序
C++ sort with 'tweaked' compare functor
我有一个 class 仿函数(太复杂而无法作为 lambda 实现),但为了简化这个想法,我想确保仿函数满足 Compare 谓词。问题是,我希望所有大于 (1)
的值都按升序排列,但要将 (1)
的所有值都放在 'end' - 例如,视为 'larger' 值。
例如,{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
我的 'tweaked' 仿函数是否正确,即使它把 (1)
的值放在末尾?也就是说 (1)
已被处理为大于值 x > 1
?还是我的 sort
实施很幸运?
正如我应该澄清的那样,值 (0)
不会出现。我最初在对(非常聪明的)接受的答案的评论中有这个,但错误地删除了它。
如果您可以定义一个双射运算,其中比较是 total/weak 顺序,那么您就可以了。
事实证明,对于您的类型 (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()
所以当你 "compare" 例如1
与 x
你得到 std::numeric_limits<unsigned>::max() < x - 2
即 false
,即使 x
也是 1
(对于 [=21= 也是如此) ] 如果有的话)。
我有一个 class 仿函数(太复杂而无法作为 lambda 实现),但为了简化这个想法,我想确保仿函数满足 Compare 谓词。问题是,我希望所有大于 (1)
的值都按升序排列,但要将 (1)
的所有值都放在 'end' - 例如,视为 'larger' 值。
例如,{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
我的 'tweaked' 仿函数是否正确,即使它把 (1)
的值放在末尾?也就是说 (1)
已被处理为大于值 x > 1
?还是我的 sort
实施很幸运?
正如我应该澄清的那样,值 (0)
不会出现。我最初在对(非常聪明的)接受的答案的评论中有这个,但错误地删除了它。
如果您可以定义一个双射运算,其中比较是 total/weak 顺序,那么您就可以了。
事实证明,对于您的类型 (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()
所以当你 "compare" 例如1
与 x
你得到 std::numeric_limits<unsigned>::max() < x - 2
即 false
,即使 x
也是 1
(对于 [=21= 也是如此) ] 如果有的话)。