53 votes

trier un vecteur de structs

J'ai un vector<data> infodata est défini comme suit :

struct data{
    string word;
    int number;
};

J'ai besoin de trier info par la longueur des chaînes de mots. Existe-t-il un moyen simple et rapide de le faire ?

76voto

Oli Charlesworth Points 148744

Utilisez une fonction de comparaison :

bool compareByLength(const data &a, const data &b)
{
    return a.word.size() < b.word.size();
}

et ensuite utiliser std::sort dans l'en-tête #include <algorithm> :

std::sort(info.begin(), info.end(), compareByLength);

35voto

Murilo Vasconcelos Points 2813

Il suffit de créer une fonction/foncteur de comparaison :

bool my_cmp(const data& a, const data& b)
{
    // smallest comes first
    return a.word.size() < b.word.size();
}

std::sort(info.begin(), info.end(), my_cmp);

Ou fournir un bool operator<(const data& a) const dans votre data classe :

struct data {
    string word;
    int number;

    bool operator<(const data& a) const
    {
        return word.size() < a.word.size();
    }
};

ou non-membre comme l'a dit Fred :

struct data {
    string word;
    int number;
};

bool operator<(const data& a, const data& b)
{
    return a.word.size() < b.word.size();
}

et appeler simplement std::sort() :

std::sort(info.begin(), info.end());

6voto

James McNellis Points 193607

Oui : vous pouvez trier en utilisant une fonction de comparaison personnalisée :

std::sort(info.begin(), info.end(), my_custom_comparison);

my_custom_comparison doit être une fonction ou une classe avec une fonction operator() une surcharge (un foncteur) qui prend deux data et renvoie un bool indiquant si le premier est commandé avant le second (c'est-à-dire, first < second ). Alternativement, vous pouvez surcharger operator< pour votre type de classe data ; operator< est l'ordre par défaut utilisé par std::sort .

Quoi qu'il en soit, la fonction de comparaison doit donner une valeur ordre strict et faible des éléments.

1voto

user470379 Points 3935

Comme d'autres l'ont mentionné, vous pourriez utiliser une fonction de comparaison, mais vous pouvez également surcharger l'opérateur < et la fonction par défaut less<T> fonctionnera également :

struct data {
    string word;
    int number;
    bool operator < (const data& rhs) const {
        return word.size() < rhs.word.size();
    }
};

Alors c'est juste :

std::sort(info.begin(), info.end());

Modifier

Comme l'a souligné James McNellis, sort n'utilise pas réellement le less<T> par défaut. Cependant, le reste de la déclaration selon laquelle le less<T> fonctionnera aussi bien est toujours correct, ce qui signifie que si vous vouliez mettre struct data dans un std::map o std::set cela fonctionnerait toujours, mais les autres réponses qui fournissent une fonction de comparaison auraient besoin de code supplémentaire pour fonctionner avec l'une ou l'autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X