next_permutation使用自定义比较器函数c ++

时间:2015-06-22 01:33:19

标签: c++ permutation

我使用自定义比较器功能进行next_permutation功能,但我不明白为什么我会收到错误:

Expression: invalid operator<

我希望我的函数至少在函数体中使用这些限制,但不断出现错误:

bool mycomp(int i, int j)
{
    return (((i < 0) && (j > 0)) || ((i > 0) && (j < 0)));
};

但是当我这样做时,它运作正常:

bool mycomp(int i, int j)
{
    return (((i < 0) && (j > 0)));
};

我还要添加另一个限制,但不知道如何。 这是具有next_permutation函数的相关代码:

int counter, size, *guests;
for (int i = 2; i <= 9; i++)
{
    size = i * 2;
    counter = 1;
    guests = new int[size];
    for (int j = 0; j < size; j += 2)
    {
        guests[j] = counter;
        guests[j + 1] = 0 - counter;
        ++counter;
    }
    sort(guests, guests + size);
    counter = 0;
    while (next_permutation(guests, guests + size, mycomp))
    {
        ++counter;
    }
}

我也明白有严格的弱订购要求。在阅读之后我理解了它的要点,但不确定它究竟是如何适用于这种情况的。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您的编译器试图告诉您(通过运行时断言)您的比较器无效。它是无效的,因为它不尊重严格的弱订货合同,至少有两个原因:

1)它不是反对称(即f(x,y)暗示!f(y,x)):

std::cout << mycomp(2, -3) << '\n';
std::cout << mycomp(-3, 2) << '\n';

输出:

true
true

2)它不是传递(即f(x,y)和f(y,z)暗示f(x,z)):

std::cout << mycomp(2, -3) << '\n';
std::cout << mycomp(-3, 2) << '\n';
std::cout << mycomp(2, 2) << '\n';

输出:

true
true
false
false

<强> Demo

您可能需要重新考虑您的问题,以及在进行排列时您真正想要如何订购元素。

答案 1 :(得分:0)

排列与订购有关。默认排序为1<2<3<4<5<6等 - 您习惯的顺序。

自定义比较器允许您设置与默认排序不同的排序。

这在很多情况下都很有用。

对于玩具示例,您可以将所有偶数设置为大于所有奇数 - 1<3<5<7<...<0<2<4<6<8<...

利用std::tuple的示例实现:

std::tuple<bool,unsigned> myhelper( unsigned x ) {
  return std::make_tuple( !(x%2), x );
}
bool myorder( unsigned lhs, unsigned rhs ) {
  return helper(lhx)<helper(rhs);
}

对于没有严格弱序的运算符<的类型,它允许您提供一个。一个复数可以按字典顺序或大小顺序排序:大小排序不是严格的弱排序,而<是一个词典顺序会令人惊讶。