2013-08-07 3 views
12

Heyho,Сортировка вектора пара

У меня есть вопрос о сортировке вектора пара:

std::vector<std::pair<double,Processor*>> baryProc; 

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

Пример:

Предположим, у меня есть 3 пары внутри вектора. Пара 1 находится спереди, а пара 3 - в конце. pair2 находится посередине:

pair1(1, proc1) 
pair2(3, proc2) 
pair3(2.5, proc3) 

сейчас я хочу сортировать пары на основе двойного значения. Таким образом, порядок внутри вектора:

pair1(1, proc1) 
pair3(2.5, proc3) 
pair2(3, proc2) 

Как я могу это сделать? Я совершенно застрял.

Спасибо за помощь

ответ

22

В C++, вы можете иметь пользовательские функции компараторов, которые определяют, как решить, идет ли один элемент перед другим при сортировке. В вашем случае, учитывая 2 пары, вы хотите иметь тот, у которого нижнее значение для первого элемента должно идти до другого. Вы можете написать функцию компаратора следующим образом:

// This function returns true if the first pair is "less" 
// than the second one according to some metric 
// In this case, we say the first pair is "less" if the first element of the first pair 
// is less than the first element of the second pair 
bool pairCompare(const std::pair<double, Processor*>& firstElem, const std::pair<double, Processor*>& secondElem) { 
    return firstElem.first < secondElem.first; 

} 

Теперь, передать эту функцию в ваш метод сортировки:

//The sort function will use your custom comparator function 
std::sort(baryProc.begin(), baryProc.end(), pairCompare); 
+1

+1 хороший пример устранения сравнения «.second» от нормального оператора less «std :: pair». Я бы предпочел функтор для этого (скорее всего, встроенный), но функциональное решение не работает. – WhozCraig

+0

Спасибо за это хорошее объяснение. Я думаю, что стандартный компаратор будет работать нормально. Будет ли стандартный oparator правильно сортироваться, если двойные значения часто бывают одинаковыми? например: (1, proc1), (1, proc2), (2, proc3), (3, proc4), (3, proc5), .... – user2633791

+1

@ user2633791 Что вы спрашиваете, [стабильная] (http://en.wikipedia.org/wiki/Stable_sort#Stability). Алгоритм сортировки является стабильным, если два элемента с одинаковым значением остаются в том же порядке относительно друг друга в конце сортировки, как и в начале. Алгоритм сортировки по умолчанию нестабилен, но STL предоставляет [стабильный вид] (http://www.cplusplus.com/reference/algorithm/stable_sort/), который должен соответствовать вашим целям. – maditya

25
#include <algorithm> 

int main(){ 

    std::vector<std::pair<double,Processor*>> baryProc; 

    std::sort(baryProc.begin(),baryProc.end()); 
} 

Заметим, что вам не нужен пользовательский компаратор, потому что компаратор по умолчанию пара делает то, что вы хотите. Сначала он сравнивается по первому элементу, и если они идентичны, он сравнивает второй элемент в паре.

+0

Это * будет * работать, если значения 'double' гарантированы уникальными (фактически« set »). Но без такой гарантии (по если необходимо), вам нужно написать компаратор. Компаратор по умолчанию для 'pair' обычно выполняет' return (a.first WhozCraig

+0

у нас нет условий, чтобы помочь нам, что делать, когда первые элементы одинаковы, поэтому что произойдет, если мы используем компаратор по умолчанию ? –

+0

Почему вы указали 'std :: vector' и' std :: pair', но не 'std :: sort'? Если вы это сделали, вы можете полностью избавиться от' using namespace std'. – Kevin