C ++ пользовательская функция сравнения для std :: sort ()

Я хочу создать пользовательскую функцию сравнения для std :: sort (), чтобы отсортировать некоторые пары ключ-значение std :: pair

Вот моя функция

 template 
 int comparePairs(const void* left, const void* right){
        if((((pair*)left)->first) first))
            return 1;
        else 
            return -1;
    }

Тогда внутри некоторого класса у меня есть вектор члена класса:

vector items;  

И какой-то метод для сортировки этого вектора по ключам, используя std :: sort ()

std::sort(items.begin(), items.end(), comparePairs);

У меня есть ошибки компиляции внутри, который сказал "

невозможно преобразовать номер параметра из 'станд :: Пара <_Ty1, _Ty2>» кconst void * '"

, В чем ошибка?

 user481516234203 июн. 2013 г., 12:35
Ошибка в том, что вы путаете компаратор сstd::sort с одним дляqsort, что требуетconst void * аргументы. Написать правильный компаратор дляstd::sort который принимает ссылки наpair и проблема уйдет.
 Jim Balter12 окт. 2017 г., 03:16
Зачем кому-то высказывать это, когда он показывает полное отсутствие исследований, чтения, внимания, размышлений или чего-то еще?
 Dominic Rodger03 июн. 2013 г., 12:32
Почему вы принимаете ваши параметры какvoid*s? почему не какstd::pairs?

Ответы на вопрос(3)

http://en.cppreference.com/w/cpp/algorithm/sort.

Это говорит:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
комп - функция сравнения, которая возвращаетправда если первый аргумент меньше, чем второй. Подпись функции сравнения должна быть эквивалентна следующей:bool cmp(const Type1 &a, const Type2 &b);

Также здесь'S пример того, как вы можете использоватьstd::sort используя собственную C ++ 14 полиморфную лямбду:

std::sort(std::begin(container), std::end(container),
          [] (const auto& lhs, const auto& rhs) {
    return lhs.first < rhs.first;
});
Решение Вопроса

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

Также имейте в виду, чтоstd::sort требуетстрогое слабое требование сравнение и<= не удовлетворяет это. Вам нужно, например, сравнение меньше, чем< заK а такжеV, С этим все, что вам нужно, это

std::vector<pair<k,v>> items; 
std::sort(items.begin(), items.end()); 
</pair<k,v>

Если вам действительно нужно предоставить собственную функцию сравнения, то вам нужно что-то вроде

template <typename k,="" typename="" v="">
bool comparePairs(const std::pair<k,v>& lhs, const std::pair<k,v>& rhs)
{
  return lhs.first < rhs.first;
}
</k,v></k,v></typename>

Его аргументы должны быть типом, хранящимся в диапазоне, т.е.std::pairнетconst void*

Должно вернутьсяbool не положительное или отрицательное значение. И то и другое(bool)1 а также(bool)-1 являютсяtrue так ваша функция говориткаждый объект заказан раньшекаждый второй объект, который явно невозможен.

Вам нужно смоделировать оператора меньше, чемstrcmp или жеmemcmp сравнение стилей.

УвидетьStrictWeakOrdering который описывает свойства, которым должна соответствовать функция.

Ваш ответ на вопрос