c++ - cpp - sort function
c++ funciĆ³n de comparaciĆ³n personalizada para std:: sort() (3)
Mire aquí: http://en.cppreference.com/w/cpp/algorithm/sort .
Dice:
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
- comp - función de comparación que devuelve verdadero si el primer argumento es menor que el segundo. La firma de la función de comparación debe ser equivalente a la siguiente:
bool cmp(const Type1 &a, const Type2 &b);
Además, aquí hay un ejemplo de cómo puede usar std::sort
utilizando un lambda polimórfico C ++ 14 personalizado:
std::sort(std::begin(container), std::end(container),
[] (const auto& lhs, const auto& rhs) {
return lhs.first < rhs.first;
});
Quiero crear una función de comparación personalizada para std :: sort (), para ordenar algunos pares clave-valor std :: pair
Aquí está mi función
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;
}
Luego, dentro de alguna clase tengo vector de pares miembro de clase:
vector<pair<K,V>> items;
Y algún método para ordenar este vector por claves, usando std :: sort ()
std::sort(items.begin(), items.end(), comparePairs<K,V>);
Tengo errores de compilación dentro, que decía
"no se puede convertir el número de parámetro de ''std :: pair <_Ty1, _Ty2>'' a ''const void *''"
. ¿Qué es un error?
Su función de comparación ni siquiera es incorrecta.
Sus argumentos deben ser el tipo almacenado en el rango, es decir, std::pair<K,V>
, no const void*
.
Debe devolver bool
no un valor positivo o negativo. Tanto (bool)1
como (bool)-1
son true
por lo que su función dice que cada objeto está ordenado antes que cualquier otro objeto, lo cual es claramente imposible.
strcmp
memcmp
comparaciones con el operador menor que, no con strcmp
o memcmp
.
Consulte StrictWeakOrdering que describe las propiedades que debe cumplir la función.
std::pair ya tiene los operadores de comparación requeridos, que realizan comparaciones lexicográficas utilizando ambos elementos de cada par. Para usar esto, solo tiene que proporcionar los operadores de comparación para los tipos K
y V
También tenga en cuenta que std::sort
requiere una comparación estricta de oraciones débiles , y <=
no satisface eso. Necesitaría, por ejemplo, una comparación menor que <
para K
y V
Con eso en su lugar, todo lo que necesitas es
std::vector<pair<K,V>> items;
std::sort(items.begin(), items.end());
Si realmente necesita proporcionar su propia función de comparación, entonces necesita algo en la línea de
template <typename K, typename V>
bool comparePairs(const std::pair<K,V>& lhs, const std::pair<K,V>& rhs)
{
return lhs.first < rhs.first;
}