我使用自定义比较器功能进行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;
}
}
我也明白有严格的弱订购要求。在阅读之后我理解了它的要点,但不确定它究竟是如何适用于这种情况的。提前谢谢。
答案 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);
}
对于没有严格弱序的运算符<
的类型,它允许您提供一个。一个复数可以按字典顺序或大小顺序排序:大小排序不是严格的弱排序,而<
是一个词典顺序会令人惊讶。