2013-10-01 2 views
3
#include <iostream> 
#include <string> 
#include <cstdio> 
#include <cstdlib> 
#include <cmath> 
#include <vector> 
#include <algorithm> 
#include <utility> 
#include <queue> 
#include <stack> 
#include <map> 
#include <set> 
using namespace std; 
#define PR(x) cout << #x " = " << x << "\n"; 


struct bomb 
{ 
    int x, y, state; 
    bomb(){ 
     state = 1; 
    } 
}; 

bool cmpX(const bomb a,const bomb b){ 

    if(a.x == b.x){ 
     int t1 = a.y<0?(-a.y):a.y; 
     int t2 = b.y<0?(-b.y):b.y; 
     printf("%d %d\n",t1,t2); // to check this func 
     if(t1>t2) return false; 
     else return true; 

    } 
    int t1 = a.x<0?(-a.x):a.x; 
    int t2 = b.x<0?(-b.x):b.x; 
    printf("%d %d\n",t1,t2); // to check this func 
     if(t1>t2) return false; 
     else return true; 

} 


int main(){ 
    int n; 

    cin>>n; 
    bomb s[100000]; 
    for (int i = 0; i < n; ++i) 
    { 
     scanf("%d %d",&s[i].x, &s[i].y); 
    } 
    sort(s,s+n,cmpX); 
}  

Этот код будет в бесконечный цикл на следующем входе: -2 -2 -1 1 1 -1 2 -2 1 -2 -1 0 0 -2 0 -1 -2 0 -2 -1 2 -1 -1 -2 -2 1 -1 2 -1 -1 -2 2STL сортируется в бесконечном цикле?

Ниже приводится ссылка ideone: http://ideone.com/x1Gbah

+0

Я предлагаю использовать 'зЬй :: tie' или' зЬй :: make_pair' получить строгий слабый порядок. – chris

+0

BTW: Вы не хотите копировать аргументы для каждого сравнения, используйте 'const bomb &' для параметров 'cmpX'. –

ответ

5

Вам нужно определить строгий слабый порядок, который означает, что вы должны вернуть false если элементы идентичны. Чтобы это исправить, изменить

if(t1>t2) 

в

if(t1>=t2) 
+0

Не _strict_ mean '>' в отличие от '> ='? –

+0

@VioletGiraffe В принципе да, '>' (или '<') являются примерами строгого слабого порядка, '> =' и '<=' not. Это также означает, что если 'a

+0

Тогда ваш ответ «change> to> =' contadicts ваше объяснение и ваша собственная фраза «вам нужно вернуть false, если элементы идентичны». Исходный код OP реализует правильный порядок. –