2013-10-08 4 views
-1

Я пытаюсь разобраться в 2D-вектор с типом:Сортировка вектор C++

vector<pair<char, double>> output; 

Я пытаюсь расположить их от самого высокого до самого низкого двойного значения и отображает только верхнюю 5. Это то, что я я пытаюсь сделать:

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

Но этот вид не работает должным образом для меня. Что я делаю не так?

+2

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

+0

Определите, что «не работает должным образом». Покажите нам код. –

+0

Еще одна возможность ... поменять пару char-double на пару с двумя символами, а затем непосредственно отсортировать ее .extra + O (N) время, которое не имеет значения, поскольку сортировка - это O (NlogN) и дополнительная O (N) память ... если вы можете себе это позволить. –

ответ

1

По умолчанию std::sort будет использовать менее чем оператор сравнения для элементов контейнера, которые будут выполнять утра Лексикографического сравнением с использованием char первыми, а затем в double.

Вы можете использовать свою собственную функцию упорядочения/функтор, порядки, основанные на пары double элемента только:

bool cmp(const std::pair<char, double>& lhs, 
     const std::pair<char, double>& rhs) 
{ 
    return lhs.second > rhs.second; 
} 

затем

std::vector<std::pair<char, double>> output = ....; 
sort(output.begin(), output.end(), cmp); 

См working demo here.

+0

Я получаю ошибки – user977154

+0

Ошибка ошибка C3867: 'CaesarCypher :: cmp': вызов функции отсутствует список аргументов; use '& CaesarCypher :: cmp' для создания указателя на член – user977154

+0

@ user977154 вы делаете что-то неправильно! Функция 'cmp' является функцией, не являющейся членом. – juanchopanza

2

Как сказала Вайолет, вы можете включить свою собственную функцию сравнения:

class compare 
{ 
public: 
    bool operator() (std::pair<char, int> const& p1, 
        std::pair<char, int> const& p2) const 
    { 
     // perform logic here 
    } 
} Predicate; 

std::sort использует operator < для сравнения элементов, и сортирует их соответствующим образом. Он имеет дополнительный необязательный параметр для сравнительного функтора, который мы можем включать в себя, как это:

std::sort(output.begin(), output.end(), Predicate); 

Заметьте, что это также может быть сделано с помощью лямбды в C++ 11.

+0

Я не уверен, но компаратор не должен быть вещью (функция, лямбда, функтор) с сигнатурой 'bool (const value_type &, const value_type &)'? Я думаю, что вы должны написать 'operator()' вместо 'operator <' – Manu343726

+0

@ Manu343726 Именно это и есть. 'std :: sort' вызовет' compare :: operator <'внутренне. – 0x499602D2

+0

mmmm no, не является вызываемым объектом, вы определили только оператор сравнения. – Manu343726

0

Есть ли причина, по которой вы используете вектор пар? Другими словами, действительно ли порядок, в котором элементы хранятся внутри, действительно имеет значение для вас? Если нет, вам, вероятно, лучше использовать map<double,char> с обратным итератором, чтобы получить последние 5 элементов, отсортированных по двойному значению.

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