2014-11-10 2 views
3
#include "bits/stdc++.h" 
using namespace std; 
int main() 
{ 
int i,j; 
vector< pair<int,int> > v; 

    v.push_back(make_pair(4,2)); 
    v.push_back(make_pair(1,3)); 
    v.push_back(make_pair(5,4)); 

sort(v.begin(), v.end()); 

for(i=0;i<v.size();i++) 
    cout<<v[i].first<<" "<<v[i].second<<endl; 
} 

Выход на приведенный выше код ---рода пара вектор в C++

1 3 
4 2 
5 4 

Мы можем видеть из вывода, что функция рода имеет отсортированный V [я] .first, но что, если мы хотим только сортировать v [i]. секунд или если мы хотим отсортировать их оба, как выполнить задачу?

+0

используйте 'std :: map', возможно, пользовательский сопоставитель (lambda сделает это) – quantdev

+0

извините, но я никогда не реализовал карту, я ничего не знаю об этом – gsdf

+0

Можете уточнить, какие результаты вы ищете? «если мы хотим сортировать оба»; Вы хотите, чтобы результат был '1 2'' 4 3'' 5 4'? –

ответ

3

Укажите свой собственный компаратор. В C++ 14 это может быть сделано очень лаконично:

sort(v.begin(), v.end(), [](const auto& x, const auto& y){return x.second < y.second;}); 
+0

Обратите внимание, что для синтаксиса требуется, по крайней мере, компилятор C++ 11. Если ваш компилятор старше, используйте явный класс функтора (как в ответе ravi) или свободную функцию (как в г-н kbok's). – Sneftel

+0

@Sneftel даже не C++ 11, C++ 14 :) –

+0

@AntonSavin не должно быть 'const auto & x, const auto & y' для большинства целей? Кроме того, есть ли компилятор, который может действительно выводить типы в этом контексте? – PeterT

2

std::sort() функция принимает сравнения функциональный объект в качестве параметра:

template<class RandomIt, class Compare> void sort(
    RandomIt first, RandomIt last, Compare comp); 

рабочая функция сравнения для second члена pair бы:

bool cmp(const std::pair<int,int>& a, const std::pair<int,int>& b) { 
    return a.second < b.second; 
} 
2

По умолчанию он будет сортировать на основе первого элемента, сколько ваша программа делает. Однако вы можете передать третий аргумент для сортировки в качестве определяемого компаратора делать то, что вы хотите сделать ...

Вы можете иметь свой собственный компаратор для сортировки по правому элементу: -

struct sort_second { 
    bool operator()(const std::pair<int,int> &left, const std::pair<int,int> &right) { 
     return left.second < right.second; 
    } 
}; 

std::sort(v.begin(), v.end(), sort_second()); 
+1

'operator()' должен быть 'const'. – ildjarn

+0

В качестве альтернативы, он не должен быть классом, он может быть просто функцией. –

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