Подтвердить что ты не робот

С++ пользовательская функция сравнения для 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 аннулированию *"

. Что такое ошибка?

4b9b3361

Ответ 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, в котором описаны свойства, которые должна выполнять функция.