2010-04-26 14 views
1

Je veux trier un vecteur en utilisant std :: sort, mais ma méthode de tri est une méthode statique d'une classe, et je veux appeler std :: sort en dehors de celle-ci, mais cela semble être un problème par ici.Méthode de tri C++

Sur la classe:

static int CompareIt(void *sol1, void *sol2) { ... } 

std :: appel de tri:

sort(distanceList.at(q).begin(), 
    distanceList.at(q).end(), 
    &DistanceNodeComparator::CompareIt); 

devrait-il pas possible de le faire de cette façon?

+3

Il semble que vous confondiez std :: sort et qsort. –

Répondre

0

Comme d'autres l'ont mentionné, it needs a boolean return type. Voici un exemple qui fonctionne:

#include "stdafx.h" 
#include <vector> 
#include <algorithm> 

using namespace std; 

class MyClass 
{ 
public: 
    static bool CompareIt(const void *a1, const void *a2) 
    { 
     return a1 < a2; 
    } 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    // Create a vector that contains elements of type MyData 
    vector<void*> myvector; 

    // Add data to the vector 
    myvector.push_back((void*)0x00000005); 
    myvector.push_back((void*)0x00000001); 

    // Sort the vector 
    std::sort(myvector.begin(), myvector.end(), MyClass::CompareIt); 

    // Display some results 
    for(int i = 0; i < myvector.size(); i++) 
    { 
     printf("%d = 0x%08X\n", i, myvector[i]); 
    } 

    return 0; 
} 

[Modifier] Mis à jour le code ci-dessus pour le rendre un peu plus simple. Je ne dis pas que c'est du bon code, mais sans en savoir plus sur la mise en œuvre réelle des OP, il est difficile de donner un meilleur exemple!

+0

Dans votre exemple, quel est le point d'avoir la fonction CompareIt, si c'est seulement là pour appeler dmessf

+0

Je dois dire que c'est une façon terrible de (ab) utiliser le STL. Alors qu'il est * possible * d'avoir un vecteur de «void *», c'est rarement une bonne idée de le faire. –

+0

Je voulais juste un exemple qui a clairement fonctionné comme une preuve de principe pour ce que le PO a demandé dans sa question. Bien sûr, ceci est un exemple inutile/dangereux lorsque le PO n'a pas publié tous les détails de ce qu'il est en train de résoudre. –

4

std::sort prend un comparateur qui accepte la valeur du type détenu dans la collection et renvoie bool. Il devrait généralement mettre en œuvre une certaine notion de <. Par exemple, en supposant que vos éléments de distanceList ont des collections d'entiers (je suppose qu'ils ne le font pas, mais pour le bien de l'exemple):

static bool CompareIt(int sol1, int sol2) { ... } 

Et bien sûr, il vous suffit de fournir un comparateur s'il n'y a pas déjà un opérateur < qui fait la bonne chose pour votre scénario.

1

Il devrait être une méthode booléenne (utilise l'opérateur de tri <() par défaut pour comparer les valeurs)

0

En premier lieu, le type de retour doit être bool. En fait, l'exigence est seulement que le type de retour soit assignable à bool, ce qui int est. Mais le fait que vous retourniez int suggère que vous pourriez avoir écrit un comparateur à trois voies au lieu de l'ordre strict strict requis par std :: sort.

Votre fonction CompareIt prend deux pointeurs void* comme paramètres. Est distanceList.at(q) un vector<void*> (ou un vecteur de quelque chose de convertible en void*)? Sinon, les entrées du comparateur ne sont pas correctes non plus. L'utilisation de void* avec des algorithmes suggère également que vous faites quelque chose de mal, car une grande partie du principe de la programmation générique est que vous n'avez pas besoin de pointeurs opaques qui seront ensuite restitués à leur type d'origine.

1

La fonction de comparaison que vous avez fournie a la signature de celle requise par qsort, qui est la fonction de tri fournie par C avant l'arrivée de C++. sort nécessite une fonction complètement différente.

Par exemple, si votre déclaration de distanceList est std::vector<DistanceNode> votre fonction ressemblerait à ceci:

static bool CompareIt(const DistanceNode &sol1, const DistanceNode &sol2) 
{ 
    return sol1.key < sol2.key; 
} 

Notez que le tri d'une std::list avec l'algorithme standard sort est pas efficace, ce qui explique pourquoi list fournit son propre membre sort fonction.