2015-06-22 98 views
1

我用我的next_permutation功能的自定義比較函數,但我不明白爲什麼我得到的錯誤:next_permutation與自定義比較函數C++

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

您認爲自定義比較器功能的作用是什麼?你認爲它意味着什麼*使用給定的自定義比較器?你對「限制」的使用對我來說是一個紅旗。 – Yakk

+0

使用你的第一個功能沒有錯誤:現場演示:http://coliru.stacked-crooked.com/a/8abe254b696f6df8 – Steephen

+0

@Stephen:這是默默地失敗。 OP有機會獲得調試斷言檢查其比較器的有效性 – quantdev

回答

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

你可能需要重新考慮你的問題,以及如何你真的想訂購您的元素,而這樣做的排列。

+0

你的例子並不反駁它的反對稱性。你應該選擇'f(2,-3)'。 – Barry

+0

@巴里謝謝,編輯 – quantdev

+0

@巴里謝謝你的答覆,但你的輸出似乎不正確的2)。我會思考你的答案,並試圖理解它。 – fanterrific

0

排列是關於排序。默認排序是1<2<3<4<5<6 etc - 您習慣的順序。

自定義比較器可讓您設置與默認比較不同的順序。

這在很多情況下都很有用。

對於一個玩具的例子,你可以設置所有偶數大於所有奇數 - 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); 
} 

對於沒有操作<這是一個嚴格的弱序的類型,它可以讓你提供一個。一個複數可以按字典順序排列,也可以按照數量順序排列:排序順序不是一個嚴格的弱排序順序,而是一個按字典排序的順序會令人驚訝。