C++ 使用 'tweaked' 比较仿函数排序

标签 c++ sorting c++11 std

我有一个类仿函数(太复杂而无法作为 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()所以当你“比较”时,例如1x你得到 std::numeric_limits<unsigned>::max() < x - 2这是 false , 即使x也是1 (如果有的话,0 也是如此)。

关于C++ 使用 'tweaked' 比较仿函数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41517882/

相关文章:

c++ - 模板集合的不同排序方法

c++ - 排序算法的交换函数不适用于排序函数的参数。

c++ - 在 vs2013 中禁用 c++11 功能

使用 std::move(nullptr) 的 unique_ptr 的 operator= C++ 错误

C++ std::enable_if - 第二个参数的功能

在容器类中使用自定义比较器的 C++ 排序集

c++ - [Args...] 为空的可变参数模板的部分模板特化

c++ - 在编译时获取表达式的类型

使用 visual studio 2008 构建 C++ 项目

c++ - 使用 SetupAPI 获取有关设备的信息