2015-07-08 4 views
2

В основном, следующий код принимает в качестве входных данных n пары, каждая из которых имеет две части, a и b. Я отсортировал весь вектор с помощью пользовательского компаратора, который сначала ставит эти значения с более высоким вторым значением (b) и, если b - это то же самое, то те, которые имеют более высокое значение a. Вот код,Какова возможная причина ошибки сегментации в этом фрагменте кода?

#include <iostream> 
#include <utility> 
#include <vector> 
using namespace std; 

struct mycomp 
{ 
    bool operator() (const pair<int,int> &p1, const pair<int,int> &p2) 
    { 
     if (p1.second > p2.second) // Here 
      return true; 
     else if (p1.second == p2.second && p1.first >= p2.first) 
      return true; 
     else 
      return false; 
    } 
}; 

int main (void) 
{ 
    int i,n,a,b,foo; 
    cin>>n; 
    i = n; 
    vector<pair<int,int> > myvec; 
    while (i != 0) 
    { 
     cin>>a>>b; 
     myvec.push_back(make_pair(a,b)); 
     i--; 
    } 
    int val = 0; 
    sort(myvec.begin(),myvec.end(),mycomp()); 
    val = val + myvec[0].first; 
    int k = myvec[0].second; 
    foo = 1; 
    while (k!=0 && foo < n) // This part basically calculates the values which I have to print. 
    { 
     //k--; 
     val = val + myvec[foo].first; 
     k = k + myvec[foo].second; 
     k--; 
     foo++; 
    } 
    cout<<val<<"\n"; 

    return 0; 
} 

На выполнение этого с 100 в качестве входных данных, и следующее время пар, он дает ошибку сегм. Я попытался запустить его через отладчик, и он говорит: EXC_BAD_ACCESS (code=1,address=0x101800004) в строке, помеченной (здесь) в коде. Что я делаю неправильно в этом?

Вот ссылка для входного файла: https://www.dropbox.com/s/79ygx4qo5qc8tsl/input.txt?dl=0

+0

является 'п> myvec.size()'? – NathanOliver

+0

@NathanOliver, nope. Это всего лишь 100. –

ответ

4

Ваша функция для сравнения двух пар неисправна. Если две пары имеют одинаковые a и b, sort никогда не будет завершен.

Изменить это:

struct mycomp 
{ 
    bool operator() (const pair<int,int> &p1, const pair<int,int> &p2) 
    { 
     if (p1.second != p2.second) 
      return p1.second > p2.second; 
     else 
      return p1.first > p2.first; 
    } 
}; 
+0

Ваша логика абсолютно правильна, но у меня есть небольшое сомнение, если 'a' и' b' равны обеим парам, не переходят ли они в условие 2? То есть 'if (p1.second == p2.second && p1.first> = p2.first)'? –

+0

@JohnLui, я предполагаю, что вы говорите о своем коде. Да, это будет. Проблема в том, что функция вернет 'true', даже если будет изменен порядок' p1' и 'p2'. 'sort' не работает, если функция сравнения не может гарантировать строгий порядок. –

+0

@JohnLui, ваша функция должна работать, если вы используете 'if (p1.second == p2.second && p1.first> p2.first)'. Отбросьте '=' из '> ='. –

Смежные вопросы