С++ пользовательская функция сравнения для std:: sort()
Я хочу создать пользовательскую функцию сравнения для std:: sort(), чтобы отсортировать некоторые пары ключ-значение std:: pair
Вот моя функция
template <typename K, typename V>
int comparePairs(const void* left, const void* right){
if((((pair<K,V>*)left)->first) <= (((pair<K,V>*)right)->first))
return 1;
else
return -1;
}
Затем внутри некоторого класса у меня есть вектор класса class member:
vector<pair<K,V>> items;
И некоторый метод для сортировки этого вектора по ключам, используя std:: sort()
std::sort(items.begin(), items.end(), comparePairs<K,V>);
У меня есть ошибки компиляции внутри, которые сказали
"не может преобразовать номер параметра из 'std:: pair < _Ty1, _Ty2 > ' в 'const аннулированию *"
. Что такое ошибка?
Ответы
Ответ 1
std:: pair уже есть необходимые операторы сравнения, которые выполняют лексикографические сравнения с использованием обоих элементов каждой пары. Чтобы использовать это, вам просто нужно предоставить операторов сравнения для типов для типов K
и V
.
Также учтите, что std::sort
требует сравнения строгого слабого ordeing, а <=
не удовлетворяет этому. Вам понадобится, например, меньше, чем сравнение <
для K
и V
. При этом все, что вам нужно, это
std::vector<pair<K,V>> items;
std::sort(items.begin(), items.end());
Если вам действительно нужно предоставить свою собственную функцию сравнения, вам нужно что-то в строках
template <typename K, typename V>
bool comparePairs(const std::pair<K,V>& lhs, const std::pair<K,V>& rhs)
{
return lhs.first < rhs.first;
}
Ответ 2
Посмотрите здесь: http://en.cppreference.com/w/cpp/algorithm/sort.
В нем говорится:
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
- comp - функция сравнения, которая возвращает true, если первый аргумент меньше второго. Подпись функции сравнения должна быть эквивалентна следующему:
bool cmp(const Type1 &a, const Type2 &b);
Кроме того, здесь приведен пример использования std::sort
с использованием настраиваемой полиморфной лямбда С++ 14:
std::sort(std::begin(container), std::end(container),
[] (const auto& lhs, const auto& rhs) {
return lhs.first < rhs.first;
});
Ответ 3
Ваша функция сравнения даже не ошибается.
Его аргументы должны быть типом, хранящимся в диапазоне, т.е. std::pair<K,V>
, а не const void*
.
Он должен возвращать bool
не положительное или отрицательное значение. Оба (bool)1
и (bool)-1
равны true
, поэтому ваша функция говорит, что каждый объект упорядочен до любого другого объекта, что явно невозможно.
Вам нужно смоделировать сравнения менее, чем strcmp
или memcmp
.
См. StrictWeakOrdering, в котором описаны свойства, которые должна выполнять функция.