2017-05-31 120 views
-4

我有一個奇怪的問題,也許我錯過了一些明顯的東西,但我無法解決。C++無效比較器

這裏是拋出斷言C++代碼:

int compareByX(const Vector2D &a, const Vector2D &b) 
{ 
    if (a.x < b.x) // if i put a.x > b.x nothing changes 
     return -1; 
    return 1; 
} 
int main(int argc, char *argv[]) 
{ 
    double pts[6] = { 5, 34, 3, 54, 10, 34 }; 
    std::vector<Vector2D> points; 
    for (int i = 0; i < 6; i += 2) 
     points.push_back({ pts[i],pts[i + 1] }); 
    std::sort(points.begin(), points.end(), compareByX); 
} 

什麼情況是,第一點(3,54)抵靠(5,34)進行測試,然後反之亦然。 在這一點上,引發了assert(無效比較器)。但正如我所看到的,它返回-1的權利,因爲3小於5,然後返回1,因爲5大於3 ...

你能告訴我這有什麼問題嗎?

+13

'sort'預計比較函數返回TRUE;('1')或'FALSE'('0' )。你覺得'-1'發生了什麼?這種實現'compareByX'的方法如何:{return a.x BoBTFish

+5

[這個'std :: sort'引用](http://en.cppreference.com/w/cpp/algorithm/sort)應該是有幫助的。 –

+0

現在我明白了,謝謝!以爲我正在使用qsort:/ – deight

回答

0

無效的比較器斷言被拋出,因爲函數返回-1和1,而std :: sort只接受true或false,以便具有弱嚴格排序。

通過改變功能:

bool compareByX(const Vector2D &a, const Vector2D &b) 
{ 
    return a.x < b.x; 
} 

一切正常。

最後確實是一個非常明顯的錯誤。

+0

嚴格地說你的答案是錯誤的。比較器只需要返回可轉換爲'bool'的東西,因此返回'int'就可以了。真正的問題是你的比較器同時產生'compareByX(a,b)== true'和'compareByX(b,a)== true',這意味着沒有嚴格的排序。參見[這裏](http://ideone.com/SrXVGP)一個工作示例,其中比較器返回一個'int',但是完全正確 – user463035818

+0

另請參見[here](http://en.cppreference。com/w/cpp/concept/Compare) – user463035818

0

Accordin到基準爲sort比較器必須:

比較函數對象(即滿足比較的要求的對象),如果所述第一參數的值小於(即是有序的返回true 之前)第二個。 比較功能的簽名應該是等效於以下:

布爾CMP(常量的Type1 &一個,常量類型2 & b)的

我猜你真正想要的是什麼,如下:

std::sort(points.begin(), points.end(), 
     [] (const Vector2D& a1, const Vector2D&a2){return a1.x < a2.x;} 
    ); 
+1

該報價中的「應該」是不準確的。請參閱[這裏](http://en.cppreference.com/w/cpp/concept/Compare)獲取更精確的語句:「返回類型:隱式轉換爲bool」。無論如何,你用粗體表示的部分是導致問題的原因(雖然返回'int'或'bool'並不重要) – user463035818

+0

@ tobi303是的,但是從使用比較器的函數的角度來看,它並不重要。他們看到的是「真」或「假」。只要你知道隱式轉換是如何工作的,你就可以返回'true'的非零值(或其他可以隱式轉換爲bool的值)並不重要。感謝您指出這個參考! –

+0

沒問題,我剛剛看到OP自己的回答得到了那個錯誤,並且認爲這裏值得一提的是這裏也只是爲了避免誤解 – user463035818