2014-06-15 3 views
-3
vector<pair<int,int> > v; 
for(i=0;i<5;i++){ 
    cin>>b>>c; 
    v.push_back(make_pair(b,c)); 
} 
sort(v.begin(),v.end()); 

Можно ли написать компаратор для функции сортировки таким образом, что v[i].first сортируются в порядке возрастания и для аналогичных значений v[i].first, v[i].second сортируются в порядке убывания?
как: -
я/р:компаратора для вектора <пары <int,int>>

13 10 
44 15 
13 15 
13 99 
    6 45 

о/р:

6 45 
13 99 
13 15 
13 10 
44 15 
+1

Является ли это C++? Добавьте тег, определяющий, какой язык вы используете. –

+0

Да, это возможно и довольно тривиально. Вам просто нужно написать подходящую функцию сравнения и передать ее в 'std :: sort'. – juanchopanza

+0

@TomZych: извините за это да, это C++. – Shivam

ответ

1

Конечно, это достаточно легко.

Все, что вам нужно сделать, это написать функцию с этой подписью:

bool f(std::pair<int, int> lhs, std::pair<int, int> rhs); 

Функция должна возвращать true тогда и только тогда, когда lhs < rhs

Так, по вашим критериям, lhs меньше rhs если :

  • lhs.first < rhs.first,
  • илиlhs.first == rhs.first && lhs.second > rhs.second

Так, в основном просто положить их вместе, и вы получите:

bool mycomparer(std::pair<int, int> lhs, std::pair<int, int> rhs) { 
    if (lhs.first < rhs.first) { 
     return true; 
    } 
    else if (lhs.first == rhs.first && lhs.second > rhs.second) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

Это может быть написано гораздо более компактно, но я хотел бы сохранить его простым и читаемым, чтобы получить точка поперек. :)

+0

вам следует поощрять использование функторов. – Csq

+2

@Csq: Я должен? Зачем? – jalf

1

Вот компактное сравнение объекта функция, которая делает то, что вы хотите: (использует C++ 11 функций)

struct Shivam { 
    typedef std::pair<int, int> const& param_type; 
    bool operator()(param_type lhs, param_type rhs) const { 
     return std::tie(lhs.first, rhs.second) < std::tie(rhs.first, lhs.second); 
    }; 
}; 

и использовать его как это:

std::sort(std::begin(v), std::end(v), Shivam{}); 
+1

Обратите внимание, что для этого требуется C++ 11. – Csq

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